我正在使用 Flex 生成的 C 词法分析器和 Bison 生成的 C++ 解析器。我修改了解析器以仅接受字符串输入。
我在循环中调用解析器函数 yyparse()
,并逐行读取用户输入。如果输入是“退出”,我将停止循环。
我面临的问题是,当输入与任何规则都不匹配时,解析器会突然停止,并在下一次迭代时以相同状态开始,期望停止的规则(由于语法错误)完成。
如果输入有效并匹配解析器规则,它会正常工作。
关于语法错误,我重新定义了 yyerror()
函数,它显示一条简单的错误消息。
当输入不匹配任何解析器规则时,如何清除解析器的状态,以便在下一次迭代时解析器重新启动?
最佳答案
根据我的 Lex & Yacc 书,有一个函数 yyrestart(file) 。
否则(我引用了书中的一段话:
这意味着您不能仅通过调用 yylex() 来重新启动词法分析器。您必须使用 BEGIN INITIAL 将其重置为默认状态,丢弃由 unput() 缓冲的任何输入文本,并以其他方式进行安排,以便对 input() 的下一次调用将开始读取新输入。
关于c++ - 清除 Bison 生成的解析器的解析器状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/223445/