Yacc/lex 结束得太早,EOF/grammar 问题
Yacc/lex ending too soon, EOF/grammar issue
顺便说一句,我知道这不是做我所做的最好的代码,但无论如何,与问题无关。
我有一个yacc/lex程序,但我只能输入一行然后就结束了。我的意思是我启动程序,我输入一行然后按回车,程序工作(显示结果,没问题),然后我输入另一行并按回车但它不再工作了,并说 "error",和程序结束。
这是意料之中的,因为语法规则不希望出现这种情况,因此,它应该以 \n 结束。
但我不知道修复它=/
在y.file
http://pastie.org/10517954
在l.file
http://pastie.org/10517955
我试图用它来改变语法的开头,以便在我最后写 END 时让它结束。但它没有修复它,因为结果没有显示。
S:
e2 'E''N''D'
;
e2 : e '\n' e2 {printf("Result : %d\n",);}
| e {printf("Result : %d\n",);}
;</pre>
感谢您的帮助!
Bison/yacc 创建以下形式的隐式开始规则:
$start: start END
其中 start
是您的开始非终端,END
是表示文件结尾的特殊标记。 (F)lex 在文件末尾自动生成 END。因此,您无需执行任何操作,这些工具将自动要求对输入进行完全解析。
你的问题只是写出正确的重复产生式。
一般来说,正则语言A*可以表示为:
A':
| A' A
而您要查找的是 ( e '\n' )*。因此,根据上述内容,第一个近似值可能是:
prog:
| prog e '\n' { /* print */ }
就我个人而言,我会再添加一条规则,以允许忽略空行:
| prog '\n'
顺便说一句,我知道这不是做我所做的最好的代码,但无论如何,与问题无关。
我有一个yacc/lex程序,但我只能输入一行然后就结束了。我的意思是我启动程序,我输入一行然后按回车,程序工作(显示结果,没问题),然后我输入另一行并按回车但它不再工作了,并说 "error",和程序结束。 这是意料之中的,因为语法规则不希望出现这种情况,因此,它应该以 \n 结束。 但我不知道修复它=/
在y.file http://pastie.org/10517954
在l.file http://pastie.org/10517955
我试图用它来改变语法的开头,以便在我最后写 END 时让它结束。但它没有修复它,因为结果没有显示。
S:
e2 'E''N''D'
;
e2 : e '\n' e2 {printf("Result : %d\n",);}
| e {printf("Result : %d\n",);}
;</pre>
感谢您的帮助!
Bison/yacc 创建以下形式的隐式开始规则:
$start: start END
其中 start
是您的开始非终端,END
是表示文件结尾的特殊标记。 (F)lex 在文件末尾自动生成 END。因此,您无需执行任何操作,这些工具将自动要求对输入进行完全解析。
你的问题只是写出正确的重复产生式。
一般来说,正则语言A*可以表示为:
A':
| A' A
而您要查找的是 ( e '\n' )*。因此,根据上述内容,第一个近似值可能是:
prog:
| prog e '\n' { /* print */ }
就我个人而言,我会再添加一条规则,以允许忽略空行:
| prog '\n'