版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上编译器的设计与分析学 号: 姓 名: 李 博 专 业: 计算机科学与技术 _课 程: 编译原理 指导教师: 闫 红 实验目的本实验设计的小型编译程序涉及到编译前端的三个阶段:词法分析、语法分析和语义分析生成中间代码(四元式),编译程序的重点放在中间代码生成阶段。编译程序的输出结果包括词法分析后的二元式序列、变量名表;语法分析后的状态栈分析过程显示;语义分析生成中间代码后的四元式程序。整个程序分为三个部分:(1)词法分析部分(2)语法分析、语义分析及四元式生成部分(3)输出显示部分实验要求:本程序仅考虑由下面产生式所定义的程序语句:S if B then S else
2、S | while B do S | begin L end | AL S;L | SA i:= EB BB|BB|B|(B)|I rop i|i 其中,各个非终结符的含义是:S-语句L语句串A赋值句B-布尔表达式E-算术表达式各个终结符的含义:i-整型变量或常数,布尔变量或常数;rop-为六种关系运算符的代表;-起语句分隔作用;:=-赋值符号-逻辑非运算符;-逻辑与运算符;-逻辑或运算符;规定程序是由一条语句或由begin和end嵌套起来的复合语句组成的,并且规定的语句末加上#表示程序结束。下面是符合规定的程序示例: begin A:=A+B*C; C:=A+2; while A<C
3、do while A>B do if M=N THEN C:=D else while A<=D do A:=Dend#实验内容:第一部分:词法分析一词法分析的功能:输入:所给文法的源程序字符串输出:1.二元组(单词种别,单词符号的属性值)构成的序列2.关键字: (相当于Pascal语言中的begin) , if ,else , while , (相当于Pascal语言中的end ) 所有的关键字都是小写字母. 3.运算符: + , - , * , / , = , < , <= , = , > , >= ,<> , && ,| ,
4、 ! 4.界 符: 逗号 ,分号 ,左圆括号 , 右圆括号 , # 5.常 数: 在这里只涉及到int型常量 6.其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义: ID = letter(letter|digit)*NUM = digit digit * 7.空格由空白,制表符和换行符组成,空格一般用来分隔ID,NUM,运算符,界符和关键字,词法分析阶段通常会被过滤掉。二词法分析程序设计 单 词内部码编码号If Sy_if0thenSy_then1elseSy_else2whileSy_while3beginSy_begin4DoSy_do5endSy_end6andop_a
5、nd39Orop_or40notop_not41+Plus34*Times36:becomes38;Semicolon 8(lparent48)rparent49AccAcc-2=rop423.自动机转换图三程序实现数据结构:struct nTabint tc;int fc;nTab2200;int Label = 0;struct rWordschar sp10;int sy;struct rWords ResWords10 = "if",Sy_if,"do",Sy_do,"else",Sy_else,"while&quo
6、t;,Sy_while,"then",Sy_then,"begin",Sy_begin,"end",Sy_end,"and",op_and,"or",op_or,"not",op_not;struct aa int sy1;int pos;buf1000,n,n1,E,sstack100,ibuf100,stack1000;void ReadLine( )char ch1;Pline = Line;ch1 = cfile.get();while( ch1 != 'n&
7、#39;)*Pline = ch1;Pline +;ch1 = cfile.get();*Pline = '0'Pline = Line;void Readch( )if (ch = '0')ReadLine( );Lnum +;ch = *Pline;Pline +;void Scan ( ) while (ch != '') switch(ch) case ' ':break;case 'a': case 'b':case 'c':case 'd':case
8、39;e':case 'f':case 'g':case 'h':case 'i':case 'j':case 'k':case 'l':case 'm':case 'n':case 'o':case 'p':case 'q':case 'r':case 's':case 't':case 'u':case 'v':c
9、ase 'w':case 'x':case 'y':case 'z':Identifer( );break;case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':Number(); break;case '<': Readch(
10、 ); if (ch ='=') bufCount.pos = 0; else if (ch = '>') bufCount.pos = 4; else bufCount.pos = 1; Pline -; bufCount.sy1 = rop; Count +; break;case '>': Readch( ); if (ch ='=') bufCount.pos = 2; else bufCount.pos = 3; Pline -; bufCount.sy1 = rop; Count +; break;case
11、'(': bufCount.sy1 = lParent;Count +;break;case')':bufCount.sy1 = rParent;Count +; break;case'#':bufCount.sy1 = JingHao;Count +; break;case'+':bufCount.sy1 = Plus;Count +; break;case'*':bufCount.sy1 = Times;Count +; break;case':': Readch();if (ch ='
12、=') bufCount.sy1 = Becomes;Count +; break;case'=':bufCount.sy1 = rop;bufCount.pos = 5;Count +; break;case'':bufCount.sy1 = Semicolon;Count +; break; Readch( );bufCount.sy1 = -1;nt Find(char spe1 )int ss1 = 0;int ii = 0;while (ss1 = 0 && ii < nLength) if (!strcmp(spe1,n
13、Tab1ii) ss1 = 1;ii +;if (ss1 = 1) return ii - 1;elsereturn -1;void Identifer( )int i = 0,j,k = 0;int ss = 0;do Spellingk = ch;k+;Readch( ); while(ch >= 'a' && ch <= 'z') | (ch >='0' && ch <= '9'); Pline -;Spelling k = '0' while (ss
14、= 0 && i < 10)if (!strcmp(Spelling,ResWordsi.sp) ss = 1;i +;if (ss = 1) bufCount.sy1 = ResWordsi - 1.sy;elsebufCount.sy1 = ident;j = Find(Spelling);if (j = -1)bufCount.pos = tt1;strcpy(nTab1tt1,Spelling);tt1 +;nLength +;else bufCount.pos = j;Count +;for (k = 0; k < 10; k+)Spellingk =
15、39; 'void Number( )int iValue = 0;int digit;do digit = ch -'0'iValue = iValue * 10 + digit;Readch( ); while (ch >= '0' && ch <= '9');bufCount.sy1 = intConst;bufCount.pos = iValue;Count +;Pline -;四心得体会此次实验让我了解了如何设计、编制并调试词法分析程序,并加深了我对词法分析器原理的理解;熟悉了直接构造词法分析器的方法
16、和相关原理,并学会使用c+语言直接编写词法分析器;同时更熟练的掌握用c+语言编写程序,实现一定的实际功能。通过这次实验,我对词法分析器有了进一步的了解,把理论知识应用于实验中。也让我重新熟悉了C+语言的相关内容,加深了对C语言知识的深化和用途的理解。第二部分 语法分析一根据给定的文法画出算术表达式、布尔表达式、程序语句的LR(0)项目集规范族,验证上述的SLR分析表是否正确。算术表达式的LR分析表算术表达式文法GE如下:EE+E|E*E|(E)|i将文法GE拓广为文法GE:(0)SE(1)EE+E(2)EE*E(3)E(E)(4)Ei算术表达式的SLR(1)分析表状态 ACTIONGOTOI+
17、*()# E0S3S2 11S4S5ACC2S3S2 63R4R4R4R44S3S2 75S3S2 86D4S5S97R1S5R1R18R2R2R2R29R3R3R3R3布尔表达式的分析表布尔表达式的文法如下:B BB|BB|B|(B)|i rop i|i为了便于语法分析加工处理。将文法改为如下形式GS:B BAB|BOB|B|(B)|i rop i|iBA BBOB将文法拓广为GS:(0)SB(1)Bi(2)Bi rop i(3)B(B)(4)Bnot B(5)AB and(6)BAB(7)OBor(8)BOB布尔表达式的SLR(1)分析表:状态 ACTION GOTOIrop()notan
18、dor#BAO0S1S4S313781S2R1R1R1R12S33R2R2R2R24S1S4S511785S1S4S56786R4S9S10R47S1S4S514788S1S4S515789R5R5R510R7R7R711S12S9S1012R3R3R3R313S9S10ACC14R6S9S10R615R8S9S10R8程序语句的分析表程序语句的文法如下:Sif e then S else S| while e do S|begin L end|aLS;L|S由于在编译程序设计与实现中,我们将赋值语句与算术表达式归为一类处理,故在此将赋值语句仅看成为程序语句中的一个终结符a,将布尔表达式B也看
19、作为终结符e。将文法拓广为:(0)SS(1)Sif e then S else S(2)Swhile e do S (3) Sbegin L end (4)Sa(5)LS(6)LS;L程序语句的SLR(1)分析表:状态 ACTION GOTOifthenelseWhilebegindoenda;e#SL0S3S3S511ACC2S63S74S2S3S4S5985R4R4R4R46S107S118S129R5S1310S2S3S4S51411S2S3S4S51512R3R3R3R313S2S3S4S591614S1715R2R2R2R216R617S2S3S4S51818R1R1R1R1二语法分
20、析程序的设计1分析框图,即程序之间的调用关系2,四元式的结构形式。三程序实现数据结构struct aa int sy1;int pos;buf1000,n,n1,E,sstack100,ibuf100,stack1000;算法设计void Readnu( )if (pbuf -> sy1 >= 0)n.sy1 = pbuf -> sy1;n.pos = pbuf -> pos;pbuf+;int newTemp( )newt +;return newt;int Gen (char op1,struct aa arg11,struct aa arg22,int resul
21、t1)strcpy(fexpnxq.op,op1);fexpnxq.arg1.sy1 = arg11.sy1;fexpnxq.arg1.pos = arg11.pos;fexpnxq.arg2.sy1 = arg22.sy1;fexpnxq.arg2.pos = arg22.pos;fexpnxq.result = result1;nxq +;return nxq - 1;int Merg(int p1,int p2)int p;if ( p2 = 0 ) return p1;elsep = p2;while (fexpp.result != 0) p = fexpp.result;fexpp
22、.result = p1;return p2;void BackPatch(int p,int t)int tempq;int q;q = p;while (q != 0)tempq = fexpq.result;fexpq.result = t;q = tempq;int Change1(int chan)switch(chan)case intConst:case ident: return 0;case Plus: return 1;case Times: return 2;case lParent: return 3;case rParent: return 4;case JingHa
23、o: return 5;case Tempsy:return 6;int Change2(int chan)switch(chan)case intConst:case ident:return 0;case rop:return 1;case lParent:return 2;case rParent: return 3;case op_not:return 4;case op_and:return 5;case op_or:return 6;case JingHao:return 7;case Tempsy:return 8;case EA:return 9;case EO:return
24、10;int Test(int value)switch(value)case intConst:case ident:case Plus:case Times:case Becomes:case lParent:case rParent:case rop:case op_and:case op_or:case op_not:return 1;default:return 0;int LrParse()int i1 = 0;int num = 0;if (Test(n.sy1)if (stacksp.sy1 = Sy_while)sign = 2;elseif (stacksp.sy1 = S
25、y_if) sign = 3;else sign = 1;doibufi1.sy1 = n.sy1;ibufi1.pos = n.pos;Readnu( );i1 +;while (Test(n.sy1);ibufi1.sy1 = JingHao;pbuf -;sstack0.sy1 = JingHao;ssp = 0;if (sign = 1)sp1 = 0;stack1sp1 = 0;num = 2;n1.sy1 = ibufnum.sy1;n1.pos = ibufnum.pos;LrParse1(num);n.sy1 = a; if (sign = 2 | sign = 3)Point
26、Mark +;LabelMarkPointMark.nxq1 = nxq;sp1 = 0;stack1sp1 = 0;num = 0;n1.sy1 = ibufnum.sy1;n1.pos = ibufnum.pos;LrParse2(num);LabelMarkPointMark.tc1 = nTab2Label - 1.tc;LabelMarkPointMark.fc1 = nTab2Label - 1.fc;BackPatch(LabelMarkPointMark.tc1,nxq);n.sy1 = e;Ir = actionstacksp.posn.sy1;cout << s
27、p <<"t" <<stacksp.pos<<"t"<<n.sy1<<"t"<<Ir<<"n"if (Ir < 19 && Ir >= 0)sp +;stacksp.pos = Ir;stacksp.sy1 = n.sy1;Readnu( );LrParse( ); if (Ir <= 106 && Ir >= 100)switch (Ir)case 100:break;cas
28、e 101:cout <<"S->if e then S else S归约n"sp = sp - 6;n.sy1 = S;fexpLabelTempPointTemp.result = nxq;PointTemp -;if (stacksp.sy1 = Sy_then)Gen("j",oth1,oth1,0);BackPatch(LabelMarkPointMark.fc1,nxq);PointTemp +;LabelTempPointTemp = nxq - 1;PointMark -;if (stacksp.sy1 = Sy_do)
29、Gen("j",oth1,oth1,LabelMarkPointMark.nxq1);BackPatch(LabelMarkPointMark.fc1,nxq);break;case 102:cout <<"S->while e do S归约n"sp = sp -4;n.sy1 = S;if (stacksp.sy1 = Sy_do)Gen("j",oth1,oth1,LabelMarkPointMark.nxq1);BackPatch(LabelMarkPointMark.fc1,nxq);if (stacksp.sy1 = Sy_then)Gen("j",oth1,oth1,0);fexpLabelMarkPointMark.fc1.result = nxq;PointTemp +;LabelTempPointTemp = nxq - 1;break;case 103:cout <<"S->begin L end 归约n&q
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 居民健康档案管理培训
- 数控车削加工技术 课件 项目四 数控车削仿真加工
- 四川省成都市西藏中学2024-2025高一(1-5班)10月月考历史试卷 - 副本
- 黑龙江省绥化市海伦市第三中学2023-2024学年九年级上学期期中考试化学试卷(含解析)
- T-ZFDSA 01-2024 当归生姜羊肉汤制作标准
- 江苏省泰州市姜堰区2024-2025学年七年级上学期11月期中考试数学试题(无答案)
- 算法工程师面试真题单选题100道及答案解析
- 人教版PEP(2024)三年级上册《Unit 6 Useful numbers》Part A第2课时-教学课件
- 日常生活活动能力训练版
- 圪柳沟安全生产责任制
- 狭缝式涂布机行业报告
- 摩托车电动化技术方案
- 新媒体视觉设计之新媒体视觉设计基本原则
- 2024年高考生物一轮复习特异性免疫课件
- 2024发电企业智慧电厂智慧安防技术方案
- 妇幼保健科医生述职报告妇幼保健工作的案例分析和效果评估
- 新时代高职院校“三四五四”劳动教育体系构建探索
- 卫生院健康扶贫工作实施方案
- 2024年中国融通集团招聘笔试参考题库含答案解析
- YY0499-2023 麻醉和呼吸设备 气管插管用喉镜(OCR)-转自RTF
- 某房地产公司项目定位分析
评论
0/150
提交评论