Yacc / lex结束太快,EOF /语法问题

时间:2015-10-29 19:39:25

标签: bison yacc flex-lexer eof

顺便说一下,我知道这不是做我所做的最好的代码,而是与这个问题无关的任何事情。

我有一个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);}
    ;
谢谢你的帮助!

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'