野牛不解析多行?

时间:2016-10-04 20:41:21

标签: c++ c bison yacc lex

我正在使用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 y"然后它将忽略第二行,并假装我只输入" int x;"

您需要处理多行输入的特殊方法吗?如果你有任何建议,将不胜感激。

1 个答案:

答案 0 :(得分:1)

很难知道你的程序实际上做了什么但是减少的程序肯定会忽略除了第一个decl之外的所有程序。考虑:

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

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

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