编译原理课程设计报告

上传人:wuy****ng 文档编号:162017377 上传时间:2022-10-17 格式:DOC 页数:22 大小:952.01KB
收藏 版权申诉 举报 下载
编译原理课程设计报告_第1页
第1页 / 共22页
编译原理课程设计报告_第2页
第2页 / 共22页
编译原理课程设计报告_第3页
第3页 / 共22页
资源描述:

《编译原理课程设计报告》由会员分享,可在线阅读,更多相关《编译原理课程设计报告(22页珍藏版)》请在装配图网上搜索。

1、编译原理课程设计报告题目:C语言子集编译器设计 学号: 姓名: 班级: 教师 得分: 日期: 广西大学计算机科学与电子信息学院1、设计任务1.1编译的语言本编译器编译的语言为C语言子集,具体如下:算术运算符:+ - * /关系运算: = = != =逻辑运算 & | !赋值运算 =数字 0 1 2 3 4 5 6 7 8 9字符 a.z A.Z标示符的命名规则:由字母和下划线组成,打头的只能是字母,区分大小写,不能和关键字重复。注释:单行注释/ 多行注释/* */数据类型有整型int ,字符型char符合数据类型有数组 int a6程序由一个主函数组成 void main() int =,in

2、t = | char =,char = |变量定义:int a; int a,b; int a=3,b; ;语句有赋值语句 =读语句:scanf(“”)写语句:printf();条件语句:if(条件)else If (条件)循环语句: while(条件) For(i=1;iE+EE-id|num可使用增加中间非终结符的方法消除左递归,消除后为:E-T+EE-TTid|num2、 消除分析表多重定义上述文法仍不是LL1文法,采用提公因子的方法修改上述文法后可得LL1文法:E-TEE-+T|$Tid|num1.2.2 C语言子集的LL1文法Terminal:main printf scanf vo

3、id int char bool id num ch if else while for ; , ( ) = = != void main()A2、 声明:(2) X-YZ;(3) Y- int(4) Y-char(5) Y-boolZ-UZZ-,Z|$ U-idUU-=L|$3、 赋值:R-id=L;4、 算术运算:L-TLL-+L|-L|$T-FTT-*T|/T|$F-(L)F-id|numO-+|-|$Q-idO|$5、 布尔运算E-HEE-&E|$H-GHH-|HH-$G-FDFD-|=|!=G-(E)G-!E5、控制语句B-if (E)AelseAB-while(E)AB-for(Y

4、Z;G;Q)A6、功能函数B-printf(P);B-scanf(id);P-id|ch|num7、复合语句A-CAC-X|B|RA-$2、需求分析为C语言子集设计一个简单编译器,要求有友好的图形界面,能够实现编译的词法分析,语法分析和语义分析功能,并具备一定的错误处理能力,给出总的出错报告,编译最终形成四元式的中间代码形式。3、系统设计4、详细设计4.1构造LL1分析表1、求个产生式的select集注意:一定要记得求空产生式A-$的select集具体过程(略),结果可见LL1分析表2、最终获得的LL1分析表mainprintfscanfvoidint charboolid(自定义变量)num

5、(int常量)ch(char常量)SSvoid main()AAA-CAA-CAA-CAA-CAA-CAA-CABB-printf(P);B-scanf(id);CC-BC-BC-XC-XC-XC-RXX-YZX-YZX-YZYY-intY-charY-boolZZ-UZZZ-$UU-idUURR-id=L;PP-idP-numP-chEE-HEE-HEEE-$HH-GHH-GHGG-FDMG-FDMHH-$H-$DLL-TLL-TLLL-$L-$TT-FTT-FTTT-$T-$FF-idF-numOQQ-idOifelsewhilefor;,()=SAA-CAA-CAA-CAA-CABB-I

6、f(G)Aelse AB-while (G)AB-for(YZ;G; Q)ACC-BC-BC-BC-BXYZZZ-,ZUUU-$U-$U-=LRPEE-HEEHH-GHGG-(E)HH-$DD-=LL-TLL-TLLL-$TT-FTTT-$FF-(L)O!=$BC XYZZZ-$UUU-$RPEEE-&EE-$HGG-!EHH-|HH-$H-$DD-!=D-D-+LL-LL-$TTT-*TT-/TT-$FOO-+O-O-$QQ-$语法分析示例:待分析源程序:void main()int a=2,b=3,c;if(ab)c=1;else c=0;步骤分析栈analyseStack余留符号串wor

7、dlist待分析单词表的首单词,firstWord=wordlist.get(0)产生式下一步动作0$Svoid main()int a=2,b=3,c;if(ab)c=1;else c=0;voidS-void main()A弹出S,A()main void 入栈1$A()main voidmain()int a=2,b=3,c;if(ab)c=1;else c=0;void移进弹出void,扫描指针后移一个符号2$A()mainmain()int a=2,b=3,c;if(ab)c=1;else c=0;main移进弹出main,扫描指针后移一个符号3$A()()int a=2,b=3,c

8、;if(ab)c=1;else c=0;)移进弹出),扫描指针后移一个符号4$A()int a=2,b=3,c;if(ab)c=1;else c=0;(移进弹出(,扫描指针后移一个符号5$Aint a=2,b=3,c;if(ab)c=1;else c=0;移进弹出,扫描指针后移一个符号6$Aint a=2,b=3,c;if(ab)c=1;else c=0;A-CA弹出A,CA逆序进栈4.2构造LL1属性翻译文法及分析表1、构造LL1属性翻译文法构造LL1属性翻译文法即在原有LL1文法基础上加上动作符号,并给非终结符和终结符加上一定属性,给动作符号加上语义子程序。对原有LL1文法改进的地方如下:

9、1、 赋值:产生式语义子程序R-ASS_R id =L EQ; ASSR.VAL=id并压入语义栈EQRES=R.VAL,OP=,ARG1=L.VAL,new fourElement(OP,ARG1,/, RES)U-ASS_UidU U.VAL=id并压入语义栈U-=L|$EQRES=U.VAL,OP=,ARG1=L.VAL,new fourElement(OP,ARG1,/, RES)2、 算术运算:产生式语义子程序L-TLADD_SUBIf(OP!=null) RES= NEWTEMP; L.VAL=RES,并压入语义栈;New fourElement(OP, T.VAL;,LVAL,

10、RES),L-+LOP=”+” L-LOP=”- “L-$T-FTDIV_MUL if (OP !=null) RES= NEWTEMP;T.VAL=RES; new FourElement(OP,F.VAL,ARG2, RES)else ARG1=F.VAL; T-/TDIVOP=/,ARG2=T.VALT-*TMUL OP=*,ARG2=T.VALT-$F-ASS_F num|idF.VAL=num|idQ-idO|$O-SINGLE_OP+|-OP=+|-3、 布尔运算产生式语义子程序G-FDFCOMPAREOP=D.VAL;ARG1=F(1).VAL;ARG2=F(2).VAL,RES

11、=NEWTEMP; New fourElement(OP,F.VAL,ARG2, RES );G.VAL=RES并压入语义栈D-COMPARE_OP|=|!=D.VAL=|=|!=,并压入语栈4、控制语句产生式语义子程序B-if (G)IF_FJAIF_BACKPATCH_FJ IF_RJ elseAIF_BACKPATCH_RJIF_FJOP=”FJ”;ARG1=G.VAL;RES=if_fj, New fourElement(OP,ARG1,/, RES ),将其插入到四元式列表中第i个IF_BACKPATCH_FJ回填前面假出口跳转四元式的跳转序号, BACKPATCH (i,if_fj

12、)B-while(G)WHILE_FJAWHILE_RJWHILE_BACKPATCH_FJ参照if elseB-for(YZ;GFOR_FJ;Q)ASINGLEFOR_RJFOR_BACKPATCH_FJ参照if else SINGLEARG1=id;RES=NEWTEMP;New fourElement(OP,ARG1,/,RES)说明:(1)、R.VAL表示符号R的值,VAL是R的一个属性,其它类似。(2)、NEWTEMP()函数:每调用一次生成一个临时变量,依次为T1,T2,Tn。(3)、BACKPATCH (int i,int res):回填函数,用res回填第i个四元式的跳转地址。

13、(4)、new fourElement(String OP,String ARG1,String ARG2,String RES ):生成一个四元式(OP,ARG1,ARG2,RES)3、 构造LL1属性文法分析表(参照LL1分析表构造)4.3数据结构设计1、节点类单词public class Word int id;/ 单词序号String value;/ 单词的值String type;/ 单词类型int line;/ 单词所在行boolean flag = true;/单词是否合法分析栈节点public class AnalyseNode String type;/节点类型String

14、name;/节点名String value;/节点值错误public class Error int id ;/错误序号;String info;/错误信息;int line ;/错误所在行Word word;/错误的单词四元式public class FourElement int id;/四元式序号,为编程方便String op;/操作符String arg1;/第一个操作数String arg2;/第二个操作数Object result;/结果2、 表单词表ArrayList wordList = new ArrayList();/ 单词表错误信息表ArrayList errorList

15、 = new ArrayList();/ 错误信息列表四元式列表ArrayListfourElemList=new ArrayList();3、 栈LL1分析栈StackanalyseStack=new Stack();/分析栈语义栈StacksemanticStack=new Stack();/语义栈Stackif_fj,if_rj,while_fj,while_rj,for_fj,for_rj;/if while for 跳转地址栈,用于实现控制语句嵌套Stackfor_op=new Stack();/ for(YZ;G;Q)中Q的操作符号栈,用于实现for的嵌套4.4程序流程图1、词法分

16、析流程图2、LL1翻译器流程图4.5面向对象设计1、用例图2、类图主要函数说明:Word类:Word(int id, String value, String type, int line):构造函数,按括号里的参数创建并初始化一个对象isKey(String word):判断单词是否为关键字isOperator(String word):判断单词是否为操作符isBoundarySign(String word):判断单词是否为界符isArOP(String word):判断单词是否为算术运算符isBoolOP(String word):判断单词是否为bool运算符LexAnalyse类:is

17、Digit(char ch):判断一个字符是不是数字isLetter(char ch):判断一个字符是不是字母isInteger(String word):判断一个单词是不是int常量isChar(String word):判断一个单词是不是char常量isID(String word): 判断一个单词是否为合法标识符isFail():判断词法分析是否正确通过,返回true表示源程序有词法错误,不能进行后面的语法、语义分析;返回false表示正确通过,可以进行后面的语法、语义分析analyse(String str, int line):对源程序指定行进行词法分析lexAnalyse(Stri

18、ng str):对一串字符进行词法分析lexAnalyse1(String filePath):对路径为fliePath的源程序进行词法分析outputWordList():把单词列表wordList输出到当前工程的output目录下的wordList.txt文件中保存。Error类:Error(int id,String info,int line,Word word):构造函数,按给定参数创建并初始化一个对象AnalyseNode类:AnalyseNode(String type,String name,String value):构造函数,按给定参数创建并初始化一个对象isNonterm

19、(AnalyseNode node):判断一个分析栈节点是否为非终结符isTerm(AnalyseNode node):判断一个分析栈节点是否为终结符isActionSign(AnalyseNode node):判断一个分析栈节点是否为动作符FourElement类:FourElement(int id,String op,String arg1,String arg2,String result):构造函数,按给定参数创建并初始化一个对象Parser类:Parser(LexAnalyse lexAnalyse):构造函数,按给定词法分析器创建并初始化一个语法分析器init():语法分析器初始

20、化函数,创建非终结符和动作符节点对象newTemp():四元式临时变量生成器,没调用一次生成一个临时变量,依次为:T1、T2、T3。termOP(String term):分析栈栈顶为终结符时的处理函数nonTermOP(String nonTerm):分析栈栈顶为非终结符时的处理函数actionSignOP():分析栈栈顶为动作符时的处理函数backpatch(int i,int res):四元式跳转地址回填函数,回填第i个四元式的跳转地址grammerAnalyse():LL1翻译器总控函数outputLL1():把LL1分析过程(分析栈、余留单词、语义栈)输出到当前工程的output目录

21、下的LL1.txt文件中保存。outputFourElem():把生成的四元式列表fourElemList输出到当前工程的output目录下的FourElement.txt文件中保存。3、状态图5、操作说明1、操作界面:2、按钮说明:(1)、“浏览”,点击浏览按钮选择所要打开的C程序源文件。(2)、“确定”,选择要打开的源文件后,点击确定按钮将源文件读出并显示在下面的文本框中。(3)、“词法分析”,点击词法分析按钮,对文本框里的程序进行词法分析并弹出一个新的窗口显示词法分析的结果(单词表和错误信息)。(4)、“语法分析”,点击语法分析按钮,对文本框里的程序进行语法分析并弹出一个新的窗口显示LL

22、1语法分析的过程和结果(每一步的分析栈、语义栈、余留单词、错误信息)。(5)、“单词表”,点击“单词表”按钮可查看单词表。(6)、“四元式”,点击“四元式”按钮可查看最后生成的四元式。6、 测试报告1、 测试用例1(测试for语句嵌套)源程序:void main() int sum=0,mul=1;for(int i=1;i0;j-)mul=mul*j;sum=sum+mul;词法分析结果:语法分析结果:生成的四元式:程序输出文件列表:2、 测试用例2(测试if-else嵌套)源程序:void main() int a=5,b=4,c=3;if(ab)b=a;if(cb)b=c;elseb=b;else b=b;四元式:3、测试用例3(源程序有非法标识符及语法错误)源程序:void main()int a1,b,c;/非法标识符a=1;b=2;if(ab)c+1;/*错误语句*/elsec=0;while(ba)a=a+1;scanf(c);词法分析结果:改正非法标识符错误后进行语法分析结果如下:7、 光盘所附源代码文件列表

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!