野牛文件结尾
如果我忘记在任何文件的末尾放置一个空行,我的程序就会出现语法错误。问题是我的语法期望用换行符来结束当前行。由于换行符不存在,野牛会生成语法错误,因为它没有完成规则。
我该如何解决这个问题?我尝试让 <
返回 MY_EOF
但是当我这样做时 lex 崩溃了,可怕的死亡。我猜想它的默认 EOF 中有我没有调用的代码。我不知道它们可能有什么功能。使用 EOF 创建错误使用符号 EOF,但未定义为令牌且没有规则
If I forget to put an empty line at the end of any of my files my program gets a syntax error. The problem is my grammar expects a newline to end the current line. Since a newline doesn't exist bison generates a syntax error because it does not finish the rule.
How do I solve this? I tried making <<EOF>>
return MY_EOF
BUT when I do that lex crashes a horrible death. I guess there's code in its default EOF that I am not calling. I have no idea what functions they may be. Using EOF create the error symbol EOF is used, but is not defined as a token and has no rules
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您可以使用 flex EOF 规则将换行符附加到输入:
You could use a flex EOF rule to append a newline to the input:
在您的 lex 文件中
在您的 yacc 文件中
In your lex file
In your yacc file
事实上,要捕获 lex|flex 中的文件结尾,您可以使用 yywrap() 函数,如果到达输入文件结尾,则词法分析器将调用该函数。
lex 和 flex 都可以使用此解决方案。
yywrap()
的回调指示EOF
,因此您可以重新实现此函数并在最后注入您需要执行的工作您的输入流。In fact to catch end of file in lex|flex you can use the
yywrap()
function which is called by lexical analyzer if end of the input file is reached.this solution is available by both lex and flex.the callback of
yywrap()
indicates theEOF
so you can reimplement this function and inject the work you need to do at the end of your input stream.以前的作品对我来说很好。
如果您使用 C Bizon (不是 C++),只需使用 END 作为 token::END 并在 yacc 文件
%token END
之后还有另一个问题,如果宏返回不是 YY_NULL,它永远不会终止(无限循环)
可以这样解决:
Previous works fine for me.
If you use C Bizon (not C++), just use END for token::END and in yacc file
%token END
Had another issue after that, if the macros return not YY_NULL, it never terminates (infinite loop)
It can be solved like this:
另一种方法是重组语法,使其末尾不需要换行符。只要您的语言允许空行(通常是这种情况),您就可以使用换行符作为行分隔符而不是行终止符来编写语法。
现在,如果您输入末尾确实有换行符,这会被视为换行符后面的空行,这可能没问题。
An alternative approach would be to restructure your grammar to not need a newline at the end. As long as your language allows blank lines (usually the case), you can write your grammar using newline as a line separator rather than a line terminator
Now if you do have a newline at the end of the input, this gets treated as a blank line after that newline, which is probably fine.