预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共22页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

C语言编译器的设计与实现 01计算机4班18号任春妍2号陈俊 我们设计的编译程序涉及到编译五个阶段中的三个,即词法分析器、语法分析器和中间代码生成器。编译程序的输出结果包括词法分析后的二元式序列、变量名表、状态栈分析过程显示及四元式序列程序,整个编译程序分为三部分: (1)词法分析部分 (2)语法分析处理及四元式生成部分 (3)输出显示部分 一.词法分析器设计 由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输入错误的检查,而将编译程序的重点放在中间代码生成阶段。词法分析器的功能是输入源程序,输出单词符号。我们规定输出的单词符号格式为如下的二元式:(单词种别,单词自身的值) #defineACC-2 #definesyl_if0 #definesyl_else1 #definesyl_while2 #definesyl_begin3 #definesyl_end4 #definea5 #definesemicolon6 #definee7 #definejinghao8 #defines9 #defineL10 #definetempsy11 #defineEA12 #defineEO13 #defineplus14 #definetimes15 #definebecomes16 #defineop_and17 #defineop_or18 #defineop_not19 #definerop20 #definelparent21 #definerparent22 #defineident23 #defineintconst24 函数说明 读取函数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ifeSelseS 2)SwhileeS 3)S{L} 4)Sa; 5)LS 6)LSL 用∈_CLOSURE方法构造LR(0)项目规范簇为: I0:S’·S S·ifeSelseS S·whileeSS·{L} S·a; I1:S’S· I2:Sif·eSelseS I3:Swhile·eS I4:S{·L} L·S L·SL S·ifeSelseS S·whileeSS·{L} S·a; I5:Sa·; I6:Sife·SelseS S·ifeSelseS S·whileeSS·{L} S·a; I7:Swhilee·S S·ifeSelseS S·whileeSS·{L} S·a; I8:S{L·} I9:LS· LS·L L·SL L·S S·ifeSelseS S·whileeSS·{L} S·a; I10:Sa;· I11:SifeS·elseS I12:SwhileeS· I13:S{L}· I14:SSL· I15:SifeSelseS S·ifeSelseS S·whileeS