语义分析(Semantic Analysis)
做完了词法分析、语法分析,编译器接下来做的工作是语义分析。
词法分析是把程序分割成一个个 Token 的过程,可以通过构造有限自动机来实现。 语法分析是把程序的结构识别出来,并形成一棵便于由计算机处理的抽象语法树。可以用递归下降的算法来实现。 语义分析是消除语义模糊,生成一些属性信息,让计算机能够依据这些信息生成目标代码。
语义分析就是要让计算机理解我们的真实意图,把一些模棱两可的地方消除掉。
因为计算机语言的语义一般可以表达为一些规则,你只要检查是否符合这些规则就行了。比如: 某个表达式的计算结果是什么数据类型?如果有数据类型不匹配的情况,是否要做自动转换? 如果在一个代码块的内部和外部有相同名称的变量,我在执行的时候到底用哪个? 就像“我喜欢又聪明又勇敢的你”中的“你”,到底指的是谁,需要明确。 在同一个作用域内,不允许有两个名称相同的变量,这是唯一性检查。你不能刚声明一个变量 a,紧接着又声明同样名称的一个变量 a,这就不允许了。
语义分析工作的某些成果,会作为属性标注在抽象语法树上,比如在 age 这个标识符节点和 45 这个字面量节点上,都会标识它的数据类型是 int 型的。 此文章为3月Day22学习笔记,内容来源于极客时间《gk.link/a/1209L》