在我的yacc文件中,我有一个开始符号'Program‘,如下所示:
Program: Declaration Statements E_O_F {/*Semantic Action*/};
E_O_F是flex返回的令牌,如下所示:
<<EOF>> return E_O_F;
但是,当我编译我的文件时,总是会在lastline+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>>
标记正确。请帮帮忙。
发布于 2013-11-15 15:27:30
您不需要显式返回EOF
令牌,您的语法不应该试图检测EOF
。
bison/yacc总是创建一个隐式开始规则:
real_start: start <<EOF>>
其中start
是您的开始生产,而<<EOF>>
是令牌类型0
。
此外,flex
总是在找到输入结束时返回0
。
因此,这两件事一起工作,使您不必在正常的事件过程中担心EOF
。但是,如果您希望解析器只解析部分输入(在这个问题中似乎并非如此),它们会使生活复杂化。
https://stackoverflow.com/questions/19997853
复制相似问题