我正在使用 FLEX 和 Bison 编写一个编译器。 作为输入,我有一个简单的程序。
DECLARE
a b
IN
GET a;
b := 5 + a;
a := b + 3;
END
在我的parser.y
我正在使用整数辅助变量 counter
当我给它分配零时,我得到 syntax error
我不知道为什么这个小小的改变会让我的程序崩溃。与syntax!
无关我很感激那些有 C 和 Bison 经验的人,他们可以告诉我问题出在哪里。如果这个变量没有被触及或者被赋予不同的值,它就可以正常工作。预先感谢您。
编辑: 一些解析器代码:语法的一部分。如果我不触摸计数器,它就会工作。
%{
int counter = 0;
int params[2];
char* EXP = "NONE";
%}
%%
command : identifier ASSGNOP expression';' {gen_code(EXP,params,$1); counter = 0; }
value | identifier { params[counter] = gen_variable($1,counter); counter++; }
expression | value '+' value {EXP = "ADD";}
最佳答案
在我看来就像
b := 5 + a;
将执行减少
{ params[counter] = gen_variable($1,counter); counter++; }
三次。
但你声明:
int params[2];
因此,第三次,您将覆盖内存的某些随机部分,之后几乎任何事情都可能出错。
<社论评论> 动态数据结构并不难编写。静态内存分配几乎总是会给你带来麻烦。 编辑_评论>
关于c - 不知从何而来的 Bison 语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34642923/