在我的yacc文件中,我的开头符号'Program'为:
Program: Declaration Statements E_O_F {/*Semantic Action*/};
E_O_F是flex-lexer返回的标记:
<<EOF>> return E_O_F;
但是当我编译我的文件时,在最后一行+第1行总是报告语法错误。 Lex文件:File Yacc文件:File
输入:test.txt
a=(b);
b=c+d/e;
a=3/5-2*4;
a=a-b;
if(a>b)
{
a=a+1;
}
我想我没有回复
<<EOF>>
令牌正确。请帮忙。
答案 0 :(得分:3)
您无需显式返回EOF
令牌,并且您的语法不应尝试检测EOF
。
bison / yacc始终会创建隐式启动规则:
real_start: start <<EOF>>
其中start
是您的开始作品,<<EOF>>
是令牌类型0
。
此外,flex
在找到输入结束时始终返回0
。
因此,这两件事情共同使您无需在正常的事件过程中担心EOF
。但是,如果您希望解析器仅解析部分输入(在此问题中似乎不是这样),它们会使生活复杂化。