我有两个输入数字,以','分隔。该程序在第一次尝试时运行良好,但在第二次尝试中始终以错误结束。如何继续解析?
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.
您的开始规则(实际上,您唯一的规则是:
s: NUMBER ',' NUMBER
这意味着输入由NUMBER
,','
和另一个NUMBER
组成。
就是这样。解析器遇到这三件事之后,它期望输入指示符结束,因为这就是您告诉它的完整输入的样子。
如果要接受多行,每行由逗号分隔的两个数字组成,则需要编写描述该输入的语法。 (并且为了描述它们是行的事实,您可能需要将换行符标记为令牌。现在,它符合扫描程序的默认规则,因为在(f)lex .
中没有匹配换行符。)您可能还希望包括error
生成,以使您的解析器不会突然因第一个错误而终止。
或者,您可以一次读取一行来解析您的输入,可以使用fgets
或Posix-standard getline
function自己读取这些行,然后使用getline
将每一行传递给扫描仪