在下面这个极其简单的例子中,我想用一个单一的语言阅读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 被读取了两次,我认为这就是程序不接受我的输入语言的原因。我的问题是,为什么 EOF 被读取两次,我该如何阻止它?
此外,在没有 EOF 规则的情况下执行上述操作会导致输入,例如
abbbb
打印“接受”消息,但由于输入过多而立即失败。我想要的只是通过或失败,这就是为什么我试图使用 EOF 来验证我会得到一个结果。