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 协议 ,转载请注明出处!