野牛文件结束

10 yacc lex bison eof

如果我忘记在我的任何文件的末尾添加一个空行,我的程序会出现语法错误.问题是我的语法期望换行结束当前行.由于新行不存在,因此bison不会生成语法错误,因为它没有完成规则.

我该如何解决这个问题?当我这样做时,我试图做出<<EOF>>回报MY_EOF但是因为一次可怕的死亡而崩溃了.我猜其默认EOF中的代码我没有打电话.我不知道它们可能是什么功能.使用EOF创建错误symbol EOF is used, but is not defined as a token and has no rules

Chr*_*odd 16

您可以使用flex EOF规则将换行符附加到输入:

<<EOF>> { static int once = 0; return once++ ? 0 : '\n' }
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果要在重入词法分析器中执行此操作,则必须使用`{static int once = 0; 返回(一次=!一次)?NEWLINE:0; 因为否则第一个文件将阻止在将来的任何调用中识别换行符. (4认同)

Dev*_*Dev 6

在你的 lex 文件中

#define yyterminate() return token::END
Run Code Online (Sandbox Code Playgroud)

在你的 yacc 文件中

%token END 0 "end of file"
Run Code Online (Sandbox Code Playgroud)