5 Semantic Analysis¶
注:ppt还没发,很多图片都还没插上 广义的语义分析:只要超越语法、涉及语义的所有分析、生成;
狭义的语义分析:
- 通过AST确定一些静态属性:
- type
- scope
- 把AST翻译成一些中间表示
5.1 符号表 Symbol Table¶
- Binding - 维护一个
<Name/Symbol, Meaning/Attribute>
的映射 - Environment - Binding的集合
- 环境更新的例子://todo - [img1 - 例子]
- 如果有重名的情况,会采取覆盖操作
- 退出对应scope之后,相应的环境会被丢弃
- 环境更新的例子://todo - [img1 - 例子]
- Symbol Table - 环境的集合
5.1.1 实现方式¶
由于复杂的优先级和覆盖关系,所以简单的哈希表不好实现。
需要实现的函数(interface):
- insert - 插入一个符号并且实现覆盖关系
- lookup - 在符号表中查询当前的符号
- enter - 进入一个scope
- exit - 退出一个scope
实现方式分类:
- 命令式 - 有了新的就看不到老的,但是退出scope的时候还能回得去
- 函数式 - 每次发生变化的时候老的都还保留着,\(O(1)\)恢复到任意新老状态
1 - 命令式
定义:
单个哈希表(存储所有变量绑定的字典)+一个scope栈
实现:
// todo [img2 - python代码实现]
举例:
// todo [img3 - 使用哈希表和stack实现的例子]
2 - 函数式
基本思想:在创建新的环境的时候,保留旧环境的表格,直接新建一个表格,方便快速“回退” - 不可变数据结构思想
使用BST作为底层数据结构,在插入的时候使用路径复制技术,避免完全拷贝。
// todo [img4 - BST的实现方式]
3 - 两种实现方式的对比
// todo [img5 - 实现方式的对比图]
5.2 类型检查 Type Checking¶
5.2.1 类型及其作用¶
- 开发效率:更高层次的编程抽象
- 运行性能:类型指导的编译优化
- 安全可靠:内存安全乃至功能正确