Semantic Analysis
语义分析 (Semantic Analysis)
语义分析主要检查程序代码语义是否正确。比如标识符是否定义、二元运算的两个操作数的类型是否合法、定义数组的大小是否大于1、函数调用语句是否传递正确的参数等等。另外,语义分析还需要为代码生成阶段收集程序信息,比如确定每一个标识符对应的意义。
实现语义分析
- Attribute Grammars
- 在 parse 阶段检查语义,只需要对输入代码 pass 一遍。
- Recursive AST Walk
- parse 结束后生成 AST,检查 AST 上检查语义,至少需要对输入代码 pass 两遍。
符号表 (Symbol Table)
符号表用来把标识符和标识符对应的实体映射起来。
- 语义分析过程中,用当前作用域内的信息更新符号表内容。
- 经典实现方案 : stack
- 符号表的基本操作:
- Push scope: 进入一个新的作用域
- Pop scope: 离开当前作用域,删除当前作用域内的定义
- Insert symbol: 添加一个符号
- Lookup symbol: 查询符号对应的描述
用 stack 实现符号表
stack 中每个元素是一个 scope ,进入 scope 的即压栈,退出 scope 即出栈。
Spaghetti Stack
这是另外一种符号表实现方法,没有出栈操作,扫描一遍后可以记录包含整个代码的符号记录。
面向对象中继承作用域
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!