レクサーとパーサーに問題があります。
まず、レクサーに次のような行があります。
"if" beginScope(stOTHER); return IF;
そして私のパーサーでは:
stmt: IF '(' exp ')' stmts
...
stmts: stmt
| '{' stmt_list '}'
| '{' '}'
そのようなコードで:
if(sth) {
dosth;
}
if(other) {
doothersth;
}
beginScope は 2 回呼び出されます。なぜなら (私が思うに) Bison はステートメントの末尾がどこにあるかわからないためです。そのため、トークンがif
見つかったとき、彼はそれをステートメントの末尾と見なし、もう一度それを読み取って開始します。他の声明...IF
if
if
私を助けてください...