complier-Learning-语法制导的语义计算
语法制导的语义计算无法通过本章的引言建立基础概念。
仅知本章介绍两种重要的语义计算模型:属性文法和翻译模式。
属性文法是一种基本的语义计算模型,适用于对一般原理的理解。翻译模式是面向实现的语义计算模型,有助于理解语法制导的语义计算程序的自动构造方法。
基于属性文法的语义计算
属性文法的基本概念
在文法G[S]的基础上,为文法符号关联有特定意义的属性,并为产生式关联相应的语义动作或条件谓词,称之为属性文法,并称文法G[S]是这一属性文法的基础文法。以下是一个基于G[S]的一个属性文法:
文法符号的属性可用来刻画与该文法符号关联的任何特定意义的信息,如值、名字串、类型、偏移地址、代码片段等。
每个产生式$A\rightarrow a$都关联一个语义计算规则的集合。
语义计算规则的一般形式是:$b:=f(c_1,c_2,···,c_k)$
其中,$b,c_1,c_2,···,c_k$对应产生式中某些文法符号的属性。f是用于描述如何计算属性值的函数,或称为语义函数。
综合属性:对关联于产生式$A\rightarrow\alpha$的语义动作$b:=f(c_1,c_2,···,c_k)$,如果b是A的某个属性,则称b是A的一个综合属性。
继承属性:对关联于产生式$A\rightarrow\alpha$的语义动作$b:=f(c_1,c_2,···,c_k)$,如果b是产生式右部某个文法符号X的某个属性,则称b是文法符号X的一个继承属性。
遍历分析树进行语义计算
S-属性文法和L-属性文法
只包含综合属性的属性文法称为S-属性文法。
L-属性文法既可以包含综合属性,也可以包含继承属性,但要求产生式右端某文法符号的继承属性的计算只取决于该符号左边符号的属性。对于产生式左部的符号,只能是继承属性。
基于翻译模式的语义计算
翻译模式是适合语法制导语义计算的另一种描述形式。在形式上类似于属性文法,但允许由{}括起来的语义动作出现在产生式右端的任何位置,以此显示地表达属性计算的次序。
类似于属性文法的情形,设计翻译模式时也需要进行某些限定以确保每个属性值在一个单遍的语义计算过程中被访问到的时候已经存在。此处讨论两类受限的翻译模式:
- S-翻译模式 仅涉及综合属性的情形。通常将语义动作集合置于相应产生式右端的末尾。
- L-翻译模式 既可以包含综合属性,也可以包含继承属性。需要满足两个条件:产生式右端某个符号继承属性的计算必须位于该符号之前,其语义动作不访问位于它右边符号的属性,只依赖该语义动作左边符号的属性(对于产生式左部的符号,只能是继承属性);产生式左部非终结符的综合属性的计算只能在所用到的属性都计算出来之后进行,通常将相应的语义动作置于产生式的尾部。
基于S-翻译模式的语义计算
S-翻译模式形式上与S-属性文法是一致的,可以采用同样的语义计算方法。即自底向上分析过程。
基于L-翻译模式的自顶向下语义计算
将L-翻译模式描述的语义计算融入到LL(1)预测分析过程中。
基于L-翻译模式的自底向上语义计算
L-翻译模式中既有继承属性也有综合属性。综合属性是自底向上传递信息的。
如果L-翻译模式中不包含继承属性,就可采用自底向上的语义计算。
此时,只需处理好嵌入在产生式中间的语义动作:因为语义计算程序仅在规约时执行。
一种处理方法是:引入新的非终结符N和产生式$N\rightarrow\epsilon$;并把嵌入在产生式中间的语义动作用非终结符N代替,并将该语义动作集放在产生式$N\rightarrow\epsilon$后面。
question:限制没有继承属性的L-翻译模式还叫L-翻译模式吗?