正确输入后无法继续解析

Fail to continue parsing after correct input

我有两个输入数字,用“,”分隔。 该程序在第一次尝试时运行良好,但在第二次尝试时它总是以错误结束。 我如何继续解析?

lex 文件片段:

 #include "y.tab.h"
%%
[0-9]+ { yylval = atoi(yytext); return NUMBER; }

. return yytext[0];
%%

yacc 文件片段:

%{
#include <stdio.h>
int yylex();
int yyerror();
%}
%start s
%token NUMBER
%%
s: NUMBER ',' NUMBER{
            if(( % 3 == 0) && ( % 2 == 0)) {printf("OK");}
            else{printf("NOT OK, try again.");}
            };
%%
int main(){ return yyparse(); }

int yyerror() { printf("Error Occured.\n"); return 0; }

输出片段:

benjamin@benjamin-VirtualBox:~$ ./ex1 
15,4
OK
15,4
Error Occured.

您的开始规则(实际上,您唯一的规则)是:

s: NUMBER ',' NUMBER

这意味着一个输入由一个NUMBER、一个','和另一个NUMBER组成。

就是这样。在解析器遇到这三件事之后,它期望输入结束指示符,因为这就是你告诉它的完整输入的样子。

如果您想接受多行,每行由两个用逗号分隔的数字组成,您需要编写描述该输入的语法。 (并且为了描述它们是行的事实,您可能希望将换行符设为标记。现在,它符合扫描器的默认规则,因为在 (f)lex . 中没有不匹配换行符。)您可能还想包含一个 error 产生式,这样您的解析器就不会在第一个错误时突然终止。

或者,您可以通过自己阅读这些行来一次解析您的输入,也许使用 fgetsPosix-standard getline function, and then passing each line to your scanner using yy_scan_string