语义分析与中间代码生成器,功能是按照语义规则对语法分析器识别出的语法单位进行语义分析并把它们翻译成一定形式的中间代码。
这一阶段通常包括两方面的工作。一方面,对语法分析所识别出的各类语法单位进行静态语义检查,例如,变量是否定义、类型是否匹配等。另一方面,如果语义正确,则根据语法单位的类型分类进行处理。若为说明语句,则将变量的类型等属性填入符号表;若为可执行语句,则将其翻译为中间代码。
所谓中间代码(Intermediate Code),是指一种含义明确、便于处理的记号系统。通常具有硬件无关性,但与现代计算机的指令形式非常相似,很容易转换成特定计算机的机器指令。例如,许多编译程序采用了一种与“三地址指令”非常相似的“四元式”作为中间代码,其形式是:
(序号)(op,arg1,arg2,result)
其中,op表示运算符,arg1表示左操作数,arg2表示右操作数,result表示运算结果。与之等价的三地址指令表示如下:
result:=arg1 op arg2(www.xing528.com)
语义分析和中间代码生成阶段的工作通常穿插在语法分析过程中来完成,因此,语义分析程序通常可定义为一组语义子程序,以便语法分析器进行调用。每当语法分析器分析出一个完整的语法单位,就会调用相应的语义子程序执行分析和翻译任务。例如,当语法分析器分析完语句“$var id1,id2,id3:$real”后,就会把变量id1、id2和id3的类型real(实型)填入符号表中;当对赋值语句“id1:=id2+id3*int1”进行分析时,则会一边检查id1、id2、id3和int1是否已经定义,类型是否一致,一边生成四元式形式的中间代码序列,如表1-3所示。
表1-3 语句id1:=id2+id3*int1的中间代码
其中,T1、T2和T3是编译期间引进的临时变量;第1个四元式表示将整型数int1(60)转换为实型数(60.0)并存放于T1中;第2个四元式将id3和T1相乘后存放结果于T2中;第3个四元式将id2和T2相加后存放结果于T3中;最后1个四元式用来将T3的值赋给id1。
除了四元式之外,常见的中间代码形式还有后缀式、三元式、间接三元式以及图形表示等。语义分析依据的是语言的语义规则,通常采用属性文法予以表示,而分析方法则采用的是语法制导翻译方法,这些内容将在第6章中进行介绍。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。