我的语法中有以下规则:
block: TLBRACE statements TRBRACE
| TLBRACE TRBRACE
;
statements: statement
| statements statement
;
statement: TIF TLPAREN expression TRPAREN TTHEN statement
| TIF TLPAREN expression TRPAREN TTHEN statement TELSE statement
| TWHILE TLPAREN expression TRPAREN statement
| TDO statement TLPAREN expression TRPAREN
| TFOR TLPAREN forinits TSEMICOLON expression TSEMICOLON expressions TRPAREN statement
| block
| declaration TSEMICOLON
| expression TSEMICOLON
;
我知道悬空的 else 问题。这就是我在语法文件顶部指定“%left TELSE”的原因。无论如何,即使我指示 Bison 优先使用 TELSE 令牌,也会产生移位/减少冲突。我还尝试删除“%left TELSE”命令(只是看看它是否有任何区别)并且没有任何变化。我总是有同样的转变/减少冲突。
我使用 Bison 的 --verbose 标志得到的输出是:
State 117
32 statement: "if" "(" expression ")" "then" statement . ["identifier", "string value", "double", "int", "lint", "message", "string", "double value", "int value", "(", "{", "}", "-", "do", "else", "for", "if", "while", "binary not"]
33 | "if" "(" expression ")" "then" statement . "else" statement
"else" shift and going to state 122
"else" [reducing with rule 32 (statement)]
$default reducing with rule 32 (statement)