关于 Syntax Directed Translation 和 Bison Parser 的问题
Questions about Syntax Directed Translation and Bison Parser
我对语法制导翻译和使用 Bison 编写的解析器感到困惑。 (主要的困惑是用 Bison 编写的解析器是否已经包含语法定向翻译器。)我将括号中的上述句子改写为(Bison 是如何实现语法定向翻译的,是否通过附加 for E.g. $$ = $1 + $3)
这个 link 说
The C code in an action can refer to the semantic values of the components matched by the rule with the construct $n, which stands for the value of the nth component. The semantic value for the grouping being constructed is $$. (Bison translates both of these constructs into array element references when it copies the actions into the parser file.)
而且在 book 的第 5 章(语法导向分析)中说
Grammar + Semantic rules = Syntax Directed Translation
PRODUCTION SEMANTIC RULE
→1 + {. = 1. ┤| . |′+′}
当查看书中简单解析器的以下翻译规则片段时 Flex and Bison
%%
E: F default $$ =
| E ADD F { $$ = + ; }
| E SUB F { $$ = - ; }
;
%%
.code
等同于 $$
我很困惑。语法导向分析与语义分析相同吗?我读得越多,我就越困惑。有人请帮我解决这个问题。
您的理解似乎是正确的,但您对 Dragon book 中的示例和示例解析器正在做两件不同的事情这一事实感到困惑——Dragon book 正在将表达式转换为代码,而简单解析器正在评估表达式,而不是翻译(所以这实际上是语法指导的评估,而不是语法指导的翻译)。
在龙书所描述的语义规则中,符号可以具有多个属性,既有合成的,也有继承的。这就是 .code
后缀的意思——它是它所应用的符号的一个属性。另一方面,Bison 允许每个符号具有 单个 综合属性——仅此而已,也没有继承属性。如果你想要多个属性,你可以将它们聚集在一起成为一个 struct
并将其用作你的属性(需要一些仔细的管理)。如果你想要继承的属性,你可以使用 [=13=]
甚至更仔细的管理,或者你可以使用全局变量来获得相同的效果。
与您的 Dragon book 示例片段相对应的 bison 片段类似于:
E : E ADD F { $$ = AppendCode(, , PLUS); }
对 .code
属性使用单个 bison 属性,并对作为函数生成的代码执行追加操作。
我对语法制导翻译和使用 Bison 编写的解析器感到困惑。 (主要的困惑是用 Bison 编写的解析器是否已经包含语法定向翻译器。)我将括号中的上述句子改写为(Bison 是如何实现语法定向翻译的,是否通过附加 for E.g. $$ = $1 + $3)
这个 link 说
The C code in an action can refer to the semantic values of the components matched by the rule with the construct $n, which stands for the value of the nth component. The semantic value for the grouping being constructed is $$. (Bison translates both of these constructs into array element references when it copies the actions into the parser file.)
而且在 book 的第 5 章(语法导向分析)中说
Grammar + Semantic rules = Syntax Directed Translation
PRODUCTION SEMANTIC RULE
→1 + {. = 1. ┤| . |′+′}
当查看书中简单解析器的以下翻译规则片段时 Flex and Bison
%%
E: F default $$ =
| E ADD F { $$ = + ; }
| E SUB F { $$ = - ; }
;
%%
.code
等同于 $$
我很困惑。语法导向分析与语义分析相同吗?我读得越多,我就越困惑。有人请帮我解决这个问题。
您的理解似乎是正确的,但您对 Dragon book 中的示例和示例解析器正在做两件不同的事情这一事实感到困惑——Dragon book 正在将表达式转换为代码,而简单解析器正在评估表达式,而不是翻译(所以这实际上是语法指导的评估,而不是语法指导的翻译)。
在龙书所描述的语义规则中,符号可以具有多个属性,既有合成的,也有继承的。这就是 .code
后缀的意思——它是它所应用的符号的一个属性。另一方面,Bison 允许每个符号具有 单个 综合属性——仅此而已,也没有继承属性。如果你想要多个属性,你可以将它们聚集在一起成为一个 struct
并将其用作你的属性(需要一些仔细的管理)。如果你想要继承的属性,你可以使用 [=13=]
甚至更仔细的管理,或者你可以使用全局变量来获得相同的效果。
与您的 Dragon book 示例片段相对应的 bison 片段类似于:
E : E ADD F { $$ = AppendCode(, , PLUS); }
对 .code
属性使用单个 bison 属性,并对作为函数生成的代码执行追加操作。