0

在我的 yacc 文件中,我有一个开始符号“程序”:

Program: Declaration Statements E_O_F {/*Semantic Action*/};

E_O_F 是 flex-lexer 返回的令牌,如下所示:

<<EOF>> return E_O_F;

但是当我编译我的文件时,总是在最后一行+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>>

令牌正确。请帮忙。

4

1 回答 1

4

您不需要显式返回EOF标记,并且您的语法不应该尝试检测EOF.

bison/yacc 总是创建一个隐式的开始规则:

real_start: start <<EOF>>

您的开始生产在哪里start,并且<<EOF>>是令牌类型0

此外,flex总是0在找到输入结束时返回。

EOF因此,这两件事共同作用,使您在正常的事件过程中不必担心。但是,如果您希望解析器仅解析部分输入(在这个问题中似乎并非如此),它们确实会使生活复杂化。

于 2013-11-15T15:27:30.570 回答