跳转至

5 Semantic Analysis

注:ppt还没发,很多图片都还没插上 广义的语义分析:只要超越语法、涉及语义的所有分析、生成;

狭义的语义分析:

  1. 通过AST确定一些静态属性:
    • type
    • scope
  2. 把AST翻译成一些中间表示

5.1 符号表 Symbol Table

  • Binding - 维护一个<Name/Symbol, Meaning/Attribute>的映射
  • Environment - Binding的集合
    • 环境更新的例子://todo - [img1 - 例子] image-20250320152120880
    • 如果有重名的情况,会采取覆盖操作
    • 退出对应scope之后,相应的环境会被丢弃
  • 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 类型及其作用

  • 开发效率:更高层次的编程抽象
  • 运行性能:类型指导的编译优化
  • 安全可靠:内存安全乃至功能正确

5.2.2 Tiger类型系统

5.2.3 类型检查案例