0

私の yacc ファイルには、次のような開始シンボル「プログラム」があります。

Program: Declaration Statements E_O_F {/*Semantic Action*/};

E_O_F は、flex-lexer によって次のように返されるトークンです。

<<EOF>> return E_O_F;

しかし、ファイルをコンパイルすると、最終行 + 1 行目で常に構文エラーが報告されます。Lex ファイル:ファイル Yacc ファイル:ファイル

入力: test.txt

a=(b);
b=c+d/e;
a=3/5-2*4;
a=a-b;
if(a>b) 
{
    a=a+1;
}

返品はしていないと思います

<<EOF>>

正しくトークンします。助けてください。

4

1 に答える 1

4

トークンを明示的に返す必要はなくEOF、文法で を検出しようとするべきではありませんEOF

bison/yacc は常に暗黙の開始ルールを作成します。

real_start: start <<EOF>>

はどこにstartあり、<<EOF>>はトークン タイプ0です。

さらに、入力の終わりを見つけると、flex常に戻ります。0

EOFしたがって、これら 2 つのことが連携して、通常のイベントの過程で心配する必要がなくなります。ただし、パーサーに入力の一部のみを解析させたい場合は、複雑になります(この質問ではそうではないようです)。

于 2013-11-15T15:27:30.570 に答える