语法制导翻译概述

什么是语法制导翻译

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

语法制导翻译的基本思想

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

在这里插入图片描述

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在非递归的预测分析过程中进行翻译

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐