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'