资源描述:
《编译原理课程设计报告--C语言子集编译器设计》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、编译原理课程设计报告题目:C语言子集编译器设计学号:姓名:班级:教师得分:日期:广西大学计算机科学与电子信息学院1、设计任务1.1编译的语言本编译器编译的语言为C语言子集,具体如下:算术运算符:+-*/关系运算:><>=<=!====逻辑运算&&
2、
3、!赋值运算=数字0123456789字符a…..zA…..Z标示符的命名规则:由字母和下划线组成,打头的只能是字母,区分大小写,不能和关键字重复。注释:单行注释//多行注释/**/数据类型有整型int,字符型char符合数据类型有数组inta[6]程序由一个主函数组成<主函数>→voidmain(){<复合语句>}<复合语句>→
4、<常量说明部分><变量定义部分><语句序列><常量定义>→int<标示符>=<整数>{,int<标示符>=<整数>}
5、char<标示符>=<字符>{,char<标示符>=<字符>}
6、变量定义:inta;inta,b;inta=3,b;<语句序列>→<语句>;<语句序列>语句有赋值语句<标示符>=<表达式>读语句:scanf(“<标示符>”)写语句:printf(<字符串>);条件语句:if(条件){}else{}If(条件){}循环语句:while(条件){}For(i=1;i<=10;i++){}1.2抽象文法1.2.1构造LL1要解决的关键问题本编译器采用LL1文法,设
7、计LL1文法有两个关键点:1、消除文法左递归:左递归文法如:E->E+EE->id
8、num可使用增加中间非终结符的方法消除左递归,消除后为:E->T+EE->TT>id
9、num2、消除分析表多重定义上述文法仍不是LL1文法,采用提公因子的方法修改上述文法后可得LL1文法:E->TE’E-‘>+T
10、$T>id
11、num1.2.2C语言子集的LL1文法[Terminal]:mainprintfscanfvoidintcharboolidnumchifelsewhilefor;,(){}===!=><+-*/&&
12、
13、!++--#(结束符)[Nonerminal]:S,B,A,C,,
14、X,R,Z,Z’,U,U’,E,E’,H,H’,G,M,D,L,L’,T,T’,F,O,P,Q[Starter]:S[Precept]:1、文法开始:(1)S->voidmain(){A}2、声明:(2)X->YZ;(3)Y->int(4)Y->char(5)Y->boolZ->UZ’Z’->,Z
15、$U->idU’U’->=L
16、$3、赋值:R->id=L;4、算术运算:L->TL’L’->+L
17、-L
18、$T->FT’T’->*T
19、/T
20、$F->(L)F->id
21、numO->++
22、--
23、$Q->idO
24、$1、布尔运算E->HE’E’->&&E
25、$H->GH’H’->
26、
27、HH’-
28、>$G->FDFD-><
29、>
30、==
31、!=G->(E)G->!E5、控制语句B->if(E){A}else{A}B->while(E){A}B->for(YZ;G;Q){A}6、功能函数B->printf(P);B->scanf(id);P->id
32、ch
33、num7、复合语句A->CAC->X
34、B
35、RA->$2、需求分析为C语言子集设计一个简单编译器,要求有友好的图形界面,能够实现编译的词法分析,语法分析和语义分析功能,并具备一定的错误处理能力,给出总的出错报告,编译最终形成四元式的中间代码形式。3、系统设计4、详细设计4.1构造LL1分析表1、求个产生式的select集注意:
36、一定要记得求空产生式A->$的select集具体过程(略),结果可见LL1分析表2、最终获得的LL1分析表mainprintfscanfvoidintcharboolid(自定义变量)num(int常量)ch(char常量)SS>voidmain(){A}AA->CAA->CAA->CAA->CAA->CAA->CABB->printf(P);B->scanf(id);CC->BC->BC->XC->XC->XC->RXX->YZX->YZX->YZYY->intY->charY->boolZZ->UZ’Z’Z’->$UU->idU’U’RR->id=L;PP->idP->
37、numP->chEE->HE’E->HE’E’E’->$HH->GH’H->GH’GG->FDMG->FDMH’H’->$H’->$DLL->TL’L->TL’L’L’->$L’->$TT->FT’T->FT’T’T’->$T’->$FF->idF->numOQQ->idOifelsewhilefor;,(){}===SAA->CAA->CAA->CAA->CABB->If(G){A}else{A}B->while(G){A}B->for(YZ;G;Q){A}CC->BC->BC->BC->BXYZZ’Z’->,Z