收藏 分享(赏)

编译原理_实验报告.doc

上传人:dzzj200808 文档编号:2769485 上传时间:2018-09-27 格式:DOC 页数:24 大小:185KB
下载 相关 举报
编译原理_实验报告.doc_第1页
第1页 / 共24页
编译原理_实验报告.doc_第2页
第2页 / 共24页
编译原理_实验报告.doc_第3页
第3页 / 共24页
编译原理_实验报告.doc_第4页
第4页 / 共24页
编译原理_实验报告.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

1、1编译原理实验报告编译原理实验教学大纲一、课程名称:编译原理(Principle of Compiler)二、课程编码:4111204三、课程总学时: 72 学时理论: 54 学时;实验: 18 学时四、课程总学分: 4 学分五、适用专业和开课学期:计算机科学与技术专业,第 7学期。六、实验的目的与任务:编译原理是计算机类专业特别是计算机软件专业的一门重要专业课。设置该课程的目的在于系统地向学生讲述编译系统的结构、工作流程及编译程序各组成部分的设计原理和实现技术,使学生通过学习既掌握编译理论和方法方面的基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力。编译原理是一门理论性和实践性

2、都比较强的课程。进行上机实验的目的是使学生通过完成上机实验题目加深对课堂教学内容的理解。同时培养学生实际动手能力。七、主要仪器设备及台(套)数:一人一机。八、主要实验教材(指导书)及参考用书:1编译原理 ,吕映芝、张素琴、蒋维杜,清华大学出版社,1998 年出版2 编译程序设计原理 ,杜书敏、王永宁,北京大学出版社,1988 年出版3 计算机编译原理 ,张幸儿,科学出版社,1999 年出版4编译程序原理与技术 ,李赣生等,清华大学出版社,1997 年 10月出版。九、成绩考核方式及评分标准:由指导教师结合实验报告质量及学习态度等采用 5级记分制评分。实验成绩占期终综合测评成绩的 30%。十、实

3、验开出率:100% 十一、实验项目与要求:序号 实验项目名称学时项目要求项目性质项目类别每台(套)仪器人数 目的要求1 词法分析 4 必修 设计 操作 微机,每人一台。1确定编译中使用的表格、词法分析器的输出形式、标识符与关键字的区分方法。2把词法分析器设计成一个独立的过程。2 语法分析 10 必修 设计 操作 微机,每人一台。1语法分析和语义分析合在一起实现。2把语法分析器设计成一个独立的过程。3 语义分析 4 必修 设计 模拟 微机,每人一台。1确定中间代码的形式,使中间代码不依赖于任何具体的计算机,对中间代码实现四元式的转换。2把该转换器设计成一个独立的程序。2实验一:词法分析一、实验目

4、的给出 PL/0文法规范,要求编写 PL/0语言的词法分析程序。二、实验准备微机 CPU主频 1.3G以上,128M 内存,安装好 C语言,PASCAL 语言,或 C+。三、实验时间6学时四、实验内容已给 PL/0语言文法,输出单词(关键字、专用符号以及其它标记) 。二实验内容 1、格式输入:源程序文件。 输出:关键字、专用符号以及其它标记。 2、编译对象: 包含如下基本内容 1) 变量说其它标记: 明语句 2) 赋值语句 3) 条件转移语句 4) 表达式(算术表达式和逻辑表达式) 5) 循环语句 6) 过程调用语句3、 实现过程本次实验所用的语言为标准 C,以下同。本功能实现的主函数为 ge

5、tToken函数。通过从文件中读取字符到缓冲区中并由 C语言字符的状态转换图流程判断返回一个字符(Token) 。分析出来的 Token主要分为关键字,专用符号,标记符号。本实验实现的 C语言的基本词法如下:关键字: els if int return void while专用符号: + - * / = = != = ; , ( ) /* */其它标记: id num ID = letter letter*NUM = digit digit*letter = a|b|.|z|A|B|.|Z|ditit= 0|1|.|9通过在 C语言中定义一个枚举类型来识别这些符号:PL/0语言的 EBNF表示

6、:=;:=|;:=+|-:=*|/:=|#|=:=a|b|X|Y|Z:=0|1|2|8|94、主体结构的说明在这里说明部分告诉我们使用的 LETTER,DIGIT, IDENT(标识符,通常定义为字母开头的字母数字串)和 STR(字符串常量,通常定义为双引号括起来的一串字符)是什么意思.这部分也可以包含一些初始化代码.例如用#include 来使用标准的头文件和前向说明(forward ,references).这些代码应该再标记“%“和“%“之间;规则部分可以包括任何你想用来分析的代码;我们这里包括了忽略所有注释中字符的功能,传送 ID名称和字符串常量内容到主调函数和 main函数的功能.5

7、、实现原理程序中先判断这个句语句中每个单元为关键字、常数、运算符、界符,对与不同的单词符号给出不同编码形式的编码,用以区分之。三:设计过程31 关键字:void,main,if,then,break,int,Char,float,include,for,while,printfscanf 并为小写。 2“+”;”-”;”*”;”/”;”:=“;”:”;”“;”=“;”“|“.“|“!“|“|“+“|“-“|“*“|“for(i=0;i#include#include #includeint i,j,k,flag,number,status;/*status which is use to ju

8、dge the string is keywords or not!*/char ch;char words10 = “ “;char program500;int Scan(char program)char *keywords13 = “void“,“main“,“if“,“then“,“break“,“int“, “char“, “float“, “include“,“for“,“while“,“printf“, “scanf“;number = 0; status = 0;j = 0;ch = programi+; /* To handle the lettle space ands

9、tab*/*handle letters*/if (ch = a) wordsj = 0;ch= programi+;if (ch = =)wordsj+ = ch;wordsj = 0;flag = 403;elsei-;flag = 404;break;case“.“CONST,;“=“ “VAR , “|“; “PROCEDURE ;“|“:=“BEGIN ; END“ |ODD “ +|- 还有 10条规则构成了 PL/0语言,为此文法写一个语法分析器。CONST A=10; VAR B,C; PROCEDURE Q;VAR X;BEGINREAD(X);B:=X;WHILE X#0

10、X:=X-1;END;BEGINWRITE(A);CALL Q;END.(1)PL/0编译程序结构PL/0源程序词法分析程序语法分析程序代码生成程序表格管理程序出错处理程序目标程序10递归子程序法:对于每个非终结符,编写一个子程序,由该子程序负责识别该语法单位是否正确。表达式的文法表达式=+|-项(+|-) 项项=因子(*|/) 因子因子=标识符|无符号整数|( 表达式 ) 表达式的递归子程序实现procedure expr;beginif sym in plus, minus thenbegingetsym; term; endelse term;while sym in plus, min

11、us dobegingetsym; term;endend;项=因子(*|/) 因子 项的递归子程序实现procedure term;beginfactor;while sym in times, slash dobegingetsym; factor;endend;因子=标识符|无符号整数|( 表达式 ) 因子的递归子程序实现procedure factor;begin if sym number then if sym = ( thenbegingetsym;expr;if sym = ) then getsymelse errorendelse errorelse getsymelse

12、getsymend; 11程序核心代码和注释:public void analyzer()/*/循环读取grammar.txt/*/*此处代码略*/*/循环读取 lengh.txt/*/*此处代码略*/*/ 读入文件,进行语法分析/*string strReadFile;strReadFile=“input.txt“;myTextRead.myStreamReader=new StreamReader(strReadFile);string strBufferText;int wid =0;Console.WriteLine(“分析读入程序(记号ID):n“);dostrBufferText

13、=myTextRead.myStreamReader.ReadLine();if(strBufferText=null)break;foreach (String subString in strBufferText.Split()if(subString!=“)int ll;if(subString!=null)ll= subString.Length; /每一个长度elsebreak;int a=ll+1;char b = new chara;StringReader sr = new StringReader(subString);sr.Read(b, 0, ll); /把substri

14、ng 读到char数组里int sort=(int)b0;/ wordi 和 wordNumi对应12/先识别出一整个串,再根据开头识别是数字还是字母Wordwid=subString;if(subString.Equals(“void“)wordNumwid=0;else if(subString.Equals(“main“)wordNumwid=1;else if(subString.Equals(“()“)wordNumwid=2;else if(subString.Equals(“)wordNumwid=3;else if(subString.Equals(“int“)wordNumw

15、id=4;else if(subString.Equals(“=“)wordNumwid=6;else if(subString.Equals(“)wordNumwid=22;else if(subString.Equals(“;“)wordNumwid=23;else /识别变量和数字if(sort47statep2=t;symbolp2=Convert.ToString(wordNump1);p1=p1+1;myTextRead.myStreamReader.Close();Console.Read();15实验三:语义分析一、实验目的给出 PL/0文法规范,要求编写 PL/0语言的语义分

16、析程序。二、实验准备微机 CPU主频 1.3G以上,128M 内存,安装好 C语言,PASCAL 语言,或 C+。三、实验时间6学时四、实验内容已给 PL/0语言文法,条件语句的翻译分析程序设计(输出四元式)题 目: 条件语句的翻译分析程序设计(输出四元式) 初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1) 写出符合 LL(1)法的文法及属性文法。 (2) 完成题目要求的中间代码四元式的描述。 (3) 写出 LL(

17、1)法的思想,完成语义分析程序设计。 (4) 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5) 设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 问题描述; 文法及属性文法的描述; 语法分析方法及中间代码形式的描述; 简要的分析与概要设计;详细的算法描述; 给出软件的测试方法和测试结果。 五、源代码程序:#include “stdio.h“#include “stdlib.h“#define MaxRuleNum 8#define MaxVnNum 5#define MaxVtNum 5#define MaxStackDepth 20#define MaxP

18、Length 20#define MaxStLength 50/*-main struct define-*/*声明:非终结符序号 = 100 + Vn 的下标终结符序号 = Vn 的下标*/*+文法结构+*/struct pRNode /*产生式右部结构*/int rCursor; /*右部序号*/struct pRNode *next;struct pNode /*产生式结点结构*/int lCursor; /*左部符号序号*/int rLength; /*右部长度*/16/*注当 rLength = 1 时,rCursor = -1 为空产生式*/struct pRNode *rHead

19、; /*右部结点头指针*/;char VnMaxVnNum + 1; /*非终结符集*/int vnNum;char VtMaxVtNum + 1; /*终结符集*/int vtNum;struct pNode PMaxRuleNum; /*产生式*/int PNum; /*产生式实际个数*/char bufferMaxPLength + 1;char ch; /*符号或 string ch;*/char stMaxStLength; /*要分析的符号串*/*+first and follow collect struct+*/struct collectNode /*集合元素结点结构*/in

20、t nVt; /*在终结符集中的下标*/struct collectNode *next;struct collectNode* firstMaxVnNum + 1; /*first集*/struct collectNode* followMaxVnNum + 1; /*follow集*/*+analysis table struct+*/int analyseTableMaxVnNum + 1MaxVtNum + 1 + 1;/*预测分析表存放为产生式的编号,+1 用于存放结束符,多+1 用于存放#(-1)*/*+analysis stack struct+*/int analyseStac

21、kMaxStackDepth + 1; /*分析栈*/int topAnalyse; /*分析栈顶*/*int reverseStackMaxStackDepth + 1; /*颠倒顺序栈*/*int topReverse; /*倒叙栈顶*/*-function declare-*/void Init();/*初始化*/int IndexCh(char ch);/*返回 Vn在 Vn表中的位置+100、Vt 在 Vt表中的位置,-1 表示未找到*/void InputVt(); /*输入终结符*/void InputVn();/*输入非终结符*/void ShowChArray(char* c

22、ollect, int num);/*输出 Vn或 Vt的内容*/void InputP();/*产生式输入*/bool CheckP(char * st);/*判断产生式正确性*/void First(int U);/*计算 first集,U-xx.*/void AddFirst(int U, int nCh); /*加入 first集*/bool HaveEmpty(int nVn); /*判断 first集中是否有空(-1)*/void Follow(int V);/*计算 follow集*/void AddFollow(int V, int nCh, int kind);/*加入 fo

23、llow集,kind = 0表加入 follow集,kind = 1 加入 first集*/void ShowCollect(struct collectNode *collect);/*输出 first或 follow集*/void FirstFollow();/*计算 first和 follow*/void CreateAT();/*构造预测分析表*/void ShowAT();/*输出分析表*/void Identify(char *st);/*主控程序,为操作方便*/*分析过程显示操作为本行变换所用,与教程的显示方式不同*/void InitStack();/*初始化栈及符号串*/vo

24、id ShowStack();/*显示符号栈中内容*/17void Pop();/*栈顶出栈*/void Push(int r);/*使用产生式入栈操作*/LL1.CPP :/*-*/#include “LL1.h“/*-main function-*/void main(void)char todo,ch;Init();InputVn();InputVt();InputP();getchar();FirstFollow();printf(“所得 first集为:“);ShowCollect(first);printf(“所得 follow集为:“);ShowCollect(follow);C

25、reateAT();ShowAT();todo = y;while(y = todo)printf(“n是否继续进行句型分析?(y / n):“);todo = getchar();while(y != todo todo = getchar();if(y = todo)int i;InitStack();printf(“请输入符号串(以#结束) : “);ch = getchar();i = 0;while(# != ch pt-next = NULL;Pi.rHead = pt;n = 4;while(0 != buffern)qt = (pRNode*)malloc(sizeof(pRN

26、ode);qt-rCursor = IndexCh(buffern);qt-next = NULL;pt-next = qt;pt = qt;n+;20Pi.rLength = n - 3;i+;/*调试时使用*/elseprintf(“输入符号含非法在成分,请重新输入!n“);/*判断产生式正确性*/bool CheckP(char * st)int n;if(100 IndexCh(st0)return false;if(- != st1)return false;if( != st2)return false;for(n = 3; 0 != stn; n +)if(-1 = IndexC

27、h(stn)return false;return true;/*=first for(i = 0; i pt-rCursor)/*注:此处因编程出错,使空产生式时rlength同样是 1,故此处同样可处理空产生式*/AddFirst(U, pt-rCursor);break;elseif(NULL = firstpt-rCursor - 100)First(pt-rCursor); AddFirst(U, pt-rCursor);if(!HaveEmpty(pt-rCursor)break;elsept = pt-next;j+;if(j = Pi.rLength) /*当产生式右部都能推出

28、空时*/AddFirst(U, -1);/*#用-1 表示,kind 用于区分是并入符号的first集,还是 follow集kind = 0表加入 follow集,kind = 1加入 first集*/void AddFollow(int V, int nCh, int kind)struct collectNode *pt, *qt;int ch; /*用于处理 Vn*/pt = NULL;qt = NULL;if(nCh nVt = nCh)break;elseqt = pt;pt = pt-next;if(NULL = pt)pt = (struct collectNode *)mall

29、oc(sizeof(struct collectNode);21pt-nVt = nCh;pt-next = NULL;if(NULL = followV - 100)followV - 100 = pt;elseqt-next = pt; /*qt指向 follow集的最后一个元素*/pt = pt-next;else /*为非终结符时,要区分是加 first还是 follow*/if(0 = kind)pt = follownCh - 100;while(NULL != pt)ch = pt-nVt;AddFollow(V, ch, 0);pt = pt-next;elsept = fir

30、stnCh - 100;while(NULL != pt)ch = pt-nVt;if(-1 != ch)AddFollow(V, ch, 1);pt = pt-next;/*输出 first或 follow集*/void ShowCollect(struct collectNode *collect)int i;struct collectNode *pt;i = 0;while(NULL != collecti)pt = collecti;printf(“n%c:t“, Vni);while(NULL != pt)if(-1 != pt-nVt)printf(“ %c“, Vtpt-nVt

31、);elseprintf(“ #“);pt = pt-next;i+;printf(“n“);/*计算 first和 follow*/void FirstFollow()int i;i = 0;while(0 != Vni)if(NULL = firsti)First(100 + i);i+;i = 0;while(0 != Vni)if(NULL = followi)Follow(100 + i);i+;/*=构造预测分析表,例:U:xyz=*/void CreateAT()int i;struct pRNode *pt;struct collectNode *ct;for(i = 0; i

32、 rCursor) /*处理非终结符,当为终结符时,定含空为假跳出*/ct = firstpt-rCursor - 100;22while(NULL != ct)if(-1 != ct-nVt)analyseTablePi.lCursor - 100ct-nVt = i;ct = ct-next;pt = pt-next;if(NULL = pt)/*NULL = pt,说明 xyz-,用到follow中的符号*/ct = followPi.lCursor - 100;while(NULL != ct)if(-1 != ct-nVt)analyseTablePi.lCursor - 100ct

33、-nVt = i;else /*当含有#号时*/analyseTablePi.lCursor - 100vtNum = i;ct = ct-next;elseif(100 rCursor) /*不含空的非终结符*/ct = firstpt-rCursor - 100;while(NULL != ct)analyseTablePi.lCursor - 100ct-nVt = i;ct = ct-next;else /*终结符或者空*/if(-1 = pt-rCursor) /*-1为空产生式时*/ct = followPi.lCursor - 100;while(NULL != ct)if(-1

34、 != ct-nVt)analyseTablePi.lCursor - 100ct-nVt = i;else /*当含有#号时*/analyseTablePi.lCursor - 100vtNum = i;ct = ct-next;else /*为终结符*/analyseTablePi.lCursor - 100pt-rCursor = i;/*输出分析表*/void ShowAT()int i,j;printf(“构造预测分析表如下:n“);printf(“t|t“);for(i = 0; i analyseStacktopAnalyse) /*当为终结符时*/if(analyseStack

35、topAnalyse = IndexCh(stcurrent)/*匹配出栈,指示器后移*/Pop();current+;step+;printf(“%dt“, step);ShowStack();printf(“tt%ctt出栈、后移n“, stcurrent);elseprintf(“%c-%c不匹配!“, analyseStacktopAnalyse, stcurrent);printf(“此串不是此文法的句子!n“);return;else /*当为非终结符时*/r = analyseTableanalyseStacktopAnalyse - 100IndexCh(stcurrent);

36、if(-1 != r)Push(r); /*产生式右部代替左部,指示器不移动*/step+;printf(“%dt“, step);ShowStack();printf(“tt%ctt%dn“, stcurrent, r);elseprintf(“无可用产生式,此串不是此文法的句子!n“);return;if(# = stcurrent)if(0 = topAnalyse printf(“%dt“, step);ShowStack();printf(“tt%ctt分析成功!n“, stcurrent);printf(“%s是给定文法的句子!n“, st);elsewhile(topAnalys

37、e 0)if(100 analyseStacktopAnalyse) /*当为终结符时*/printf(“无可用产生式,此串不是此文法的句子!n“);return;elser = analyseTableanalyseStacktopAnalyse - 100vtNum;if(-1 != r)Push(r); /*产生式右部代替左部,指示器不移动*/step+;printf(“%dt“, step);ShowStack();if(0 = topAnalyse 24printf(“%s是给定文法的句子!n“, st);else printf(“tt%ctt%dn“, stcurrent, r);elseprintf(“无可用产生式,此串不是此文法的句子!n“);return;/*初始化栈及符号串*/void InitStack()int i;/*分析栈的初始化*/for(i = 0; i rCursor) /*为空产生式时*/return;topAnalyse += Pr.rLength;for(i = 0; i rCursor;/*逆序入栈*/pt = pt-next;/*循环未完时 pt为空,则说明 rLength记录等出错*/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报