13

ファイルの末尾に空行を置き忘れると、プログラムで構文エラーが発生します。問題は、私の文法が改行が現在の行を終了することを期待していることです。改行が存在しないため、バイソンはルールを終了しないため、構文エラーを生成します。

これを解決するにはどうすればよいですか?<<EOF>>私はリターンを試みましMY_EOFたが、レックスが恐ろしい死を遂げたとき。デフォルトの EOF には、呼び出していないコードがあると思います。それらがどのような機能であるかはわかりません。EOF を使用してエラーを作成するsymbol EOF is used, but is not defined as a token and has no rules

4

5 に答える 5

20

フレックス EOF ルールを使用して、入力に改行を追加できます。

<<EOF>> { static int once = 0; return once++ ? 0 : '\n' }
于 2009-11-22T20:45:59.497 に答える
6

あなたのlexファイルで

#define yyterminate() return token::END

yacc ファイル内

%token END 0 "end of file"
于 2009-11-19T00:58:20.260 に答える
3

実際、lex|flex でファイルの終わりをキャッチするにyywrap()は、入力ファイルの終わりに達した場合に字句解析器によって呼び出される関数を使用できます。

yywrap()このソリューションは、lex と flex の両方で利用できEOFます。

于 2011-12-20T13:45:10.073 に答える
1

以前は私にとってはうまくいきました。

C Bizon (C++ ではない) を使用する場合は、token::END と yacc ファイルで END を使用します。 %token END

その後、別の問題がありました。マクロが YY_NULL を返さない場合、終了しません (無限ループ)。

次のように解決できます。

bool term = false;
#define yyterminate() return (term = !term)?END : YY_NULL
于 2014-02-07T15:14:23.870 に答える