【问题标题】:Questions about Syntax Directed Translation and Bison Parser关于语法定向翻译和 Bison Parser 的问题
【发布时间】:2016-08-19 05:19:30
【问题描述】:

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

link 这么说

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

而且在book 的第 5 章(语法定向分析)中说

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

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

Flex and Bison一书中查看简单解析器的以下翻译规则sn-p

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

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

【问题讨论】:

标签: parsing bison semantic-analysis


【解决方案1】:

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

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

与您的 Dragon book 示例 sn-p 对应的野牛 sn-p 将类似于:

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

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

【讨论】:

    猜你喜欢
    • 2011-06-16
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 2014-05-14
    • 2014-11-04
    • 2012-09-08
    相关资源
    最近更新 更多