yacc - 正确输入后无法继续解析
问题描述
我有两个用“,”分隔的输入数字。该程序第一次尝试运行良好,但第二次尝试总是以错误结束。我如何继续解析?
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
这意味着输入由 a NUMBER
、 a','
和 another组成NUMBER
。
就是这样。在解析器遇到这三件事之后,它期望输入结束指示符,因为这就是您告诉它完整输入的样子。
如果您想接受多行,每行由两个用逗号分隔的数字组成,您需要编写一个描述该输入的语法。(并且为了描述它们是行的事实,您可能希望将换行符作为标记。现在,它符合扫描仪的默认规则,因为 in (f)lex.
不匹配换行符字符。)您可能还希望包含一个error
产品,以便您的解析器不会在第一个错误时突然终止。
或者,您可以一次解析输入一行,方法是自己读取这些行,可能使用fgets
或Posix-standard getline
function,然后使用将每一行传递给您的扫描仪yy_scan_string
推荐阅读
- linux - 未找到 Bash 事件
- go - 有没有办法将地图附加到切片?
- python - 如何 Py2app DATA_FILES?
- mysql - Mysql - 在所有出现#字符之前删除数字
- apache - Apache2 通过添加标头来修改从 CIFS 安装的存储库下载的文件。文件已损坏
- amazon-web-services - 使用 SSL 将 Spring Boot 部署到 AWS EB
- vb.net - vb.net 排序列表视图后跟着色交替行不起作用
- r - 按列和行合并多个数据框
- javascript - 通过 WordPress REST API 循环浏览帖子类别 - React
- pyspark - 根据来自第二个数据帧的匹配键将列表附加到 Spark 数据帧列