![编译原理实验报告_第1页](http://file1.renrendoc.com/fileroot_temp2/2020-6/22/3b6e47d2-3535-4be8-8171-619131e56fa1/3b6e47d2-3535-4be8-8171-619131e56fa11.gif)
![编译原理实验报告_第2页](http://file1.renrendoc.com/fileroot_temp2/2020-6/22/3b6e47d2-3535-4be8-8171-619131e56fa1/3b6e47d2-3535-4be8-8171-619131e56fa12.gif)
![编译原理实验报告_第3页](http://file1.renrendoc.com/fileroot_temp2/2020-6/22/3b6e47d2-3535-4be8-8171-619131e56fa1/3b6e47d2-3535-4be8-8171-619131e56fa13.gif)
![编译原理实验报告_第4页](http://file1.renrendoc.com/fileroot_temp2/2020-6/22/3b6e47d2-3535-4be8-8171-619131e56fa1/3b6e47d2-3535-4be8-8171-619131e56fa14.gif)
![编译原理实验报告_第5页](http://file1.renrendoc.com/fileroot_temp2/2020-6/22/3b6e47d2-3535-4be8-8171-619131e56fa1/3b6e47d2-3535-4be8-8171-619131e56fa15.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 编译原理实验报告学院:计算机科学与技术学院专业:软件工程1202 姓名: 学号: 目录一.题目3二.词法分析器31.词法分析描述32.词法分析算法思想33.分析过程34.各种单词符号对应的种别码45.实现过程5三.语法分析器5LR(1)语法分析53.LR研究问题61.LR分析器结构62.算法思想63.LR(1)解决问题6LL1语法分析71.语法流程72.逻辑结构83.LL1研究问题8四.总结10五.源代码10词法分析源码10LR(1)源代码12LL1源代码15一.题目编译原理词法分析与语法分析实验。二.词法分析器1.词法分析描述(1),词法分析器能够识别简单语言的单词符号 (2),识别出并输
2、出简单语言的基本字.标示符.无符号整数.运算符.和界符。2.词法分析算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。3.分析过程(1)主程序输入要分析的语句调用扫描、分析程序输出单词符号二元组结束判断读入字符是否为“#”(2)扫描子程序Token清空当前字符=?标示符常数表中查找结束 Error()输出二元式基本字用户标示符结束Get()4.各种单词符号对应的种别码单词符号种别码助记符内码值while1while-if2if-else3else-switch4switch-case5case-标识
3、符6idid在符号表中的位置常数7numnum在常数表中的位置+8+-9-*10*-=11relopLE0 then x:=2*x+1/3; end#输出三.语法分析器LR(1)语法分析3.LR研究问题1.LR分析器结构2.算法思想(1)总控程序,也可以称为驱动程序。对所有的LR分析器总控程序都是相同的。(2)分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表将不同,分析表又可以分为动作表(ACTION)和状态转换(GOTO)表两个部分,它们都可用二维数组表示。(3)分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。分析器的动作就是由栈顶状态和当前输入符
4、号所决定。3.LR(1)解决问题对下列文法,用LR(1)分析法对任意输入的符号串进行分析:文法E-S S-BB B-aB B-b 运行结果:输入 abab;输出算式接受。输入:aaaa#输出:出错!LL1语法分析当一个文法确定是LL(1)文法时就可以对输入的语句进行判定了。首先要安装SELLECT集生成LL(1)预测分析表,最简单的方法是使用哈希表来表示,把每一个产生式左部依次和这个产生式SELLECT集中的每一个终结符组成关键字,其值即为这个产生式,送入哈希表。这样在进行句子的分析时就可以很容易判断是否使用某一个产生式来进行规约。在实际分析时设置两个栈,把#压入分析栈和剩余栈,把开始符压入分
5、析栈,把输入串从右向左送入剩余栈,然后只要两个栈元素个数同时大于1,那么依次从两个栈中取出两个元素进行比较,假如一样就匹配,假如可以规约就规约,否则就不是该文法的句子。1.语法流程开始读入文法有效?判断句型报错结束语法分析程序流程图是LL(1) 文法?2.逻辑结构一个LL(1)分析器由一张分析表、一个分析栈和一个总控程序组成。其逻辑结构如图所式。总控程序分析表Ma1 a2 a3 ai anX1Xn-1X13.LL1研究问题对下列文法,用LR(1)分析法对任意输入的符号串进行分析: 文法E-TR R-+TR R-eT-FW W-*FW W-eF-(E) F-i输入:i+(i*i)#输出:错误输出
6、:输入:i*(i-i)输入: 四.总结 经过这学期的编译原理实验课程,使我对编译原理的知识掌握的更加牢固。整个编译过程从词法分析,语法分析,语义分析以及中间代码生成的过程。当然这之间还有很多问题。 这次的实验主要是词法分析和LL1语法分析,LR1语法分析的研究。通过写代码,让我更加理解编译的过程,虽然现在写的代码效率不高,最重要的是真个编译的过程我都了解了。这几个程序是这一学期的实验的成果,从刚开始的阅读别人烦人程序都有点困难,经过反复阅读和深入理解各个文法,到最后自己写出程序。感觉收获很大的。 这一学期的编译原理课程收获颇多!五.源代码词法分析源码#include #include #inc
7、lude int i,j,k;char c,s,a20,token20=0;int letter(char s)if(s=97)&(s=48)&(s=57) return(1);else return(0);void get()s=ai;i=i+1;void retract()i=i-1;int lookup(char token20)if(strcmp(token,while)=0) return(1);else if(strcmp(token,if)=0) return(2);else if(strcmp(token,else)=0) return(3);else if(strcmp(to
8、ken,switch)=0) return(4);else if(strcmp(token,case)=0) return(5);else return(0);void main()printf(please input string :n);i=0; doi=i+1;scanf(%c,&ai);while(ai!=#);i=1;j=0;get();while(s!=#) memset(token,0,20);switch(s)case a:case b: case c:case d:case e:case f:case g:case h:case i:case j:case k:case l
9、:case m:case n:case o:case p:case q:case r:case s:case t:case u:case v:case w:case x:case y:case z:while(letter(s)|digit(s)tokenj=s;j=j+1;get();retract();k=lookup(token);if(k=0)printf(%d,%s) n,6,token);else printf(%d,-) n,k);break; case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case
10、9:while(digit(s)tokenj=s;j=j+1;get();retract();printf(%d,%s n,7,token);break;case +:printf(+,NULL);break;case -:printf(-,null);break;case *:printf(*,null);break;case :get();if(s=) printf(relop,LE) n);elseretract();printf(relop,LT) n);break;case =:get();if(s=)printf(relop,EQ) n);elseretract();printf(
11、=,null) n);break;case ;:printf(;,null) n);break;case :break;default:printf(!nLR(1)源代码#include #include char *action103=S3#,S4#,NULL, /*ACTION表*/ NULL,NULL,acc, S6#,S7#,NULL, S3#,S4#,NULL, r3#,r3#,NULL, NULL,NULL,r1#, S6#,S7#,NULL, NULL,NULL,r3#, r2#,r2#,NULL, NULL,NULL,r2#; int goto1102= /*GOTO表*/1,
12、2, 0,0, 0,5, 0,8, 0,0, 0,0, 0,9,0,0, 0,0, 0,0; char vt3=a,b,#; /*存放非终结符*/ char vn2=S,B; /*存放终结符*/ char *LR4=E-S#,S-BB#,B-aB#,B-b#;/*存放产生式*/ int a10; char b10,c10,c1; int top1,top2,top3,top,m,n; void main() int g,h,i,j,k,l,p,y,z,count; char x,copy10,copy110; top1=0;top2=0;top3=0;top=0; a0=0;y=a0;b0=#
13、; count=0;z=0; printf(请输入表达式n); /*输出状态栈、输出符号栈、输出输入串*/do scanf(%c,&c1); ctop3=c1; top3=top3+1; while(c1!=#); printf(步骤t状态栈tt符号栈tt输入串ttACTIONtGOTOn); do y=z;m=0;n=0; /*y,z指向状态栈栈顶*/ g=top;j=0;k=0; x=ctop; count+; printf(%dt,count); while(m=top1) /*输出状态栈*/ printf(%d,am); m=m+1; printf(tt); while(n=top2)
14、 /*输出符号栈*/ printf(%c,bn); n=n+1; printf(tt); while(g=top3) /*输出输入串*/ printf(%c,cg); g=g+1; printf(tt); while(x!=vtj&j=2) j+; if(j=2&x!=vtj) printf(errorn); return; if(actionyj=NULL) printf(errorn); return; else strcpy(copy,actionyj); if(copy0=S) /*处理移进*/ z=copy1-0; top1=top1+1; top2=top2+1; atop1=z;
15、 btop2=x; top=top+1; i=0; while(copyi!=#) printf(%c,copyi); i+; printf(n); if(copy0=r) /*处理归约*/ i=0; while(copyi!=#) printf(%c,copyi); i+; h=copy1-0; strcpy(copy1,LRh); while(copy10!=vnk) k+; l=strlen(LRh)-4; top1=top1-l+1; top2=top2-l+1; y=atop1-1; p=goto1yk; atop1=p; btop2=copy10; z=p; printf(t);
16、printf(%dn,p); while(actionyj!=acc); printf(accn); getchar(); LL1源代码#include #include #include using namespace std;struct Node1 char vn;char vt;char s10;MAP20;/存储分析预测表每个位置对应的终结符,非终结符,产生式 int k;/用R代表E,W代表T,e代表空char start=E;int len=8;char G1010=E-TR,R-+TR,R-e,T-FW,W-*FW,W-e,F-(E),F-i;/存储文法中的产生式 char V
17、N6=E,R,T,W,F;/存储非终结符 char VT6=i,+,*,(,),#;/存储终结符 char SELECT1010=(,i,+,),#,(,i,*,+,),#,(,i;/存储文法中每个产生式对应的SELECT集 char Right108=-TR,-+TR,-e,-FW,-*FW,-e,-(E),-i;/用R代表A,W代表B,e代表空stack stak;bool compare(char *a,char *b) int i,la=strlen(a),j,lb=strlen(b);for(i=0;ila;i+)for(j=0;jlb;j+) if(ai=bj)return 1;r
18、eturn 0;char *Find(char vn,char vt) int i;for(i=0;ik;i+) if(MAPi.vn=vn & MAPi.vt=vt)return MAPi.s;return error;char * Analyse(char * word) char p,action10,output10;int i=1,j,l=strlen(word),k=0,l_act,m;while(!stak.empty()stak.pop();stak.push(#);stak.push(start);printf(_n);printf(n 对符号串%s的分析过程n,word);
19、printf( -n);printf(n);printf( 步骤 栈顶元素 剩余输入串 动作n);printf( -n);p=stak.top();while(p!=#) printf(%7d ,i+);p=stak.top();stak.pop();printf(%6c ,p);for(j=k,m=0;j1;j-)stak.push(actionj); if(strcmp(output,#)!=0)return ERROR; int main () freopen(in1.txt,r,stdin);/freopen(in2.txt,r,stdin);char source100;int i,j,flag,l,m;/printf(n*为了方便编写程序,用R代表E,W代表T,e代表空*nn);printf(n*为了方便编写程序,用R代表A,W代表B,e代表空*nn);printf(该文法的产生式如下:n); for(i=0;ilen;i+)printf( %sn,Gi);printf(_n);pri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 现代商业办公空间的照明艺术
- 现代办公设备与技术概览
- 残障者康复教育与社区资源的联动发展
- Module3 Unit1 What are they doing?(说课稿)-2024-2025学年外研版(三起)英语四年级上册
- 7 我是班级值日生(说课稿)-2024-2025学年统编版道德与法治二年级上册
- Unit 3 Its a colourful world!Part B Let's learn(说课稿)-2024-2025学年外研版(三起)(2024)英语三年级上册
- 2023六年级数学上册 二 分数乘法第3课时 分数与整数相乘说课稿 苏教版
- 5《这些事我来做》(说课稿)-部编版道德与法治四年级上册
- Unit5 My clothes Part A Lets talk (说课稿)-2023-2024学年人教PEP版英语四年级下册001
- 《1 有余数的除法-第二课时》(说课稿)-2023-2024学年二年级下册数学苏教版001
- 2025年度高端商务车辆聘用司机劳动合同模板(专业版)4篇
- 2025年人教版新教材数学一年级下册教学计划(含进度表)
- GB/T 45107-2024表土剥离及其再利用技术要求
- 2025长江航道工程局招聘101人历年高频重点提升(共500题)附带答案详解
- 2025年黑龙江哈尔滨市面向社会招聘社区工作者1598人历年高频重点提升(共500题)附带答案详解
- 2025年国新国际投资有限公司招聘笔试参考题库含答案解析
- 2025年八省联考四川高考生物试卷真题答案详解(精校打印)
- 五年级上册脱式计算100题及答案
- 兰州市规范医疗服务价格项目基准价格表
- 火灾隐患整改登记表
- 普通地质学教材
评论
0/150
提交评论