私の文法には次の規則があります。
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 トークンを優先するように指示しても、shift/reduce 競合が発生します。「%left TELSE」コマンドも削除しようとしましたが (違いがあるかどうかを確認するためだけに)、何も変わりません。私は常に同じシフト/削減の競合を抱えています。
--verbose フラグを Bison に指定した場合の出力は次のとおりです。
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)