zhouqijie

语法制导的翻译方案

语法制导的翻译方案是语法制导定义的一种补充。

语法制导的翻译方案(syntax-directed translation scheme, SDT)是在其产生式体中嵌入了一个程序片段的上下文无关文法。这些程序片段称为语义动作,它们可以出现在产生式体的任何地方。

使用SDT来实现两类重要的SDD:

  1. 基本文法可以用LR技术分析,且SDD是S属性的。
  2. 基本文法可以用LL技术分析,且SDD是L属性的。



## 后缀翻译方案

至今为止,最简单的实现SDD的情况是文法可以自底向上方法来分析且该SDD是S属性定义。这种情况下我们可以构造出一个SDT,其中的每个动作都放在产生式的最后,并且在规约时执行这个动作。

这种所有动作都在产生式最右端的SDT称为后缀翻译方案

后缀SDT可以在LR语法分析的过程中实现,当规约发生时执行相应的语义动作。

各个文法符号的属性值可以放在栈中的某个位置,使得执行规约动的时候可以找到它们。最好的方法是将属性和文法符号(或者代表文法符号的LR状态)一起放在栈的记录里。

如下图所示:

栈顶→ Z Z.z
  Y Y.y
  X X.x
   

SDT重写为形如下面的格式:

产生式 语义动作
E -> E1 + T {stack[top-2].val = stack[top-2].val + stack[top].val; top = top - 2;}
.. ..



产生式内部带有语义动作的SDT

动作可以放置在产生式体中的任何位置上。当一个动作左边的所有符号都被处理过后,该动作就立刻执行。

自顶向下和自底向上分析都可以用这种SDT。

注意,不是所有SDT都可以在语法分析过程中实现。

CRE:有时会发生规约规约冲突和移入规约冲突。

CRE:任何SDT都可以按照下列方法实现:先忽略语义动作,生成语法分析树后,然后再在前序遍历时执行语义动作。





其他

从SDT中消除左递归…

L属性定义的SDD/LL分析…

(详见《编译原理》p210-226)

(END)