浅谈计算机编译程序的组成
编译程序是实现将源程序翻译为目标程序的系统软件,它由若于个程序组成,故又称为编译系统。这样用编译方法执行源程序大体可以分为两个阶段,即编译阶段和运行阶段。
一、词法分析器
词法分析器是编译程序的最简单部分,也称为扫描程序。它从左到右扫描源程序中的各个字符,并构造源程序中的实际符号——整数,标识符,保留字,双字符等。然后再将这些符号传送给分析程序。同时删去注解。词法分析器还能把标识符存放到符号表中,也能执行一些无须真正分析源程序就能完成的各种简单任务。
各种符号通常是由同法分析程序按其内部形式传送给分析程序的。每个分界符(保留字、运算符或标点符号)将用一个整数表示。而标识符或常数则用一对整数表示:第一个整数不同于任何一个表示分界符的整数,用以指明标识符或常数;第二个整数给出标识符或常数在相应表中的地址或指标。这样一来,就使编译程序其余各部分都使用定长符号这种有效方式进行工作,而不再使用可变长度的字符串。
词法分析器是如何识别各类单词的呢?常用的识别方法有状态转换图分析法、状态矩阵分析法和确定有限状态自动机分析法等。
(1)从0状态开始,在0状态下,若输入字符是一个字母,则读人该字母,并转入1状态;否则,继续停留在0状态。 本文由论文联盟http://收集整理
(2)在1状态,若输入字符是字母或数字,则读人该字母或数字,并重新进入1状态;重复这一过程,直到1状态下输入的字符不是字母或数字,并进入2状态,宜告识别结束。wWW.133229.cOm
(3)在进入2状态后,因最后读人了一个非字母或数字的字符,故在下一次字符串的识别之前必须退回该字符。
可见,上述状态转换过程正好与标识符的定义:“以字母开头的字母、数字串”相吻合。这就说明了可以识别输入的字符串是否为标识符。例如,设有一个简单的程序设计语言,其单词符号集并作如下约定。
(1)将基本字符作为特殊的标识符处理,即在状态转换图中,基本字和标识符两者归为一体。
(2)语言中所有关键字都是保留字,不可做它用。
(3)如果基本字、标识符和常数之间没有运算符或界符作间隔,至少要用一个空格隔开。
二、语法分析
语法分析的主要任务是:根据程序设计语言的语法规则,将词法分析器所提供的单词符号串分析成各种语法范畴。从单词到短语,从短语到语句,从语句到程序段或程序,分析和确定给出的单词符号申是否组成一个正确的程序。
语法分析的方法很多,在此介绍一种算符优先分析法。算符优先分析法基本原理是基于对程序设计浯言中的所有运算符号之间的优先级比较,完成对表达式的浯法分析的。为此,在计算机中构造一张算符优先分析表,并建立两个工作栈和一个符号寄存器。两个工作栈,即操作工作栈和运算符栈,以及一个符号寄存器。通过一个工作程序,从输入的单词申中—个—个地读入单同,先把它放在符号寄存器中进行判别,并根据判别结果做如下操作。
(1)若该单词是操作数(包括带值变量和常数),则将它压入操作数栈中。
(2)若该单词是运算符,则将它与运算符栈的栈顶运算符的优先级进行比较。
①若当前输入的运算符优先级高于栈顶运算符的优先级,则将当前输入的运算符压入运算符栈;
②若当前输入运算符的优先级低于栈顶运算符的优先级,则弹出栈顶运算符和操作数栈中的相应操作数,完成其运算,并把计算结果重新压入操作数栈中;
③若当前输入的运算符的优先级等于栈顶运算符的优先级,则弹出运算符栈的栈顶符号,并读入下一个单词,什么计算也不进行。
(3)反复执行上述过程,直至读入句末符“#”,操作数栈中仅剩下一个结果值,表明分析正确;否则分析出错,转出错处理。
由上述分析可知,运算符优先分析程序实际上是一个查表程序。分析每一步都是依据分析栈的栈顶运算符和当前的输入符号,通过查表,决定是继续读入下一个字符还是对栈顶运算符执行相应的运算,或者进行出错处理。
三、中间代码生成
中间代码生成是根据语法分析所指示的语法范畴进一步确定语句的语义,并生成相应的中间代码序列。
中间代码是一种结构简单、含义明确的记号系
统,它的表现形式应既有利于后阶段的代码优化,又要逻辑上便于理解并有利于最终机器(目标)指令代码的生成。常用的中间代码形式有三元式、四元式以及逆波兰表示法。