《Engineering a Complier》学习笔记(四)
Context-Sensitive Analysis
1. 概述
假设语义分析已经识别出来了这么一个名词x,上下文敏感性分析需要解决以下几个问题:
(1)x存放什么类型的值
(2)x有多大?(占多少长度)
(3)如果x是一个函数,它返回的值是什么类型的?
(4)x的值要存在多长时间?
(5)谁要负责x的空间分配?(并初始化之)
2. 类型系统
类型系统识别并管理词语的类型,常见类型有Integer,list,character等
类型系统的意义
(1)确保系统运行安全
在大多数语言中进行程序分析时,对类型进行推断,以确定程序中每个名字的类型。
(2)提升语言表达性
一个好的类型系统会让语言的设计者用上下文无关的规则更好地表达行为,最好的例子就是对运算符进行重载。
(3)产生更好的代码
(4)类型检查
为避免程序运行时的类型检查,应在程序解析时检查其类型。
以Fortran77举例说明,式"a+b"在其类型机制如何运作。
I. 类型推断
II. 类型ILOC操作
III. 每一个name含有两个域:Value域和Tag域,Value域存储值,Tag域存储name在内存占用字节数。
如果变量存储于注册器中,其Value和Tag都需要注册器。
类型系统的组成
基础类型:
Numbers, Characters, Booleans,
复合类型:
Arrays, Strings,Enumerates, Structures, Varians, Pointers
3. 属性文法
参考:https://www.tqwba.com/x_d/jishu/171871.html
属性:语法树中一个或多个节点的“值”
属性文法由一系列规则增强的CFG构成。
形式上讲,一个属性文法是一个三元组,A=(G,V,F),一个上下文无关文法G;一个属性的有穷集V和关于属性的谓词函数的有穷集F。
考虑下面一个例子:
有如下cfg:
SBN = ( T,NT,S,P)
用来生成所有有符号数(数前必须带正负号)。它不匹配无符号数,例如10。
属性解析规则:
对-101的解析:
属性分为两种:
(1)综合属性,属性的值由其子节点所决定,自下而上
(2)继承属性,属性的值有其父节点/兄弟节点所决定,自上而下
S—属性文法:仅仅使用综合属性的属性文法
一个属性的语法规则都应含有一条规则来引用其自身的结果,从而形成一个循环。这种循环的构建可以生成一个依赖图
- 终结符只有综合属性,且由词法分析器提供
- 非终结符可以有综合属性、继承属性
- 文法开始符号的所有继承属性作为属性计算前的初始值
4. 语法制导
语法制导翻译法是由源程序的语法结构所驱动的处理方法。
举例说明语法制导如何运行:
(1)语法制导翻译的负载评估
COST初始为0,随着Parse的过程而累加
(2)表达式类型推断
(3)构建抽象语法树
表达式类型推断结束以后,假设编译器含有一个MakeNode规则,第一个参数代表操作,后面两个参数代表leaf
(4)生成表达式iloc
编译器包含4种规则来生成ILOC:
Address: 为扫描出的表达式分配一个地址
Emit: 处理不同iloc操作的具体细节
NextRegister: 返回一个新的Register,可以实现为一个全局的计数器
Value:用一个具体的数字作为其参数并返回一个计数器值
(5)对声明的处理
举例:C语言中的声明处理
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具