gpt4 book ai didi

c++ - Bison 不解析多行?

转载 作者:行者123 更新时间:2023-11-28 05:29:24 26 4
gpt4 key购买 nike

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

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

最佳答案

很难知道你的程序实际上做了什么,但简化的程序肯定会忽略除第一个声明之外的所有内容。考虑:

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

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

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

关于c++ - Bison 不解析多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39861386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com