野牛不解析多行

Bison not parsing multiple lines?

本文关键字:      更新时间:2023-10-16

我正在使用Bison编写C解析器。我的解析器的。y文件,当非常淡化时,看起来有点像这样:

%parse-param {YYSTYPE *root} /* Used to detect the statement/declaration type, and print the tokens back out again */
/* Tokens defined here, etc */
%start program
program : decl { *root = $1; } | 
          decl program { *root = $1; }
;
decl : INTEGER_TOKEN identifier SEMICOLON 
;

当你执行例如"int x;"时,这一切都可以正常工作,但是如果我想执行"int x;然后它会忽略第二行,并假装我只输入了"int x;"

是否有一些特殊的方式需要处理多行输入?如果您有任何建议,我将不胜感激。

很难知道您的程序实际做了什么,但是简化后的程序肯定会忽略除第一个decl之外的所有decl。考虑:

program : decl { *root = $1; } | 
          decl program { *root = $1; }
;

由于此规则是右递归的(这可能不是您想要的),它将有效地从右向左执行动作*root = $1;。也就是说,对*root的第一个赋值将是最后一个声明,随后执行的操作(对应于连续的先前声明)将覆盖该值。执行的最后一个动作对应于第一个声明,这将是放入*root的最终值。

为什么操作从右向左执行?因为操作在匹配字符串的末尾执行。在第二个非终端program被识别之后,将执行与program: decl program对应的操作,这意味着内部program的操作将已经执行。由于program的动作实际上是在处理decl,这意味着decl是向后处理的。如果您使用正常的左递归(program : program decl),则内部的program将首先执行,因此decl将从左到右处理。

相关文章:
  • 没有找到相关文章