a
以下の非常に単純な例では、単一の言語で読み取り、残りの文字が後に続かないことを保証したいと考えています。
ファイル: example.y
%{
#include <stdio.h>
#include <ctype.h>
int yylex(void);
int yyerror(char *s);
%}
%token A
%token END
%token JUNK
%% /* Grammar Rules */
accept: A END { printf("language accepted!\n"); }
;
%%
ファイル: example.in
%{
#include "ex.tab.h"
#define YY_NO_INPUT
%}
%option nounput
%%
a printf("A found\n"); return A;
<<EOF>> { printf("EOF found\n"); return END; }
. { printf("JUNK found\n"); return JUNK; }
%%
次のテスト入力ファイルを使用してこのプログラムをコンパイルおよび実行した結果:
a
次の出力が生成されます。
A found
EOF found
language accepted!
EOF found
Error: syntax error
EOF が 2 回読み取られるため、プログラムが入力言語を受け入れないのはそのためだと思います。私の質問は、EOF が 2 回読み取られるのはなぜですか?どうすれば停止できますか?
また、EOF ルールなしで上記を実行すると、次のような入力が発生します。
abbbb
「受け入れ」メッセージを出力しますが、過剰な入力のためにすぐに失敗します。私が望むのは合格か不合格のどちらかだけです。そのため、EOF を使用して 1 つの結果が得られることを確認しようとしています。