正确输入后无法继续解析

问题描述 投票:0回答:1

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

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(($1 % 3 == 0) && ($3 % 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.
yacc lex
1个回答
0
投票

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

s: NUMBER ',' NUMBER

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

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

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

或者,您可以一次读取一行来解析您的输入,可以使用fgetsPosix-standard getline function自己读取这些行,然后使用getline将每一行传递给扫描仪

© www.soinside.com 2019 - 2024. All rights reserved.