Bison Yacc/lex结束太早,EOF/语法问题
顺便说一句,我知道这不是我所做的最好的代码,但无论如何,与问题无关 我有一个yacc/lex程序,但我只能输入一行,然后就结束了。我的意思是,我启动程序,我输入一行,然后按enter键,程序工作(显示结果,没有问题),然后我输入另一行,然后按enter键,程序不再工作,并说“错误”,程序结束。 这是预期的,因为语法规则不预期这种情况,因此,它应该在\n结束。 但我不知道如何修复它=/ 在y文件中 在l文件中 我试图用它来改变文法的开头,以便在结尾处写end时结束它。但它并没有修复它,因为结果并没有显示出来。Bison Yacc/lex结束太早,EOF/语法问题,bison,yacc,flex-lexer,eof,Bison,Yacc,Flex Lexer,Eof,顺便说一句,我知道这不是我所做的最好的代码,但无论如何,与问题无关 我有一个yacc/lex程序,但我只能输入一行,然后就结束了。我的意思是,我启动程序,我输入一行,然后按enter键,程序工作(显示结果,没有问题),然后我输入另一行,然后按enter键,程序不再工作,并说“错误”,程序结束。 这是预期的,因为语法规则不预期这种情况,因此,它应该在\n结束。 但我不知道如何修复它=/ 在y文件中 在l文件中 我试图用它来改变文法的开头,以便在结尾处写end时结束它。但它并没有修复它,因为结果
S:
e2 'E''N''D'
;
e2 : e '\n' e2 {printf("Result : %d\n",$1);}
| e {printf("Result : %d\n",$1);}
;
S:
e2'E'N'D'
;
e2:e'\n'e2{printf(“结果:%d\n',$1);}
|e{printf(“结果:%d\n”,$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'
Bison不会处理该文件,因为您不能将\n
放入Bison规则中。因此,除了粘贴实际的语法行和足够多的扫描仪定义,以便能够看到发生了什么,还有一个比“它不再工作了”更好的问题描述是很有用的。(它打电话请病假了吗?是罢工了吗?还是什么?)抱歉对这个问题的错误解释,我已经改正了,现在应该更好了。