c - 不知从何而来的 Bison 语法错误

标签 c parsing syntax-error bison flex-lexer

我正在使用 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/

相关文章:

javascript - 内联 javascript 函数调用 - 元素列表后缺少 ]

objective-c - 解析 Objective-C printf 格式字符串?

python - 以任何顺序和数字处理一系列 pyparsing 表达式

Java飞行记录器以编程方式解析

c++ - C++中的前缀递归表示法

syntax-error - 如何在pari/gp中将intmod转换为int?

google-apps-script - 使用 Google Apps 脚本中的 YouTube Data API v3 从播放列表中删除视频

c - 如何使带字符的开关盒工作?

c - 初学者 C : error: control reaches end of non-void function?

c++ - 查找存储在内存中的值 C/C++