野牛转移/减少冲突模棱两可 1.歧义:悬空其他2.几乎没有歧义:SI ... ALORS ... SINON

问题描述

当我尝试使用 $ bison --output=calcy.c -d calc.y 我收到这个消息: calc.y: 冲突: 2 shift/reduce

这是我的代码

program:DEBUT
     corps   
      FIN 
  ;
corps:liste_declaration
      liste_instruction
  ;
liste_declaration:
| declaration";"liste_declaration
;
declaration: ENTIER IDENTIFICATEUR
;
liste_instruction:
|instruction";"liste_instruction
;
instruction: IDENTIFICATEUR"="expression
| DEBUT liste_instruction FIN
| SI expression 
ALORS instruction
SINON instruction
| SI expression ALORS instruction
| TANTQUE expression FAIRE instruction
| ECRIRE liste_argument
| LIRE IDENTIFICATEUR
;
liste_argument:
| expression 
| expression ";"liste_argument
;
expression:expression"<"expression_simple
|expression">"expression_simple
|expression"=="expression_simple
|expression"!="expression_simple
|expression"<="expression_simple
|expression">="expression_simple
|expression_simple
;
expression_simple:expression_simple"+"terme
|expression_simple"-"terme
|"("expression_simple")"
|terme
|"-"terme
;
terme:terme"*"facteur
|terme"/"facteur
|terme"^"facteur
|facteur
;
facteur:IDENTIFICATEUR|NOMBRE
;

我搜索了很多,我认为这是模棱两可的原因,但我找不到它在哪里 等待你的答案伙计们!!

Edit1:我使用了 Chris Dodd 先生提到的 -v 选项,并且在我的 .output 文件中得到了这个

Grammar

    0 $accept: program $end

    1 program: DEBUT corps FIN

    2 corps: liste_declaration liste_instruction

    3 liste_declaration: /* empty */
    4                  | declaration ";" liste_declaration

    5 declaration: ENTIER IDENTIFICATEUR

    6 liste_instruction: /* empty */
    7                  | instruction ";" liste_instruction

    8 instruction: IDENTIFICATEUR "=" expression
    9            | DEBUT liste_instruction FIN
   10            | SI expression ALORS instruction SINON instruction
   11            | SI expression ALORS instruction
   12            | TANTQUE expression FAIRE instruction
   13            | ECRIRE liste_argument
   14            | LIRE IDENTIFICATEUR

   15 liste_argument: /* empty */
   16               | expression
   17               | expression ";" liste_argument

   18 expression: expression "<" expression_simple
   19           | expression ">" expression_simple
   20           | expression "==" expression_simple
   21           | expression "!=" expression_simple
   22           | expression "<=" expression_simple
   23           | expression ">=" expression_simple
   24           | expression_simple

   25 expression_simple: expression_simple "+" terme
   26                  | expression_simple "-" terme
   27                  | terme

   28 terme: terme "*" facteur
   29      | terme "/" facteur
   30      | facteur

   31 facteur: X "^" facteur
   32        | X

   33 X: "(" expression_simple ")"
   34  | "-" X
   35  | IDENTIFICATEUR
   36  | NOMBRE

这是冲突的状态

state 33

   16 liste_argument: expression .
   17               | expression . ";" liste_argument
   18 expression: expression . "<" expression_simple
   19           | expression . ">" expression_simple
   20           | expression . "==" expression_simple
   21           | expression . "!=" expression_simple
   22           | expression . "<=" expression_simple
   23           | expression . ">=" expression_simple

    ";"   shift,and go to state 53
    "<"   shift,and go to state 40
    ">"   shift,and go to state 41
    "=="  shift,and go to state 42
    "!="  shift,and go to state 43
    "<="  shift,and go to state 44
    ">="  shift,and go to state 45

    ";"       [reduce using rule 16 (liste_argument)]
    $default  reduce using rule 16 (liste_argument)

state 56

   10 instruction: SI expression ALORS instruction . SINON instruction
   11            | SI expression ALORS instruction .

    SINON  shift,and go to state 70

    SINON     [reduce using rule 11 (instruction)]
    $default  reduce using rule 11 (instruction)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)