C语言编译器的设计与实现Word文件下载.docx
- 文档编号:13468344
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:19
- 大小:68.71KB
C语言编译器的设计与实现Word文件下载.docx
《C语言编译器的设计与实现Word文件下载.docx》由会员分享,可在线阅读,更多相关《C语言编译器的设计与实现Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
#definejinghao8
#defines9
#defineL10
#definetempsy11
#defineEA12
#defineEO13
#defineplus14
#definetimes15
#definebecomes16
#defineop_and17
#defineop_or18
#defineop_not19
#definerop20
#definelparent21
#definerparent22
#defineident23
#defineintconst24
函数说明
1.读取函数readline()、readch()
词法分析包含从源文件读取字符的操作,但频繁的读文件操作会影响程序执行效率,故实际上是从源程序文件”source.dat”中读取一行到输入缓冲区,而词法分析过程中每次读取一个字符时则是通过执行readch()从输入缓冲区获得的;
若缓冲区已被读空,则再执行readline()从source.dat中读取下一行至输入缓冲区。
2.扫描函数scan()
扫描函数scan()的功能是滤除多余空格并对主要单词进行分析处理,将分析得到的二元式存入二元式结果缓冲区。
3.变量处理find()
变量处理中首先把以字母开头的字母数字串存到spelling[]数组中,然后进行识别。
识别过程是先让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它为保留关键字,即将其内码值写入二元式结果缓冲区;
否则说明其为变量,这时让它与变量名表中的变量进行匹配(变量匹配函数find()),如果成功,则说明该变量已存在并在二元式结果缓冲区中标记为此变量(值填为该变量在变量名表中的位置),否则将该变量登记到变量名表中,再将这个新变量存入二元式缓存数组中。
4.数字识别number()
数字识别将识别出的数字填入二元式结果缓存数组。
5.显示函数
显示函数的功能在屏幕上输出词法分析的结果(即二元式序列程序),同时给出二元式个数及源程序行数统计。
二.语法分析器设计
语法分析器的核心是三张SLR分析表以及针对这三张SLR分析表进行语义加工的语义动作。
编译程序中语法分析处理及四元式生成部分主要是以二元式作为输入,并通过SLR分析表对语法分析处理过程进行控制,使四元式翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。
在处理if和while语句时,需要进行真值或假值的拉链和返填工作,以便转移目标的正确填入。
1.控制语句的SLR分析表1设计过程如下:
将扩展文法G’
1)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
whileeS
S→·
{L}
a;
I1:
S’→S·
I2:
S→if·
eSelseS
I3:
S→while·
eS
I4:
S→{·
L}
L→·
SL
I5:
S→a·
;
I6:
S→ife·
SelseS
I7:
S→whilee·
I8:
S→{L·
}
I9:
L→S·
L
I10:
S→a;
·
I11:
S→ifeS·
elseS
I12:
S→whileeS·
I13:
S→{L}·
I14:
S→SL·
I15:
S→ifeSelseS
I16:
S→ifeSelseS·
构造文法G’中非终结符的FOLLOW集如下:
2)FOLLOW(S’)={#}
3)S→ifeSelseS得 FOLLOW(S)={else}
S→{L}得 FOLLOW(L)={}}
3)S’→S 得FOLLOW(S)={else,#}
L→S 因为FIRST(S)={{},所以FOLLOW(S)={else,#,{}
在LR(0)项目规范簇中 ,只有I9有“移进――归约”冲突, L→S·
L→S·
因为FOLLOW(L)∩FIRST(L)=∮所以可以用SLR方法解决以上冲突,最后我们得到的SLR分析表如下:
ACTION
GOTO
if
Else
while
{
a
e
#
S2
S3
S4
S5
1
ACC
2
S6
3
S7
4
9
8
5
S10
6
11
7
12
S13
R5
14
10
R4
15
R2
13
R3
R6
16
R1
staticintaction[20][11]=
/*0*/{{2,-1,3,4,-1,5,-1,-1,-1,1,-1},
/*1*/{-1,-1,-1,-1,-1,-1,-1,-1,ACC,-1,-1},
/*2*/{-1,-1,-1,-1,-1,-1,-1,6,-1,-1,-1},
/*3*/{-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1},
/*4*/{2,-1,3,4,-1,5,-1,-1,-1,9,8},
/*5*/{-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1},
/*6*/{2,-1,3,4,-1,5,-1,-1,-1,11,-1},
/*7*/{2,-1,3,4,-1,5,-1,-1,-1,12,-1},
/*8*/{-1,-1,-1,-1,13,-1,-1,-1,-1,-1,-1},
/*9*/{2,-1,3,4,105,5,-1,-1,-1,9,14},
/*10*/{-1,104,-1,-1,104,-1,-1,-1,104,-1,-1},
/*11*/{-1,15,-1,-1,-1,-1,-1,-1,-1,-1,-1},
/*12*/{-1,102,-1,-1,102,-1,-1,-1,102,-1,-1},
/*13*/{-1,103,-1,-1,103,-1,-1,-1,103,-1,-1},
/*14*/{-1,-1,-1,-1,106,-1,-1,-1,-1,-1,-1},
/*15*/{2,-1,3,4,-1,5,-1,-1,-1,16,-1},
/*16*/{-1,101,-1,-1,101,-1,-1,-1,101,-1,-1}};
其中,前9列为action值,后2列为goto值;
0~16表示17个移进状态(即Si);
-1表示出错;
ACC表示分析成功;
而100~106对应7个归约产生式:
100S’→S
101S→ifeSelseS
102S→whileeS
103S→{L}
104S→a;
105L→S
106L→SL
2.算术表达式的LR分析表2设计如下:
1)S’→E
2)E→E+E
3)E→E*E
4)E→(E)
5)E→i(过程略)
I
+
*
(
)
E
S9
s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 编译器 设计 实现