编译原理ppt4_4
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.3.4 用综合属性代替继承属 性——改写基础文法
例:Pascal语言的说明语句
D→L:T T→integer | char L→L,id | id 改写成 D→id L L→,id L | :T T→integer | char
D→id L L→,id L1 L→:T T→integer T→char
产 生 式 S → LB L→ε B → B1 MB2 M→ε B → B1 sub NB2 N→ε B → text
代 val[ntop] := 10
码
段
val[ntop] := val[top] val[ntop] := max(val[top−2], val[top]) val[ntop] := val[top−1] val[ntop]:= disp (val[top−3], val[top] ) val[ntop] := shrink(val[top−2]) val[ntop] := val[top] × val[top−1]
改写后的翻译方案
产生式 S→aAC S→aABMC C→c M→ε 语义规则 b C.i:=A.s M.i:=A.s;C.i:=M.s C.s:=g(C.i) M.s:=M.i S b A s A
S
.
s
B
.
i
C
B i
M s
ε
C i
例,EQN的翻译方案 S→ { B.ps:=10 } B {S.ht:=B.ht} B→ { B1.ps:=B.ps} B1 {B2.ps:=B.ps} B2 { B.ht:=max(B1.ht,B2.ht) } B→ {B1.ps:=B.ps } B1 sub {B2.ps:=shrink(BLeabharlann Baidups)} B2 {B.ht:=disp(B1.ht,B2.ht)} B→ text {B.ht:=text.h*B.ps}
4.4.2 分析栈中的继承属性—— 利用复写规则
分析栈中的继承属性:利用复写规则使得在需 要用到继承属性的地方用综合属性来代替 例:A→XY → X有综合属性s,Y有继承属性i,如果Y.i:=X.s, 则可以在需要Y.i的值的地方使用X.s的值
例如:翻译方案 D→T {L.in:=T.type} L T →int {T.type :=integer} T →real {T.type :=real} L →{ L1.in :=L.in } L1,id {addtype(id.entry,L.in)} L →id {addtype(id.entry,L.in)}
{enter(id.entry,L.type)} {enter(id.entry,L1.type); L.type=L1.type } {L.type=T.type} {T.type=integer} {T.type=char}
4.4 L属性的自下而上计算
引入标记非终结符:从翻译方案中去掉嵌入在 产生式中间的动作 复写规则 综合考虑标记非终结符和复写规则:模拟继承 属性的计算 改写文法:用综合属性代替继承属性
4.4.1 删除嵌入在翻译方案中的 动作——引入标记非终结符
从翻译方案中去掉嵌入在产生式中间的动作: 使所有嵌入的动作都出现在产生式的末尾 转换方法:在基础文法中加入新的产生式,这 种产生式的形式为M→ε (M M→ε (M为新引入的一个标 记非终结符),将嵌入在产生式中的每个语义 动作用不同的标记非终结符M代替,并把这个 动作放在产生式M→ε 的末尾
例:
E→TR R→+T{ print('+')}R1 | -T { print('-')}R1 | ε T→num { print(num.val) }
转换为
E→TR R→+TMR1 | -TNR1 | ε T→num { print(num.val) }
M→ε { print('+')} N→ε { print('-')}
引入标记非终结符 产 生 式 S → LB L→ε B → B1 MB2 M→ε B → B1 sub NB2 N→ε B → text 语 义 规 则 B.ps := L.s; S.ht := B.ht L.s := 10 B1.ps := B.ps; M.i := B.ps; B2.ps := M.s;B.ht := max(B1.ht, B2.ht ) M.s := M.i B1.ps :=B.ps; N.i := B.ps; B2.ps := N.s; B.ht := disp (B1.ht, B2.ht ) N.s := shrink(N.i) B.ht := text.h × B.ps
改写后的翻译方案
产生式 D→TL T→int T→real L→L,id L→id 代码段 val[top]:=integer val[top]:=real addtype(val[top],val[top-3]) addtype(val[top],val[top-1])
4.4.3 模拟继承属性的计算
考虑real p,q,r的自下而上的分析过程
输入串 real p,q,r p,q,r p,q,r ,q,r ,q,r q,r ,r ,r 状态 real T Tp TL TL, TL,q TL 所用产生式
T→real L→id
L→L,id
r r
TL, TL,r TL D
L→L,id D→TL
每次L的右部被归约时,T恰好在这个右部的下 面,由复写规则L.in:=T.type,可以在需要L.in 的地方使用T.type来代替
例:以下翻译方案
产生式 S→aAC S→aABC C→c 语义规则 C.i:=A.s C.i:=A.s C.s:=g(C.i)
当通过C→c进行归约时,C.i的值可能在val[top-1] 也可能在val[top-2] 对于产生式S→aABC ,在C的前面引入一个标记 非终结符M,使得C.i的值只会出现在val[top-1]