语义分析概述

一个源程序经过词法分析、语法分析之后,表明该源程序在书写上是正确的,并且符合程序语言所规定的语法。

但是语法分析并未对程序内部的逻辑含义加以分析,因此编译程序接下来的工作是语义分析,即审查每个语法成分的静态语义。

如果静态语义正确,则生成与该语言成分等效的中间代码,或者直接生成目标代码。

如同在进行词法分析、语法分析的同时也进行着词法检查、语法检查一样,在语义分析时也必然要进行语义检查。

  • 动态语义检查需要生成相应的目标代码,它是在运行时进行的;
  • 静态语义检查是在编译时完成的,涉及类型检查、控制流检查、一致性检查;

由于语义是上下文有关的,因此语义的形式化描述是非常困难的,目前较为常见的是用属性文法作为描述程序语言语义的工具,并采用语法制导翻译的方法完成对语法成分的翻译工作

属性文法

属性:与文法符号(终结符或非终结符)的类型和值等有关的一些信息,在编译中用属性描述处理对象的特征。

文法符号的属性可分为:

  • 继承属性

    用于“自顶向下”传递信息。

    继承属性由相应语法树中结点的父结点属性计算得到,即沿语法树向下传递,由根结点到分枝(子)结点,它反映了对上下文依赖的特性。继承属性可以很方便地用来表示程序语言上下文的结构关系。

  • 综合属性

    用于“自底向上”传递信息。

    综合属性由相应语法分析树中结点的分枝结点(即子结点)属性计算得到,其传递方向与继承属性相反,即沿语法分析树向上传递,从分枝结点到根结点。


属性文法也称属性翻译文法。

属性文法它将文法符号的语义以“属性”的形式附加到各个文法的符号上,再根据产生式所包含的含义,给出每个文法符号属性的求值规则,从而形成一种带有语义属性的上下文无关文法,即属性文法。

在上下文无关文法的基础上,为每个文法符号(终结符或非终结符)配备若干相关的“值”(称为属性)

属性代表与文法符号相关信息,如类型、值 、代码序列、符号表内容等

属性可以进行计算和传递

语义规则:对于文法的每个产生式都配备了一组属性的计算规则

语法制导翻译

语法制导翻译的方法就是为每个产生式配上一个翻译子程序(称语义动作或语义子程序),并在语法分析的同时执行这些子程序。

语义动作是为产生式赋予具体意义的手段,它一方面指出了一个产生式所产生的符号串的意义,另一方面又按照这种意义规定了生成某种中间代码应做哪些基本动作。在语法分析过程中,当一个产生式获得匹配(对于自顶向下分析)或用于归约(对于自底向上分析)时,此产生式相应的语义子程序就进入工作,完成既定的翻译任务。

语法制导翻译分为自底向上语法制导翻译和自顶向下语法制导翻译,我们重点介绍自底向上语法制导翻译。

几种常见的中间语言

抽象语法树

抽象语法树也称图表示,是一种较为流行的中间语言表示形式。

在抽象语法树表示中,每一个叶结点都表示诸如常量或变量这样的运算对象,而其它内部结点则表示运算符。抽象语法树不同于前述的语法树,它展示了一个操作过程并同时描述了源程序的层次结构。

注意:语法规则中包含的某些符号可能起标点符号作用也可能起解释作用。如赋值语句语法规则:

逆波兰表示法