编译原理-语法制导翻译
当归约(或推导)到某个产生式时,除了按照产生式进行相应的代换之外(语法分析),还要按照产生式所对应的语义规则执行相应的语义动作,如计算表达式、产生中间代码(语义分析参考博客:【编译原理】语法制导的语义计算——注释分析树因为综合属性只依赖于其自身或者子节点,所以可以使用自底向上的顺序对于第一点,为什么Xi的继承属性为什么不能依赖于A的综合属性,因为如果是综合属性就会产生环路父节点A的综合属性依赖于子
语法制导翻译
语法制导翻译概述
什么是语法制导翻译



语法制导翻译的基本思想
当归约(或推导)到某个产生式时,除了按照产生式进行相应的代换之外(语法分析),还要按照产生式所对应的语义规则执行相应的语义动作,如计算表达式、产生中间代码(语义分析)

SDD和SDT

SDD(语法制导定义)


SDT(语法制导翻译方案)

SDD与SDT的关系

SDD

综合属性

例子(重点:注释分析树)

继承属性

例子





补充例题
参考博客: 【编译原理】语法制导的语义计算——注释分析树





属性文法(没有副作用的SDD)

红框中的就是副作用的例子

SDD的求值顺序

依赖图


其中,综合属性写在右边,继承属性写在左边
例子


属性值的计算顺序




SL-SDD



S-属性定义与L-属性定义
S-属性定义

因为综合属性只依赖于其自身或者子节点,所以可以使用自底向上的顺序
L-属性定义

L-SDD正式定义

对于第一点,为什么Xi的继承属性为什么不能依赖于A的综合属性,因为如果是综合属性就会产生环路
父节点A的综合属性依赖于子节点的属性(i和s),如果子节点Xi的继承属性i依赖于父节点A的综合属性s,就会形成环路。故只能依赖于父节点的继承属性i


综合属性和继承属性的判别以及L-SDD的判别

对于L-SDD的判别只需要看继承属性(因为L属性定义对于综合属性没有限制,只限制继承属性)
只要继承属性不依赖于父节点的综合属性就行

语法制导翻译的应用(抽象语法树)


后缀表达式

语法制导翻译方案SDT


设计原则

将S-SDD转换成SDT

S-属性定义的SDT的实现


因为每个语义动作是放在产生是的最后,所以规约的时候才执行相应的语义动作
对应的栈操作

自底向上语法分析栈中实现桌面计算器


因为ETF三个产生式左部的值就等于产生式右部的值,不需要进行栈操作,如下:

I0遇到输入符号3(d)进入I5,将状态5和符号d入栈,d的属性值是词法分析器给的3,3入栈;
I5是归约状态, 将状态5和符号d出栈,将规约到的符号F入栈,回到I0状态,I0遇到F进入I3,将状态3入栈。
以此类推:







小结

将L-SDD转换为SDT


例子

判断LL文法,需要判断相同左部的产生式的SELECT集是否都不相交
实现的分类:递归,非递归,LR分析

L-SDT在非递归的预测分析过程中进行翻译
更多推荐


所有评论(0)