过程:具体地说,语法分析是在记号流的基础上建立一个层次结构——建立语法树。
例子1:
X1:= ( 2.0 + 0.8 ) * C1
赋值语句的文法:
<赋值语句>→<变量><赋值操作符><表达式> <变量>→<简单标识符> <赋值操作符>→:= <表达式>→…… 例子2:
id1=id2+id3*60
语法树数据结构
? 语义分析与生成中间代码
任务:对识别出的各种语法成分进行语义分析,并产生相应的中间代码。主要工作包含
(1)完成静态语义审查和处理;(2)上下文相关性审查;(3)类型匹配审查;(4)类型转换。
中间代码:一种介于源语言和目标语言之间的中间语言形式。编译程序设计者可以自己设计,常用的有四元式、三元式、逆波兰表示等。
四元式:四元式实际上是一种“三地址语句”的等价表示。它的一般形式为:
(op,arg1,arg2,result)
其中,op为一个二元 (也可是一元或零元)运算符;arg1,arg2分别为它的两个运
算 (或操作)对象,它们可以是变量、常数或系统定义的临时变量名;运算的结果将放入result中。四元式还可写为类似于PASCAL语言赋值语句的形式:result ∶= arg1 op arg2。
例子1:
position = initial + rate * 60
例子2:
X1:= ( 2.0 + 0.8 ) * C1
运算符左运算对象右运算对象结果 (1) + 2.0
0.8
T1
T2
(2) * T1 (3) := X1
T2
C1
其中T1和T2为编译程序引入的工作单元 四元式的语义为: 2.0 + 0.8 → T1
T1 * C1 → T2 T2 → X1
这样所生成的四元式与原来的赋值语句在语言的形式上不同,但语义上等价。
? 目标代码优化
任务:目的是为了得到高质量的目标程序。 例子1:
目的是为了得到高质量的目标程序。 优化前:(1)2.0 + 0.8 → T1
(2)T1 * C1 → T2 (3)T2 → X1
前面的四元式中第一个四元式是计算常量表达式值,该值在编译时就可以算出并存放在工作单元中,不必生成目标指令来计算,这样四元式可优化为:
2.0 + 0.8 → T1 (1) * T1 C1 T2 (2) := X1 T2
? 目标代码生成
任务:把中间代码变换成特定机器上的低级语言代码。 目标代码形式: —绝对指令代码 —汇编指令代码
—可重定位的指令代码。
编译的最后阶段,它的工作与硬件系统结构和指令定义有关,这个阶段的工作很复杂,涉及到硬件系统功能部件的运用、机器指令的选择、各种数据类型变量的存储空间分配以及寄存器和后缓寄存器的调度等。
由中间代码很容易生成目标程序(地址指令序列)。这部分工作与机器关系密切,所以要根据机器进行。在做这部分工作时(要注意充分利用累加器),也可以进行优化处理。
例子1:
X1:= ( 2.0 + 0.8 ) * C1
注意:在翻译成目标程序的过程中,要切记保持语义的等价性。 例子2:
position = initial + rate * 60
注:寄存器(R1和R2)
编译程序的结构
? 编译程序的逻辑结构
按逻辑功能不同,可将编译过程划分为五个基本阶段,与此相对应,我们将实现整个编译过程的编译程序划分为五个逻辑阶段(即五个逻辑子过程)。
?
编译程序总框