关于语法定向翻译和Bison Parser的问题

时间:2016-04-25 17:14:12

标签: parsing bison semantic-analysis

我对使用Bison编写的语法定向翻译和解析器感到困惑。 (主要的困惑在于,在Bison中编写的解析器是否已经由语法指导的翻译器组成。)我在括号中将上述句子改写为(Bison如何实现语法定向翻译,是否依附于Eg $$ = $ 1 + $ 3)

link表示

  

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

同样在book的第5章(语法定向分析)

  

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

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

从书中Flex and Bison

查看简单解析器的以下翻译规则片段
%%
E:  F default $$ = $1
        | E ADD F { $$ = $1 + $3; }
        | E SUB F { $$ = $1 - $3; }
    ;
%%

.code是否与$$相等?我很困惑。语法指导分析与语义分析相同吗?我读的越多,我就会感到困惑。有人请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

您的理解似乎是正确的,但是您的龙书和示例解析器中的示例正在做两件事 - Dragon书籍将表达式转换为代码,而简单的解析器正在评估表达式,不翻译(所以这实际上是语法导向的评估,而不是语法导向的翻译)。

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

与您的Dragon book示例代码段相对应的bison片段类似于:

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

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