【发布时间】:2013-04-24 13:24:10
【问题描述】:
我的语法中有以下规则:
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)
【问题讨论】:
-
shift/reduce 是警告,而不是错误。
-
如果我指定“%left TELSE”,我希望不会有 shift/reduce 冲突。没有任何地方写到某事是错误的。
-
使用语句的产生规则是什么?看起来您可能在语法中使用了两次标记“else”。
-
我编辑要回答的问题。
标签: if-statement compiler-construction grammar bison