结构合法之后继续检查

一个表达式可以符合文法,却使用了未定义变量或不允许的类型组合。语义分析利用语言规则检查这些问题,把“怎样组成”与“这种组成是否允许”区分开来。

静态类型检查是许多语言中的主要工作,但检查内容取决于语言设计。分析还可补充表达式类型、声明对应关系或数据布局等资料,让代码生成不必从零重新推断。

参考:[1]

名字需要所在环境

遍历AST时,遇到一个变量名,必须知道当前有哪些声明可见、各自类型是什么。符号表或其他上下文结构保存这些对应,进入和离开作用域时再按语言规则更新。

Cornell课程比较了哈希表栈、持久搜索树以及带更新日志的哈希表等实现。它们能表达类似的名字环境,却对查询、作用域退出和保留旧上下文产生不同成本;语义规则与存储办法不能混为一谈。

参考:[1]

已检查条件不覆盖一切错误

语义信息可以附在原树节点上,形成带类型等标注的表示,也可保存在独立结构里。成功完成这些检查,说明程序满足这一阶段实际检查的条件。

文件是否存在、某个输入会不会越界,以及程序是否完成业务目标,仍可能取决于运行状态或其他分析。不能把“没有静态语义错误”扩张成“没有任何错误”,也不能把程序语言语义与自然语言的所有含义混同。

参考:[1] [2]