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

Bison Yacc/lex结束太早,EOF/语法问题,bison,yacc,flex-lexer,eof,Bison,Yacc,Flex Lexer,Eof,顺便说一句,我知道这不是我所做的最好的代码,但无论如何,与问题无关 我有一个yacc/lex程序,但我只能输入一行,然后就结束了。我的意思是,我启动程序,我输入一行,然后按enter键,程序工作(显示结果,没有问题),然后我输入另一行,然后按enter键,程序不再工作,并说“错误”,程序结束。 这是预期的,因为语法规则不预期这种情况,因此,它应该在\n结束。 但我不知道如何修复它=/ 在y文件中 在l文件中 我试图用它来改变文法的开头,以便在结尾处写end时结束它。但它并没有修复它,因为结果

顺便说一句,我知道这不是我所做的最好的代码,但无论如何,与问题无关

我有一个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规则中。因此,除了粘贴实际的语法行和足够多的扫描仪定义,以便能够看到发生了什么,还有一个比“它不再工作了”更好的问题描述是很有用的。(它打电话请病假了吗?是罢工了吗?还是什么?)抱歉对这个问题的错误解释,我已经改正了,现在应该更好了。