我正在尝试用Bison编写一个相对简单的解析器,但是它在第一行之后停止解析。
我目前正在通过调试(-d)和(-t)运行flex和bison进行跟踪,因此我一直在关注解析器在纸上所做的事情。我还使用%error-verbose帮助捕获错误。现在的问题是,我的解析器只能处理一行。像var0 = var1 * var * var2 * var3;将工作。我对此的思考过程是:它读取一个id var0,然后读取一个等号。
此后,它将读取一系列“ op”和“ id”令牌,然后缩减为“ expr”。然后,解析器以一个令牌向前看,看到分号紧跟其后,继续解析,然后遇到换行符,然后缩减为赋值。因此,一旦堆栈分配完毕,它如何知道何时停止解析行?预期$ end是因为我的语法没有规则来处理第二行。我的解析器如何知道第一行的工作已经“结束”,并且应该独立地解析随后的数据行?
test.l
%{
# include <stdio.h>
# include "test.tab.h"
%}
%%
[a-zA-Z][a-zA-Z0-9]* {return id;}
[+\-\*\/%] {return op;}
";" {return sc;}
"\n" {return nl;};
. {return yytext[0];} /* ignore whitespace */;
%%
到目前为止,我对Bison的语法一无所知。
assign: id'='exp sc nl {printf("Test0");};
exp: id op id op id{printf("Test1");}
我应该解析每一行,然后报告错误或报告其有效,然后继续下一行。