C语言编译器的设计与实现.doc
文本预览下载声明
C语言编译器的设计与实现
01计算机4班 18号任春妍 2号陈俊
我们设计的编译程序涉及到编译五个阶段中的三个,即词法分析器、语法分析器和中间代码生成器。编译程序的输出结果包括词法分析后的二元式序列、变量名表、状态栈分析过程显示及四元式序列程序,整个编译程序分为三部分:
(1) 词法分析部分
(2) 语法分析处理及四元式生成部分
(3) 输出显示部分
一.词法分析器设计
由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输入错误的检查,而将编译程序的重点放在中间代码生成阶段。词法分析器的功能是输入源程序,输出单词符号。我们规定输出的单词符号格式为如下的二元式: (单词种别,单词自身的值)
#define ACC -2
#define syl_if 0
#define syl_else 1
#define syl_while 2
#define syl_begin 3
#define syl_end 4
#define a 5
#define semicolon 6
#define e 7
#define jinghao 8
#define s 9
#define L 10
#define tempsy 11
#define EA 12
#define EO 13
#define plus 14
#define times 15
#define becomes 16
#define op_and 17
#define op_or 18
#define op_not 19
#define rop 20
#define lparent 21
#define rparent 22
#define ident 23
#define intconst 24
函数说明
读取函数 readline( )、readch( )
词法分析包含从源文件读取字符的操作,但频繁的读文件操作会影响程序执行效率,故实际上是从源程序文件” source.dat ”中读取一行到输入缓冲区,而词法分析过程中每次读取一个字符时则是通过执行 readch( )从输入缓冲区获得的;若缓冲区已被读空,则再执行readline( )从 source.dat 中读取下一行至输入缓冲区。
扫描函数 scan( )
扫描函数 scan( )的功能是滤除多余空格并对主要单词进行分析处理,将分析得到的二元式存入二元式结果缓冲区。
变量处理 find( )
变量处理中首先把以字母开头的字母数字串存到 spelling[ ]数组中,然后进行识别。识别过程是先让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它为保留关键字,即将其内码值写入二元式结果缓冲区;否则说明其为变量,这时让它与变量名表中的变量进行匹配( 变量匹配函数 find( ) ),如果成功,则说明该变量已存在并在二元式结果缓冲区中标记为此变量( 值填为该变量在变量名表中的位置),否则将该变量登记到变量名表中,再将这个新变量存入二元式缓存数组中。
数字识别 number( )
数字识别将识别出的数字填入二元式结果缓存数组。
显示函数
显示函数的功能在屏幕上输出词法分析的结果( 即二元式序列程序),同时给出二元式个数及源程序行数统计。
二.语法分析器设计
语法分析器的核心是三张 SLR 分析表以及针对这三张 SLR 分析表进行语义加工的语义动作。编译程序中语法分析处理及四元式生成部分主要是以二元式作为输入,并通过 SLR 分析表对语法分析处理过程进行控制,使四元式翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。在处理 if 和 while 语句时,需要进行真值或假值的拉链和返填工作,以便转移目标的正确填入。
1. 控制语句的 SLR 分析表1 设计过程如下:
将扩展文法G’
S’? S
1)S ? if e S else S
2)S ? while e S
3)S ? { L }
4)S ? a;
5)L ? S
6)L ? SL
用∈_CLOSURE方法构造LR(0)项目规范簇为:
I0: S’? ·S
S ? ·if e S else S
S ? ·while e S S ? ·{ L }
S ? · a ;
I1: S’? S·
I2: S ? if·e S else S
I3: S ? while ·e S
I4: S ? {·L}
L ? ·S
L
显示全部