解析多行

时间:2019-05-02 05:48:44

标签: bison flex-lexer yacc lex

我正在尝试用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");} 

我应该解析每一行,然后报告错误或报告其有效,然后继续下一行。

0 个答案:

没有答案