5

レクサーとパーサーに問題があります。

まず、レクサーに次のような行があります。

"if"    beginScope(stOTHER); return IF;

そして私のパーサーでは:

stmt: IF '(' exp ')' stmts
...
stmts: stmt
       | '{' stmt_list '}'
       | '{' '}'

そのようなコードで:

if(sth) {
    dosth;
}

if(other) {
    doothersth;
}

beginScope は 2 回呼び出されます。なぜなら (私が思うに) Bison はステートメントの末尾がどこにあるかわからないためです。そのため、トークンがif見つかったとき、彼はそれをステートメントの末尾と見なし、もう一度それを読み取って開始します。他の声明...IFifif

私を助けてください...

4

1 に答える 1

1

Zack がコメントで述べたようにbeginScope、パーサー アクションから呼び出す必要があります。

stmt: IF { beginScope(stOTHER); } '(' exp ')' stmts
于 2013-02-28T06:16:04.893 に答える