c++ - 清除 Bison 生成的解析器的解析器状态

标签 c++ bison flex-lexer

我正在使用 Flex 生成的 C 词法分析器和 Bison 生成的 C++ 解析器。我修改了解析器以仅接受字符串输入。

我在循环中调用解析器函数 yyparse(),并逐行读取用户输入。如果输入是“退出”,我将停止循环。

我面临的问题是,当输入与任何规则都不匹配时,解析器会突然停止,并在下一次迭代时以相同状态开始,期望停止的规则(由于语法错误)完成。

如果输入有效并匹配解析器规则,它会正常工作。

关于语法错误,我重新定义了 yyerror() 函数,它显示一条简单的错误消息。

当输入不匹配任何解析器规则时,如何清除解析器的状态,以便在下一次迭代时解析器重新启动?

最佳答案

根据我的 Lex & Yacc 书,有一个函数 yyrestart(file) 。

否则(我引用了书中的一段话:

这意味着您不能仅通过调用 yylex() 来重新启动词法分析器。您必须使用 BEGIN INITIAL 将其重置为默认状态,丢弃由 unput() 缓冲的任何输入文本,并以其他方式进行安排,以便对 input() 的下一次调用将开始读取新输入。

关于c++ - 清除 Bison 生成的解析器的解析器状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/223445/

相关文章:

c++ - 使用BMI计算器在C++中四舍五入数字的问题

c++ - Qt中如何列出继承自QObject的类的所有成员变量?

c++ - 如何在 Clang 中使用 C++ 模块?

c - 如何在 GCC -> C 中将 flex 和 bison 文件输出链接在一起

c++ - Bison/柔性 : print erroneous line

c++ - 使用 flex 和 bison 进行乘法解析

c++ - 在 parallel_for 循环中为每个线程分配内存

c - 如何在 flex/bison 中包含导入

bison - 柔性/Bison : Why my rule is not regonized?

c++ - 编译 flex.cc 会报错