【问题标题】:Bison syntax error from nowhere [closed]野牛语法错误无处不在[关闭]
【发布时间】:2016-04-11 02:55:15
【问题描述】:

我正在使用 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";}   

【问题讨论】:

  • 您在哪一行进行小代码更改?有什么变化?
  • 您需要提供比这更多的信息,因为我们没有人能在您的肩膀上阅读。如果您希望得到有意义的建议,请添加您的parser.y 的相关部分。
  • 请不要减我。这是一个非常奇怪的问题,我不明白为什么会这样。它没有帮助我。我更新了问题

标签: c parsing syntax-error bison flex-lexer


【解决方案1】:

我觉得像

b := 5 + a;

将执行归约

{ params[counter] = gen_variable($1,counter); counter++; }

三次。

但你声明:

int params[2];

所以第三次,你将覆盖内存的一些随机部分,之后几乎任何事情都可能出错。

动态数据结构并不难写。静态内存分配几乎总是会给你带来麻烦。 编辑评论>

【讨论】:

  • 为什么 yyerror() 返回语法错误呢?你的意思是它只是随机的,因为静态内存出了问题?
  • @Dago:一旦你覆盖了不属于你的内存,任何事情都可能发生。我不知道为什么会发生这种特殊的事情。您损坏了 yyparse 中的一些内部变量,因此解析器无法正常工作。
  • 好的。我会尽快检查。