📜  语法定向翻译中的 S – 属性和 L – 属性 SDT(1)

📅  最后修改于: 2023-12-03 14:57:42.911000             🧑  作者: Mango

语法定向翻译中的 S – 属性和 L – 属性 SDT

什么是语法定向翻译?

语法定向翻译(Syntax-Directed Translation)是一种将输入的源代码转换为目标代码的技术。它通过基于源代码的语法结构,并结合翻译规则来执行翻译过程。

S – 属性语法定向翻译 (S-Attributed SDT)

S-属性语法定向翻译是一种直译形式的语法定向翻译。它使用属性来记录或传递语法树节点的信息,并且属性的计算可以通过树遍历的方式进行。在S-属性SDT中,属性的计算只依赖于节点的子树。

HTML table: |属性|描述| |-|-| |继承属性|一个节点的属性值可以通过上层节点的属性来计算。| |合成属性|一个节点的属性值可以通过下层节点的属性来计算。| |继承-合成属性|既依赖于上层节点的属性,也依赖下层节点的属性。|

S-属性语法定向翻译可以用来执行简单的语义动作,例如类型检查、计算常量表达式等。下面是一个示例的S-属性语法定向翻译的规则集合:

E → E + T { E.val = E1.val + T.val }
E → T { E.val = T.val }
T → T * F { T.val = T1.val * F.val }
T → F { T.val = F.val }
F → ( E ) { F.val = E.val }
F → id { F.val = symbolTable.lookup(id) }
L-属性语法定向翻译 (L-Attributed SDT)

L-属性语法定向翻译是一种增强形式的语法定向翻译。它使用属性来记录或传递语法树节点的信息,并且属性的计算可以通过树遍历的方式进行。在L-属性SDT中,属性的计算可以依赖于节点的父节点、左兄弟节点和右兄弟节点。

L-属性语法定向翻译相比S-属性语法定向翻译更加强大,可以处理更复杂的语义动作。值得注意的是,L-属性SDT的属性计算顺序要满足依赖规则,通常需要进行多次树遍历以满足属性的计算依赖关系。

下面是一个示例的L-属性语法定向翻译的规则集合:

E → T { E.inh = T.val }
E' → + T { E'.inh = E.inh + T.val }
E' → ε { E'.inh = E.inh }
T → F { T.inh = F.val }
T' → * F { T'.inh = T.inh * F.val }
F → ( E ) { F.inh = E.inh }
F → id { F.inh = symbolTable.lookup(id) }
总结

S-属性语法定向翻译和L-属性语法定向翻译是语法定向翻译的两种常见形式。它们使用属性来记录和传递语法树节点的信息,并通过树遍历的方式进行属性计算。S-属性SDT适用于简单的语义动作,而L-属性SDT更适合处理复杂的语义动作。在实际编译器的设计和实现中,语法定向翻译是一个重要的技术手段之一,可以帮助程序员将源代码转换为目标代码。