正确输入后无法继续解析
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
产生式,这样您的解析器就不会在第一个错误时突然终止。
或者,您可以通过自己阅读这些行来一次解析您的输入,也许使用 fgets
或 Posix-standard getline
function, and then passing each line to your scanner using yy_scan_string
我有两个输入数字,用“,”分隔。 该程序在第一次尝试时运行良好,但在第二次尝试时它总是以错误结束。 我如何继续解析?
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
产生式,这样您的解析器就不会在第一个错误时突然终止。
或者,您可以通过自己阅读这些行来一次解析您的输入,也许使用 fgets
或 Posix-standard getline
function, and then passing each line to your scanner using yy_scan_string