顺便说一下,我知道这不是做我所做的最好的代码,而是与这个问题无关的任何事情。
我有一个yacc / lex程序,但我只能输入一行然后结束。我的意思是我启动程序,我输入一行然后按回车,程序工作(显示结果,没有问题),然后我输入另一行并按回车,它不再工作,并说“错误”,和程序结束。 这是预期的,因为语法规则不期望这种情况,因为它应该在\ n结束。 但我不知道要解决它= /
在y.file中 http://pastie.org/10517954
在l.file中 http://pastie.org/10517955
我试图改变grammmar的开头,以便在我最后写END时结束。但它没有修复它,因为结果没有显示。
S:
e2 'E''N''D'
;
e2 : e '\n' e2 {printf("Result : %d\n",$1);}
| e {printf("Result : %d\n",$1);}
;
谢谢你的帮助!
答案 0 :(得分:1)
Bison / yacc创建一个隐式的开始规则:
$start: start END
其中start
是您的开始非终端,END
是表示文件末尾的特殊标记。 (F)lex在文件末尾自动生成END。因此,无需您执行任何操作,工具将自动要求输入完全解析。
你的问题只是写出正确的重复制作。
通常,常规语言 A * 可表示为:
A':
| A' A
你要找的是( e '\ n') * 。因此,遵循上述内容,第一个近似值可能是:
prog:
| prog e '\n' { /* print $2 */ }
就个人而言,我会再添加一条规则,以允许忽略空行:
| prog '\n'