【编译原理复习笔记】属性文法

2024-05-25 04:52

本文主要是介绍【编译原理复习笔记】属性文法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

属性文法

也称为属性翻译文法,由 Knuth 提出,以上下文无关文法为基础
(1)为每个文法符号(终结符与非终结符)配备相关的属性,代表与该文法符号相关的信息
(2)属性文法对于每个产生式都配备了对应的语义规则,标明了语义关系的传递
在这里插入图片描述

属性的分类

综合属性

自下而上的传递信息,根据产生式右部的符号属性计算左部被定义符号的综合属性
在语法树中,即根据子节点的属性和自身的自身属性来计算父节点的综合属性

继承属性

自上而下传递信息,根据右部候选式的符号属性与左部的属性计算右部候选式中符号的继承属性
在这里插入图片描述

属性依赖

对于每个产生式 A → α A \to \alpha Aα都有对应的语义规则,每条规则的形式可以写作:
b,c1,c2 等都为标识符对应的属性
b = f ( c 1 , c 2 , . . . , c k ) b = f(c_1,c_2,...,c_k) b=f(c1,c2,...,ck)
则我们说red:属性 b 依赖于 c1,c2 等
这种依赖又分为我们所提到的综合属性或继承属性
(1)若 b 为综合属性,则 c1,c2 等为产生式右部文法符号的属性
(2)若 b 为右部某个文法符号的继承属性,则 c1,c2 可能为产生式左部或右部任何符号的属性
注意:因为终结符没有子节点,所以终结符只有综合属性,由词法分析器提供

语义规则

(1)对出现在右边的继承属性和左边的综合属性都必须提供相应的计算规则,而且只能使用相应产生式中的文法符号
(2)出现在左边的继承规则和右边的综合属性不由对应产生式的属性计算规则进行计算,而是由其他产生式的属性规则计算或者由相关参数提供

带注释的语法树

在这里插入图片描述
e.g.3*5+4n 利用第一组产生式
对于综合属性,一边自下而上分析构建语法树一边使用语义规则代入
在这里插入图片描述
由此可以得到带注释的语法分析树
对于继承属性,则先构建语法树,然后自上而下填写,对于 addtype,就是在符号表中填写其对应名字,属性对应 addtype 中后项(通常为父节点)所对应的属性
在这里插入图片描述

属性计算

语义规则的计算可以用来:产生代码/在符号表中存放信息/执行动作,blue:对输入串的翻译就是根据语义规则的计算
语法制导翻译法就是将输入串转化为合适的语法树,然后选择适合的语法规则计算属性
基于语法的语义分析方式是多样的,主要有以下三种:
(1)依赖图
(2)树遍历
(3)依赖扫描

依赖图

一颗语法树中的节点的继承属性和综合属性的依赖关系可以由依赖图来描述
若属性 b 依赖于属性 c,则从 c 有一条有向边指向属性 b
根据依赖图,如果一个属性文法不存在属性之间的循环依赖关系(环),则称则称该文法是良定义的
在这里插入图片描述

树遍历

假设语法树已建立,且树中已带有开始符号的继承属性和终结符的综合属性,此后以某种遍历顺序遍历语法树,直到最终所有属性都被计算出来
递归的调用 VisitNode 方法
在这里插入图片描述

一遍扫描

语法树需要反复使用 visitNode,属于多遍扫描,一遍扫描则是根据语法分析的过程同时计算属性值
语义规则的计算时机:
(1)自上而下分析,一个产生式匹配输入串成功时计算语义规则
(2)自下而上分析,一个产生式被归约时计算语义规则
抽象语法树:
建立表达式的抽象语法树
mknode(op,left,right)建立运算符号节点,left 和 right 分别指向左子树和右子树
mkleaf(id,entry)建立标识符节点
mkleaf(num,val)建立数节点
在这里插入图片描述

一遍扫描与自下而上的语法分析器配合工作
在这里插入图片描述

S属性文法

只含有综合属性,使用自下而上的分析器,在原本的状态-符号栈中 增加附加域存放综合属性值
假设 A → X Y Z A \to XYZ AXYZ对应的语义规则为 A . a = f ( X . x , Y . y , Z . z ) A.a = f(X.x,Y.y,Z.z) A.a=f(X.x,Y.y,Z.z)
归约时,将 X、Y、Z 的状态,符号,属性弹出,然后将 A 的状态符号属性压入栈顶

L 属性文法

L 属性文法适合一遍扫描的自上而下分析,通过深度优先地遍历语法树。对于 A → X 1 X 2 . . . X i A \to X_1X_2...X_i AX1X2...Xi,Xi 的继承属性依赖于:
(1)A 的继承属性
(2)Xi 左边符号 X1,X2 等的属性,而不包括右侧
red:S属性文法属于 L 属性文法

翻译模式

语义规则只给出了属性计算的定义,但是没有给出属性计算的先后顺序,可以在属性文法的基础上进一步给出使用顺序,就叫翻译模式
翻译模式:将语义规则与属性用花括号括起来放在合适的位置上,用来表示语法制导翻译的时机
在这里插入图片描述

注意将中缀表达式换成了后缀表达式
(1)当只需要综合属性的时候,将赋值动作放在相应产生式最右侧的末尾
T → T 1 ∗ F T . v a l : = T 1 . v a l × F . v a l T \to T_1*F\\ \\{T.val:=T_1.val\times F.val\\} TT1FT.val:=T1.val×F.val
(2)如果既有综合属性又有继承属性,在建立翻译模式时就必须保证:产生式右边符号的继承属性必须在这个符号之前计算出来
(3)一个动作不能够使用其右边的综合属性
(4)产生式左部的非终结符的综合属性必须等其所有应用的属性被计算出之后才能计算,且需要放在末尾计算

语义动作时机统一

如果能够使所有语义动作都放在产生式的末尾,就可以使每次语义执行的时机统一
方法:
(1)添加一个产生式: M → ϵ M \to \epsilon Mϵ
(2)把嵌入在产生式中间的语义动作用 M 代替,并将这个动作放在产生式 M TO EPSILON 的末尾
在这里插入图片描述

消除翻译模式的左递归

在这里插入图片描述

这里可以理解 R.i 为继承属性,R.s 为综合属性,继承属性必须放在非终结符前,所以 Ri 的语义动作都在 Ri 前,Rs 则放在产生式最后给左部赋值
在这里插入图片描述

这篇关于【编译原理复习笔记】属性文法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1000535

相关文章

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE