首页 > 解决方案 > 正确输入后无法继续解析

问题描述

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

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.

标签: yacclex

解决方案


你的开始规则(事实上,你唯一的规则)是:

s: NUMBER ',' NUMBER

这意味着输入由 a NUMBER、 a','和 another组成NUMBER

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

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

或者,您可以一次解析输入一行,方法是自己读取这些行,可能使用fgetsPosix-standard getlinefunction,然后使用将每一行传递给您的扫描仪yy_scan_string


推荐阅读