我正在使用Flex生成的C词法分析器和Bison生成的C ++解析器。我修改了解析器以仅接受字符串输入。
我在循环中调用解析器函数yyparse()
,并逐行读取用户输入。如果输入是“退出”,我会停止循环。
我面临的问题是,当输入与任何规则都不匹配时,解析器会突然停止,并且在下一次迭代开始时处于相同状态,期望停止的规则(由于语法错误)完成。
如果输入有效并且与解析器规则匹配,则它可以正常工作。
在语法错误上,我重新定义了yyerror()
函数,它显示了一条简单的错误消息。
当输入与任何解析器规则不匹配时,如何清除解析器的状态,以便在下一次迭代时解析器重新启动?
答案 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月,一些结构元素名称发生了变化,还有链接问题。我将需要重新重新组织代码,以便可以再次独立测试语法。)