如何在语法错误后丢弃行的其余部分
问题描述:
我正在实现一个小外壳,并使用lex & yacc来解析命令。 Lex从stdin
读取命令,yacc在yyparse
后执行命令。如何在语法错误后丢弃行的其余部分
问题是,当出现语法错误时,yacc提示错误并从开始解析。在这种情况下,cmd1 >>> cmd2
导致运行cmd2
因为>>>
是语法错误。
我的问题是如何在加入语法错误后丢弃当前命令的其余部分?
答
如果您想编写一个交互式语言,并提示用户输入表达式,那么在整个输入流中简单地使用yacc是一个好主意。 Yacc可能会对某一行的内容感到困惑,然后误解后续的行。例如,用户可能在第一行有一个不平衡的括号。或一个没有关闭的字符串文字,然后yacc将继续消耗输入的后续行,寻找关闭结构。
最好从用户那里收集输入行,然后将其解析为一个单位。就Yacc而言,该行的结尾就是输入的结尾。
如果您使用lex,有许多方法可以重定向lex以从内存中的缓冲区中读取字符,而不是从FILE *
流中读取字符。寻找关于YY_INPUT
宏的文档,您可以在Lex文件中定义宏,以基本指定Lex用于获取输入字符的代码。
打个比方时间:使用使用lex/yacc的发展直接处理交互式用户输入的扫描仪就像using scanf
for handling user input一点点。然而捕获一行到一个缓冲区,然后解析它更像是使用sscanf
。报价:
解析与sscanf的字符串(只要返回值被选中),因为它是如此容易重新控制这是完全适当的,重新开始扫描,丢弃输入,如果它不匹配等[comp.lang.c FAQ,12.20]。
尝试在更高级别添加此规则:'|错误'\ n'{yyerrok; } - 参见[野牛手册](http://www.gnu.org/s/bison/manual/html_node/Simple-Error-Recovery.html)了解更多信息.. – 2013-03-26 15:52:07