编译原理-实验报告

上传人:zhu****ng 文档编号:157358656 上传时间:2022-09-29 格式:DOC 页数:24 大小:112.52KB
收藏 版权申诉 举报 下载
编译原理-实验报告_第1页
第1页 / 共24页
编译原理-实验报告_第2页
第2页 / 共24页
编译原理-实验报告_第3页
第3页 / 共24页
资源描述:

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

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

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

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

4、准备微机CPU主频1.3G以上,128M内存,安装好C语言,PASCAL语言,或C+。三、实验时间 6学时四、实验内容已给PL/0语言文法,输出单词(关键字、专用符号以及其它标记)。二实验内容 1、格式输入:源程序文件。 输出:关键字、专用符号以及其它标记。 2、编译对象: 包含如下基本内容 1) 变量说其它标记: 明语句 2) 赋值语句 3) 条件转移语句 4) 表达式(算术表达式和逻辑表达式) 5) 循环语句 6) 过程调用语句3、 实现过程本次实验所用的语言为标准C,以下同。本功能实现的主函数为getToken函数。通过从文件中读取字符到缓冲区中并由C语言字符的状态转换图流程判断返回一个

5、字符(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表示:=;:=|;:=+|-:=*|/:=|#|=:=a|b|X|Y|Z:=0|1|2|8|94、主体结构

6、的说明在这里说明部分告诉我们使用的LETTER,DIGIT, IDENT(标识符,通常定义为字母开头的字母数字串)和STR(字符串常量,通常定义为双引号括起来的一串字符)是什么意思.这部分也可以包含一些初始化代码.例如用#include来使用标准的头文件和前向说明(forward ,references).这些代码应该再标记%和%之间;规则部分>可以包括任何你想用来分析的代码;我们这里包括了忽略所有注释中字符的功能,传送ID名称和字符串常量内容到主调函数和main函数的功能.5、实现原理程序中先判断这个句语句中每个单元为关键字、常数、运算符、界符,对与不同的单词符号给出不同编码形式的编码

7、,用以区分之。三:设计过程1 关键字:void,main,if,then,break,int,Char,float,include,for,while,printfscanf 并为小写。 2+”;”-”;”*”;”/”;”:=“;”:”;”“;”“;”=“;”“;”=“;”(“;”)”;”;”;”#”为运算符。3 其他标记 如字符串,表示以字母开头的标识符。 4 空格符跳过。 5 各符号对应种别码 关键字分别对应1-13运算符分别对应401-418,501-513。字符串对应100常量对应200结束符#四:举例说明目标:实现对常量的判别代码:digit 0-9letter A-Za-zothe

8、r_char !-id (letter|_)(letter|digit|_)*string (letter|digit|other_char)+int_num digit+% |t|n+auto|double|int|struct|break|else|long|switch|case|enum|register|typedef|char|extern|return|union|const|float|short|unsigned|continue|for|signed|void|default|goto|sizeof|do|if|static|while|main Upper(yytext,

9、yyleng);printf(%s,NULLn,yytext);(!-)* printf(CONST_string,%sn,yytext);-?int_num.int_num?(E+|-?int_num)? printf(CONST_real,%sn,yytext);0x?int_num printf(CONST_int,%sn,yytext);,|;|(|)|-|.|!|+|-|*|&|sizeof|/|%|+|-|=|=|=|&=|=|=|= printf(%s,NULLn,yytext);id printf(ID,%sn,yytext);digit(letter)+ printf(err

10、or1:%sn,yytext);%#include Upper(char *s,int l) int i; for(i=0;il;i+) si=toupper(si); yywrap() return 1;五:源程序:#include#include#include #includeint i,j,k,flag,number,status;/*status which is use to judge the string is keywords or not!*/char ch;char words10 = ;char program500;int Scan(char program) cha

11、r *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 tab*/*handle letters*/if (ch = a) & (ch = a) & (ch = z )wordsj+=ch;ch=programi+; i-; wordsj+ = 0; for (k = 0; k = 0) & (ch = 0 ) &

12、 (ch : if (ch = ) wordsj+ = ch; wordsj = 0; ch= programi+; if (ch = =) wordsj+ = ch; wordsj = 0; flag = 403; else i-; flag = 404; break;case: if (ch = ) wordsj+ = ch; wordsj = 0; ch= programi+; if (ch = =) wordsj+ = ch; wordsj= 0; flag = 405; else i-; flag = 406; break;case!: if (ch = !) wordsj+ = c

13、h; wordsj= 0; ch = programi+; if (ch = =) wordsj+ = ch; wordsj= 0; flag= 407; else i-; flag = 408; break;case+: if (ch = +) wordsj+ = ch; wordsj = 0; ch= programi+; if (ch = =) wordsj+ = ch; wordsj = 0; flag= 409; else if (ch = +) wordsj+ = ch; wordsj = 0; flag= 410; else i-;flag= 411; break;case-:

14、if (ch = -) wordsj+ = ch; wordsj = 0; ch= programi+; if (ch = =) wordsj+ = ch;wordsj = 0;flag = 412; else if( ch = -) wordsj+ = ch;wordsj = 0;flag = 413; else i-;flag = 414; break;case*: if (ch = *) wordsj+ = ch; wordsj = 0; ch= programi+; if (ch = =) wordsj+ = ch; wordsj = 0; flag = 415; else i-; f

15、lag = 416; break; case/: if (ch = /) wordsj+ = ch; wordsj = 0; ch= programi+; if (ch = =) wordsj+ = ch; wordsj = 0; flag= 417; else i-; flag = 418; break;case;: wordsj = ch; wordsj+1 = 0; flag = 501; break; case(: wordsj = ch; wordsj+1 = 0; flag = 502; break; case): wordsj = ch; wordsj+1 = 0; flag =

16、 503; break;case: wordsj = ch; wordsj+1 = 0; flag = 504; break; case: wordsj = ch; wordsj+1 = 0; flag = 505; break; case: wordsj = ch; wordsj+1 = 0; flag= 506; break; case: wordsj = ch; wordsj+1 = 0; flag = 507; break; case: wordsj = ch; wordsj+1 = 0; flag = 508; break;case: wordsj = ch; wordsj+1 =

17、0; flag = 509; break;case%: if (ch = %) wordsj+ = ch; wordsj = 0; ch = programi+; if (ch = =) wordsj+ = ch; wordsj = 0; flag= 510; else i-; flag = 511; break;case,: wordsj = ch; wordsj+1 = 0; flag = 512; break;case#: wordsj = ch; wordsj+1 = 0; flag = 513; break;case: wordsj = #; flag = 0; break;defa

18、ult: flag = -1; break;return flag;main()i=0;printf(please input a program end with );do ch = getchar(); programi+ = ch;while(ch != ); i = 0;do flag = Scan(program); if (flag = 200) printf(%2d,%4d),flag,number); else if (flag = -1) printf(%d,error),flag); else printf(%2d,%4s),flag,words); while (flag

19、 != 0); system(pause);实验二:语法分析一、实验目的给出PL/0文法规范,要求编写PL/0语言的语法分析程序。二、实验准备微机CPU主频1.3G以上,128M内存,安装好C语言,PASCAL语言,或C+。三、实验时间 6学时四、实验内容已给PL/0语言文法,利用递归子程序法,编制语法分析程序,要求将错误信息输出到语法错误文件中,输出语法树。 PL/0语法如下:. CONST,; = VAR , | ; PROCEDURE ; | | := BEGIN ; END |ODD +|- 还有10条规则构成了PL/0语言,为此文法写一个语法分析器。CONST A=10; VAR B

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

21、en begin getsym; term; end else term; while sym in plus, minus do begin getsym; term; endend; 项=因子(*|/)因子 项的递归子程序实现procedure term;begin factor; while sym in times, slash do begin getsym; factor; endend;因子=标识符|无符号整数|(表达式)因子的递归子程序实现procedure factor;begin if sym ident then if sym number then if sym = (

22、 then begin getsym; expr; if sym = ) then getsym else error end else error else getsym else getsym end; 程序核心代码和注释:public void analyzer()/*/循环读取grammar.txt/* /*此处代码略*/*/循环读取 lengh.txt/* /*此处代码略*/*/ 读入文件,进行语法分析/*string strReadFile;strReadFile=input.txt;myTextRead.myStreamReader=new StreamReader(strRea

23、dFile);string strBufferText;int wid =0;Console.WriteLine(分析读入程序(记号ID):n);dostrBufferText =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

24、b = new chara;StringReader sr = new StringReader(subString);sr.Read(b, 0, ll); /把substring 读到char数组里int sort=(int)b0;/ wordi 和 wordNumi对应/先识别出一整个串,再根据开头识别是数字还是字母Wordwid=subString;if(subString.Equals(void)wordNumwid=0;else if(subString.Equals(main)wordNumwid=1;else if(subString.Equals()wordNumwid=2;e

25、lse if(subString.Equals()wordNumwid=3;else if(subString.Equals(int)wordNumwid=4;else if(subString.Equals(=)wordNumwid=6;else if(subString.Equals()wordNumwid=22;else if(subString.Equals(;)wordNumwid=23;else /识别变量和数字if(sort47&sort58)wordNumwid=7;else wordNumwid=5;Console.Write(subString+(+wordNumwid+)

26、+ );wid+;Console.WriteLine(n);while (strBufferText!=null);wordNumwid=24;myTextRead.myStreamReader.Close();/*/读入LR分析表/* /*此处代码略*/int state = new int100;string symbol =new string100;state0=0;symbol0=#;int p1=0;int p2=0;Console.WriteLine(n按文法规则归约顺序如下:n);/*/ 归约算法如下所显示/*while(true)int j,k;j=statep2;k=wor

27、dNump1;t=LRj,k; /当出现t为0的时候if(t=0)/错误类型string error;if(k=0)error=void;elseif(k=1)error=main;elseif(k=2)error=();elseif(k=3)error=;elseif(k=4)error=int;elseif(k=6)error=;elseif(k=22)error=;elseif(k=23)error=;elseerror=其他错误符号;Console.WriteLine(n检测结果:);Console.WriteLine(代码中存在语法错误);Console.WriteLine(错误状况

28、:错误状态编号为 +j+ 读头下符号为 +error);break;elseif(t=-100) /-100为达到接受状态Console.WriteLine(n);Console.WriteLine(n检测结果:);Console.WriteLine(代码通过语法检测);break;if(t0)p2=p2+1;statep2=t;symbolp2=Convert.ToString(wordNump1);p1=p1+1;myTextRead.myStreamReader.Close();Console.Read();实验三:语义分析一、实验目的给出PL/0文法规范,要求编写PL/0语言的语义分析

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

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

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

32、指针*/;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 /*集合元素结点结构*/ int nVt; /*

33、在终结符集中的下标*/ 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 analyseStackMaxStackD

34、epth + 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* collect, int num

35、);/*输出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);/*加入follow集, kind = 0表加入foll

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

37、oid 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);CreateAT();ShowAT();todo = y;while(y =

38、todo)printf(n是否继续进行句型分析?(y / n):);todo = getchar();while(y != todo & n != todo)printf(n(y / n)? );todo = getchar();if(y = todo)int i;InitStack();printf(请输入符号串(以#结束) : );ch = getchar();i = 0;while(# != ch & i MaxStLength)if( != ch & n != ch) sti+ = ch; ch = getchar(); if(# = ch & i MaxStLength) sti =

39、 ch; Identify(st); else printf(输入出错!n); getchar();/*-function definition-*/void Init() int i,j; vnNum = 0; vtNum = 0; PNum = 0; for(i = 0; i = MaxVnNum; i+) Vni = 0; for(i = 0; i = MaxVtNum; i+) Vti = 0; for(i = 0; i MaxRuleNum; i+) Pi.lCursor = NULL; Pi.rHead = NULL; Pi.rLength = 0; PNum = 0; for(i = 0; i = MaxPLength; i+) bufferi = 0; for(i = 0; i MaxVnNum; i+) firsti = NULL; followi = NULL; for(i = 0; i = MaxVnNum; i+) for(j = 0; j = MaxVnNum + 1; j+) analyseTableij

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