2

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

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

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

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

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

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

4

2 回答 2

2

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

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

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

于 2008-10-21T21:11:30.673 回答
0

有趣的问题 - 我有一个可以用 Bison、Byacc、MKS Yacc 或 Unix Yacc 编译的解析器,无论它失败还是成功,我都没有做任何特别的事情来处理重置语法。我不使用 Flex 或 Lex 标记器;那是手工编码的,但它严格使用字符串。所以,我不得不同意Gamecat;问题的最可能原因是词法分析器,而不是解析器本身。

(如果您想获得我的代码,可以从IIUG(International Informix User Group)网站下载 SQLCMD。虽然完整的产品需要 Informix ESQL/C,但语法原则上可以转换为独立的测试程序。但遗憾的是,我似乎有一段时间没有运行该测试了 - 测试编译存在一些问题。一些结构元素名称在 2006 年 4 月更改,另外还有链接问题。我需要重新组织代码以便可以再次独立测试语法。)

于 2008-10-21T22:17:07.547 回答