清除野牛生成的解析器的解析器状态

时间:2008-10-21 20:45:25

标签: c++ bison flex-lexer

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

根据我的Lex& Yacc书有一个功能yyrestart(文件)。

其他(我引用了这本书的一段:

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

答案 1 :(得分:0)

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

(如果您想获取我的代码,可以从IIUG(国际Informix用户组)网站下载SQLCMD。尽管完整产品需要Informix ESQL / C,但语法原则上可以是转换成一个独立的测试程序。然而,遗憾的是,我似乎暂时没有运行该测试 - 测试编译存在一些问题。2006年4月,一些结构元素名称发生了变化,还有链接问题。我将需要重新重新组织代码,以便可以再次独立测试语法。)