0

我对语法定向翻译和使用 Bison 编写的解析器感到困惑。(主要的困惑是用 Bison 编写的解析器是否已经包含语法定向翻译器。)我将括号中的上述句子改写为(Bison 如何实现语法定向翻译,是否通过附加例如 $$ = $1 + $3)

这个链接

动作中的C代码可以通过$n结构引用规则匹配的组件的语义值,$n代表第n个组件的值。正在构造的分组的语义值是 $$。(当 Bison 将动作复制到解析器文件中时,Bison 会将这两种结构都转换为数组元素引用。)

而且在本书的第 5 章(语法导向分析)中说

语法 + 语义规则 = 语法定向翻译

PRODUCTION          SEMANTIC RULE
 →1 +           {. = 1. ┤| . |′+′}

查看Flex 和 Bison一书中简单解析器的以下翻译规则片段时

%%
E:  F default $$ = $1
        | E ADD F { $$ = $1 + $3; }
        | E SUB F { $$ = $1 - $3; }
    ;
%%

是不是.code等于让$$我很迷茫。语法导向分析与语义分析相同吗?我越读越困惑。有人请帮我解决这个问题。

4

1 回答 1

0

您的理解似乎是正确的,但是由于 Dragon 书中的示例和示例解析器正在做两件不同的事情这一事实感到困惑——Dragon 书正在将表达式翻译成代码,而简单解析器正在评估表达式,而不是翻译 (所以这真的是语法指导的评估,而不是语法指导的翻译)。

在龙书描述的语义规则中,符号可以有多个属性,既可以合成也可以继承。这就是.code后缀的含义——它是它所应用的符号的属性。另一方面,Bison 允许每个符号具有单个合成属性——不再有,也没有继承属性。如果你想要多个属性,你可以将它们聚集成一个struct并将其用作你的属性(需要一些仔细的管理)。如果你想要继承的属性,你可以使用$0甚至更仔细的管理,或者你可以使用全局变量来获得相同的效果。

与您的 Dragon book 示例片段相对应的野牛片段将类似于:

E : E ADD F { $$ = AppendCode($1, $3, PLUS); }

对属性使用单个野牛属性,并对.code作为函数生成的代码执行附加操作。

于 2016-04-25T23:37:07.437 回答