语法错误后如何丢弃其余行

时间:2013-03-26 14:38:13

标签: yacc lex abstract-syntax-tree

我正在实现一个小shell,并使用lex& yacc来解析命令。 Lex从stdin读取命令,yacc在yyparse之后执行命令。

问题是,当出现语法错误时,yacc会提示错误并从开头解析。在这种情况下,cmd1 >>> cmd2导致运行cmd2因为>>>语法错误。

我的问题是如何在输入语法错误后丢弃当前命令的其余部分?

1 个答案:

答案 0 :(得分:1)

如果您想编写一个带有让用户输入表达式的提示的交互式语言,那么在整个输入流上使用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]。