当我尝试使用 $ 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:我使用选项 -v 正如 Chris Dodd 先生提到的那样,我在我的 .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)