编译技术课程设计报告词法分析语法分析中间代码生成.docx
- 文档编号:7529484
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:43
- 大小:197.42KB
编译技术课程设计报告词法分析语法分析中间代码生成.docx
《编译技术课程设计报告词法分析语法分析中间代码生成.docx》由会员分享,可在线阅读,更多相关《编译技术课程设计报告词法分析语法分析中间代码生成.docx(43页珍藏版)》请在冰豆网上搜索。
编译技术课程设计报告词法分析语法分析中间代码生成
编译技术课程设计
班级
学号
姓名
指导老师
年月
一、目的------------------------------------------------------------------------------------------2
二、任务及要求---------------------------------------------------------------------------------2
三、实验环境------------------------------------------------------------------------------------4
四、实现过程说明------------------------------------------------------------------------------4
1.词法分析器------------------------------------------------------------------------------4
(1)单词符号表------------------------------------------------------------------------4
(2)数据结构---------------------------------------------------------------------------5
(3)函数说明---------------------------------------------------------------------------5
(4)流程图------------------------------------------------------------------------------6
2.语法分析器------------------------------------------------------------------------------6
(1)分析方法说明---------------------------------------------------------------------6
(2)文法---------------------------------------------------------------------------------6
(3)数据结构---------------------------------------------------------------------------7
(4)函数说明---------------------------------------------------------------------------7
3.中间代码生成器------------------------------------------------------------------------10
(1)属性文法--------------------------------------------------------------------------10
(2)数据结构--------------------------------------------------------------------------11
(3)函数说明--------------------------------------------------------------------------11
(4)流程图------------------------------------------------------------------------------11
五、程序运行结果------------------------------------------------------------------------------12
六、总结------------------------------------------------------------------------------------------16
一、目的
<<编译技术>>是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。
从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。
二、任务及要求
基本要求:
1.词法分析器产生下述小语言的单词序列
这个小语言的所有的单词符号,以及它们的种别编码和内码值如下表:
单词符号
种别编码
助记符
内码值
while
1
while
if
2
if
else
3
else
switch
4
switch
case
5
case
标识符
6
id
符号表入口地址
常数
7
num
常数表入口地址
=
8
=
+
9
+
*
10
*
**
11
**
12
/
13
/
>
14
relop
MT
>=
14
relop
ME
<
14
relop
LT
<=
14
relop
LE
==
14
relop
EQ
!
=
14
relop
UEQ
;
15
;
16
(
17
(
LB
)
17
)
RB
对于这个小语言,有几点重要的限制:
首先,所有的关键字(如if﹑while等)都是“保留字”。
所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。
例如,下面的写法是绝对禁止的:
if(5)=x
其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。
也就是说,对于关键字不专设对应的转换图。
但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。
当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。
再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。
例如,一个条件语句应写为
ifi>0i=1;
而绝对不要写成
ifi>0i=1;
因为对于后者,我们的分析器将无条件地将ifi看成一个标识符。
这个小语言的单词符号的状态转换图,如下图:
2.语法分析器能识别由加+乘*乘方**括号()操作数所组成的算术表达式,其文法如下:
E→E+T|T
T→T*F|F
F→P**F|P
P→(E)|i
使用的算法可以是:
预测分析法;递归下降分析法;LR分析法等。
3.中间代码生成器产生上述算术表达式的中间代码(四元式序列)
较高要求:
1.扩充上述小语言的单词;
2.增加语法分析器的功能,能识别条件语句和循环语句等;
3.增加中间代码生成器的功能,能产生条件语句和循环语句等的中间代码(四元式序列)
4.报错基础上增加错误信息;
5.将中间代码翻译成汇编语言。
三、实验环境
开发环境VC++;VisualStudio;Java开发环境
语言C;C++;C#;Java
说明:
课程设计可以使用任何一种语言工具,课程设计报告中请按照自己实际采用的开发工具及技术来写。
四、实现过程说明
1.词法分析器
(1)单词符号表
单词符号
种别编码
助记符
内码值
while
1
while
if
2
if
else
3
else
switch
4
switch
case
5
case
标识符
6
id
符号表入口地址
常数
7
num
常数表入口地址
=
8
=
+
9
+
++
9
++
+=
9
+=
*
10
*
**
11
**
12
/
13
/
/=
13
/=
>
14
relop
MT
>=
14
relop
ME
<
14
relop
LT
<=
14
relop
LE
==
14
relop
EQ
!
=
14
relop
UEQ
;
15
;
16
(
17
(
LB
)
17
)
RB
!
18
!
{
20
{
}
20
}
[
21
[
]
21
]
:
22
:
''
24
''
(2)数据结构
用words[10]存放构成单词符号的字符串,并且用于判断是否为关键字。
flags[500]存放单词符号的种别码。
Number存放整数值,words[]存放标识符,关键字或者其他符号。
cnt[num]按顺序存放读到的字符,为下面语义分析做准备。
Status用于判断是否为关键字,1是,0不是。
(3)函数说明
在Scan()子函数中,先全部初始化,然后读一个字符,分析它是什么类型:
如果是字母类型,则接着往下读,直到读到非字母的字符,存入words[10]中,依次对比关键字表中的元素,如果相同,则将flags[]置为相应的种别码,如果全都扫描后没发现相同的关键字,则为普通的标识符,返回主函数输出。
如果是数字类型,首先分析第一个符号,接着读下一个字符串,直到读到一个不是数字的字符串位置,每读一个数字字符,就将他们转化为相应的数字,使用辗转相乘法,每次都让number先自乘10,然后加上这个数字,这样就将字符串表示的数字转化成了相应的数,返回主函数输出。
如果是其他单词表的符号,则将他们的flags[]置为相应的种别码,并将字符存到words[]中返回主函数输出。
(4)流程图
2.语法分析器
(1)分析方法说明
采用递归下降分析法
(2)文法
E→E+T|E-T|T
T→T*F|E/F|F
F→P**F|P
P→(E)|i
改造后的文法
E→TE’|TE’’
E’→+TE’|ε
E’’→-TE’’|ε
T→FT’|FT’’
T’→*FT’|ε
T’’→/FT’’|ε
F→PF’
F’→**F|ε
P→(E)|i
(3)数据结构与函数说明
在main函数调用E()函数,如果调用之后返回时,如果((flags[temp]==0)&&is_right)为真,就输出“分析成功”,否则输出“分析失败”。
其中is_right为设定的标志,初值为1,如果在调用子函数的过程中如果有错误,则置is_right为0。
E函数:
调用T函数,调用F函数,调用P函数,返回后看是否是’+’或’-’,如果是,则调用E1函数,再调用E2函数,如果不是,进行出错处理,置is_right为0。
E1函数:
判断是不是”+”或者“-”如果是,调用F函数,如果不是,进行出错处理,置is_right为0。
代码:
voidE()
{
cout<<"E->TE''"< T(); E2(); } voidE1() { if(flags[temp]==9)//加号 { cout<<"E'->+T"< temp++; T(); } elseif(flags[temp]==12)//减号 { cout<<"E'->-T"< temp++; T(); } else is_right=0; } voidE2() { if(flags[temp]==9||flags[temp]==12)//如果是加或减 { cout<<"E''->E'E''"< E1(); E2(); } elseif(flags[temp]! =0||flags[temp]! =17)//如果是非#或非 { cout<<"E''->ε"< return; } else is_right=0; T函数: 调用F函数,调用P函数,返回后看是否是’*’或’/’,如果是,则调用T1函数,再调用T2函数,如果不是,进行出错处理,置is_right为0。 T1函数: 判断是不是”*”或者“/”如果是,调用F函数,如果不是,进行出错处理,置is_right为0。 代码: voidT() { cout<<"T->FT''"< F(); T2(); } voidT1() { if(flags[temp]==10)//乘号 { cout<<"T'->*F"< temp++; F(); } elseif(flags[temp]==13)//除号 { cout<<"T'->/F"< temp++; F(); } elseis_right=0; } voidT2() { if(flags[temp]==10||flags[temp]==13)//如果是乘或除 { cout<<"T''->T'T''"< T1(); T2(); } elseif(flags[temp]! =0||flags[temp]! =17)//如果是非#或非) { cout<<"T''->ε"< return; } elseis_right=0; } F函数: 调用P函数,F1函数。 F1函数: 判断是不是”**”,如果是,调用F函数,如果不是,进行出错处理,置is_right为0。 代码: voidF() { cout<<"F->PF'"< P(); F1(); } voidF1() { if(flags[temp]==11)//乘? 方? { cout<<"F'->**F"< temp++; F(); } Elseif(flags[temp]! =0&&flags[temp]! =17&&flags[temp]! =9&&flags[temp]! =12&&flags[temp]! =10&&flags[temp]! =13)//非#非)非+非-非*非/ { cout<<"F'->ε? "< is_right=0; } } P函数: 检查是否标识符,如果是,调用P1函数,如果不是,检查是否是数值,如果是,调用P1函数,如果不是,检查是否是’(’,如果不是,进行出错处理,置is_right为0。 如果是,调用E函数,返回后检查是否是’)’,如果不是,进行出错处理,置is_right为0。 如果是,调用F1函数,返回。 代码: voidP() { if(flags[temp]==6||flags[temp]==7)//标识符或常数 { cout<<"P->i"< temp++; } elseif(flags[temp]==17)//( { cout<<"P->(E)"< temp++; E(); if(flags[temp]==17)//) { cout<<"P->(E)"< temp++; } else is_right=0; } elseis_right=0; } 3.中间代码生成器 (1)属性文法 E→E’+TE.val=E’.val+T.val E→E’’-TE.val=E’’.val-T.val E→TE.val=T.val T→T’*FT.val=T’.val*F.val T→T’’/FT.val=T’’.val/F.val T→FT.val=F.val F’→P**FF’.val=P.val**F.val F’→PF’.val=P.val P→(E)P.val=E.val F→iF.val=i,lexval (2)数据结构与函数说明 Strn用来存放临时变量的序号。 temp用来存放数组的下表,在主程序中语法分析结束后,置0. 定义函数newtemp()用于门生一个新的临时变量的名字,具体实现时每产生一个T,就及时送到符号表中,也可以不进符号表,直接将单词值用整数码表示。 定义函数siyuan(),输出一个四元式。 定义函数YE()进行中间代码生成 (3)流程图 五、程序运行结果 注: 本程序对于形如a1的标识符无法作为整体识别 词法测试: 表达式正确: 2*3+4/(as-5)**6# 词法分析: 语法分析 四元式: 表达式错误: 2*(3-2# 六、总结 这次课程设计使我对编译原理有了进一步的了解,更加巩固了所学习的知识。 编译原理是一门比较抽象的课程,也比较难以学得透,有很多东西很模糊的。 编译这个概念有一定的了解。 由于课堂上,学习的东西比较浅,难免眼高手低,故而,通过实验和课程,遇到了很多课本上面见不到的问题,完成实验后,个人在成就感的同时,也学习到了编程的具体过程中的很多知识。 程序代码: //#include #include #include usingnamespacestd; #include #include #include inti,j,k,flag,number,status; /*statuswhichisusetojudgethestringiskeywordsornot! */ charch; charwords[10]={""}; charprogram[500]; intflags[500];//存储输入句子 stringcnt[500];//标括识符 inttemp=0;//数组下标 intis_right;//判断输出信息 //-----------------------词法分析----------------------------- intScan(charprogram[]) { char*keywords[5]={"while","if","else","switch","case"};//关键字 number=0; status=0; j=0; ch=program[i++]; //遍历 if((ch>='a')&&(ch<='z')||(ch>='A')&&(ch<='Z'))//字母 { while((ch>='a')&&(ch<='z')||(ch>='A')&&(ch<='Z')) { words[j++]=ch; ch=program[i++]; } i--; words[j++]='\0'; for(k=0;k<5;k++) if(strcmp(words,keywords[k])==0)//判断是否为关键字 switch(k) { case0: { flag=1; status=1; break; } case1: { flag=2; status=1; break; } case2: { flag=3; status=1; break; } case3: { flag=4; status=1; break; } case4: { flag=5; status=1; break; } } if(status==0) { flag=6;//标识符 } } elseif((ch>='0')&&(ch<='9'))//数字 { number=0; while((ch>='0')&&(ch<='9')) { number=number*10+(ch-'0'); ch=program[i++]; } flag=7; i--; } elseswitch(ch)//运算符和标点符号 { case'=': { if(ch=='=') words[j++]=ch; words[j]='\0'; ch=program[i++]; if(ch=='=') { words[j++]=ch; words[j]='\0'; flag=14; } else { i--; flag=8; } break; } case'>': { if(ch=='>') words[j++]=ch; words[j]='\0'; ch=program[i++]; if(ch=='=') { words[j++]=ch; words[j]='\0'; flag=14; } else { i--; flag=14; } break; } case'<': { if(ch=='<') words[j++]=ch; words[j]='\0'; ch=program[i++]; if(ch=='=') { words[j++]=ch; words[j]='\0'; flag=14; } else { i--; flag=14; } break; } case'! ': { if(ch=='! ') words[j++]=ch; words[j]='\0'; ch=program[i++]; if(ch=='=') { words[j++]=ch; words[j]='\0'; flag=14; } else { i--; flag=18; } break; } case'+': { if(ch=='+') words[j++]=ch; words[j]='\0'; ch=program[i++]; if(ch=='=') { wor
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 技术 课程设计 报告 词法 分析 语法分析 中间 代码 生成
![提示](https://static.bdocx.com/images/bang_tan.gif)