一片自留地 斯坦福 CS143(编译原理)语义分析(一)

magicyang · 2021年03月06日 · 1209 次阅读

开始看第三部分,语义。

scope 作用域

和其他语言差不多,都有作用域,内部全局的概念。

类需要注意的点:

  1. 不允许嵌套
  2. 全局可见

类成员属性和其他一样。
这里类函数的内容和 java 比较类似:

符号表


简单的符号表可以通过堆栈完成:

符号表的操作和作用域强相关:

对于 class name 的校验

class 不需要定义,因此需要用一个新的 pass 扫描全局 class。
如果对编译有理解的话,pass 会有很多,而且优化也是一遍一遍的过一个一个 pass。

Types


可以理解成:int 整合数字,int 可以有一系列的操作 func,比如 +,-,*,/

类型检查只能在编译器做,到了汇编层,就没法操作了。

根据 Type 检查方式,程序语言可以分为三类:


关于静态、动态语言的优劣

现实中,静态、动态语言又会有妥协和优化:

Type 检查和 Type 推导:

Type 推导的范例:c++ 的 auto。

类型检查

常用的符号:


标准化的表示:

例子:


说明:

类型检查由 AST 构成。而且是自底向上的,由页节点一点一点向上生成。

Type Enviroment


仅仅通过 AST 有时候并不能判断出变量类型。
这里引入了 Type Enviroment 的概念:

这里引入一个 O 的假设函数:

也可以写成这样:

在作用域下的 O 可以对特定的变量做转化:

Type Enviroment 总结:

subtyping

宽约束的 let 定义:

这里类型完全一致,没有特别的地方。

宽约束 let:


T0 是 T 的继承。

assign:


可以 e1 的类型推出 x 的 type.

attr-init

条件表达式:


lub 定义:

这个词 LCA(least common ancestor),会经常用到。
条件表达式的转化:

Type function:

定义:

理解 cool 中方法的定义:

对应的表达式:

Cool 的 Type Enviroment 命名:

总结:

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册