山东理工大学编译原理作业_第1页
山东理工大学编译原理作业_第2页
山东理工大学编译原理作业_第3页
山东理工大学编译原理作业_第4页
山东理工大学编译原理作业_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编译原理期末大作业班级:计科1101姓名:张旭学号:班内序号:22时间:2013/6/261、 实验内容 某程序设计语言子集编译器的设计与实现,包括词法分析、语法分析、语义分析和目标代码生成的设计与实现。2、 实验目的(1)理解编译器的工作机制(2)掌握编译器的构造方法3、 所实现语言的完整文法 main () ; 空 | ; int , | 空 cin ( ) ; | out ( ) ; | if ( ) ; | while ( ) ; | =; + | - | * | / a|b|c|d.y|z | main () B B E E F G F H R J ; G 空 | K GH intR

2、 PJ ,R J | 空 K cin ( R ) ; | out ( R ) ; | if ( N ) K ; | while ( N) K ; | R=L;L R O MM PN R Q MO + | - | * | / P a|b|c|d.y|zQ | , .语法分析框图:语法分析运行界面:(包含while语句:) 5.3 语义分析 实现目标: 对每一个赋值表达式,判断运算符的优先级,然后输出四元式。 输出形式: 例如,输入a=b+(c-d)*e+f/g*(h-i+j/(k+l*m-n) 将会输出(1)(-,c,d,t1)(2)(*,t1,e,t2) (3)(+,b,t2,t3) (4)(

3、/,f,g,t4)(5)(-,h,i,t5)(6)(*,l,m,t6)(7)(+,k,t6,t7)(8)(-,t7,n,t8)(9)(/,j,t8,t9)(10)(+,t5,t9,t10)(11)(*,t4,t10,t11)(12)(+,t3,t11,t12)(13)(=,t12,-,a) 语义分析步骤:1)检查输入的元素; 2)如果是一个操作数,则进栈; 3)如果是操作符,则 如果符号栈不为空或者此操作符的优先级大于符号栈栈顶的优先级,则将此运算符压栈; 如果符号栈不为空或者此操作符的优先级小于符号栈栈顶的优先级,栈顶操作符出栈并进行相应的操作; 4) 假定输入完毕,栈中剩余的所有操作符出栈

4、并进行相应操作。运行结果:5.4 目标代码生成 实现目标:根据语义分析程序的运行结果,将中间代码程序段翻译成汇编语言目标代码 输出形式:例: 在语义分析中输入:a=b+c*d-e/f 在代码生成选项中就会输出:0:MOV R1 , c1:MUL R1 , d2:ST R1 , t13:MOV R0 , b4:ADD R0 , t15:MOV t2 , R0 运行结果:6、 实现源代码#include#include#include#include#include/*词法分析定义的变量和函数*/char save20;/*定义暂存函数*/char *p;char count200;int CFt

5、otal=1;char *keyword6=int,if,main,cin,while,cout;/定义内容关键字char *yunsuanfu8=+,-,*,/,=,=;/定义运算符char *jiefu6=(,),;/定义界符void alpha();/*词法定义完*/*语法定义变量和函数*/char YFshuru100,YFtuidao600,b100,e100,ch,*st;int YFtotal=0,flag=0,n1,i1,n=9,t1=0;/t1记录推导式i1记录输入式int A();int B();int E();int F();int G();int H();int J()

6、;int K();int L();int M();int N();int O();int P();int Q();int R();void input();void input1();void output();/*语法定义完*/*四元式定义*/char w;int YYj=1;struct TOKENchar t;int i;struct TOKEN word, sem10;int i_sem;struct QTchar w;struct TOKEN word1;struct TOKEN word2;struct TOKEN temp; ;char YYshuru50;int YYi=0;s

7、truct QT qt30;int YYq=0;int YYD();int YYE();int YYT();int YYF();void quat(char);/*四元式定义完*/*目标代码定义*/void outdaima();/*目标代码定义完*/int main() int i,j; int f,g; char x; CFtotal=1;/*计数器等于一*/ printf( +n); printf( + +n); printf( + +n); printf( + 编译词法分析 +n); printf( + +n); printf( + +n); printf( +n); strcpy(c

8、ount,main()nn int a,b; n cin(a); while(ab)a=a+b;n); printf(The source program is:n); puts(count); printf(n); p=count; while(*p!=0)/*检查源程序是否结束*/ memset(save,0,20); while(*p= |*p=n|*p=t)p+;/*检查是否是空白字符,如果是直接跳过*/ if(isalpha(*p) alpha();/*识别关键字或标识符*/ else if(*p=) p+; if(*p=) printf( %dt关系运算符t%sn,CFtotal,

9、=);/*识别=*/ else printf( %dt算数运算符t%sn,CFtotal,=);/*识别=*/ p-; /*回退多读进字符*/ else if(*p=+) printf( %dt算数运算符t%cn,CFtotal,*p); else if(*p=-) printf( %dt算数运算符t%cn,CFtotal,*p); else if(*p=*) printf( %dt算数运算符t%cn,CFtotal,*p); else if(*p=/) printf( %dt算数运算符t%cn,CFtotal,*p); else if(*p=) printf( %dt关系运算符t%sn,CF

10、total,);/*识别) printf( %dt关系运算符t%sn,CFtotal,);/*识别*/ else if(*p=;) printf( %dt界符t%cn,CFtotal,*p); else if(*p=,) printf( %dt界符t%cn,CFtotal,*p); else if(*p=() printf( %dt界符t%cn,CFtotal,*p); else if(*p=) printf( %dt界符t%cn,CFtotal,*p); else if(*p=) printf( %dt界符t%cn,CFtotal,*p); else if(*p=) printf( %dt界

11、符t%cn,CFtotal,*p); CFtotal=CFtotal+1;p+; /*准备识别下一个单词*/ printf(n按任意键转入语法分析。n); getch(); printf( +n); printf( + +n); printf( + +n); printf( + 编译语法分析 +n); printf( + +n); printf( + +n); printf( +n); printf(输入的字符串为n); strcpy(YFshuru,main()inta,b;cin(a);while(ab)a=c+b;#); puts(YFshuru); printf(n); n1=strl

12、en(YFshuru); ch=b0=YFshuru0; printf(步骤t文法tt 分析字符t剩余串n); f=A(); if(f=0) return 0; if(ch=#) printf(Acceptn); g=0; x=YFtuidaog; while(x!=#) printf(%c,x); g=g+1; x=YFtuidaog; else printf(Errorn); printf(回车返回n); printf(n); getchar(); printf(按任意键转入语义分析。n); printf( +n); printf( + +n); printf( + +n); printf

13、( + 编译语义分析 +n); printf( + +n); printf( + +n); printf( +n); printf(输入的字符串为n); strcpy(YYshuru,a=c+b*d+e*f); puts(YYshuru); printf(n); w=YYshuruYYi+;YYD();if (w=0)/对表达式输出printf(n);for (YYi=0;YYiYYq;YYi+)printf( (%d) ,YYi+1);/输出序号if(qtYYi.w!=)/输出运算式(无序号的)printf( ( %c,qtYYi.w);if (qtYYi.word1.t!=t)printf

14、( , %c,qtYYi.word1.t);elseprintf( , %c%d,qtYYi.word1.t,qtYYi.word1.i);if (qtYYi.word2.t!=t)printf( , %c,qtYYi.word2.t);elseprintf( , %c%d,qtYYi.word2.t,qtYYi.word2.i);printf( , %c%d )n,qtYYi.temp.t,qtYYi.temp.i);else/输出赋值表达式(带等号的)printf( ( %c,qtYYi.w);printf( , %c%d ,qtYYi-1.temp.t,qtYYi-1.temp.i);p

15、rintf( , _);printf( , %c),qtYYi.word1.t);else printf(Error!n); getchar(); printf(按任意键转入语义分析。n); printf( +n); printf( + +n); printf( + +n); printf( + 编译目标代码分析 +n); printf( + +n); printf( + +n); printf( +n); printf(目标代码为:n); outdaima(); /代码生成 return 0;/*词法分析函数*/void alpha()/分析标识符 int i,j,t=0; char *op

16、p; i=0; j=0;/j=0是标识符,j=1是关键字 while(isalpha(*p)/检查是否是字母 savet=*p; p+; t+; opp=save; for(i=0;imian()B,YFtotal); YFtotal+; YFtuidaot1+=A; YFtuidaot1+=-; YFtuidaot1+=; YFtuidaot1+=m; YFtuidaot1+=a; YFtuidaot1+=i; YFtuidaot1+=n; YFtuidaot1+=(; YFtuidaot1+=); YFtuidaot1+=B; YFtuidaot1=#; flag=0; input();

17、input1(); i1=i1+6; ch=YFshurui1; f=B(); if(f=0) return 0; else return 1;int B() int f; if(ch=) bi1=ch; printf(%dtB-Et,YFtotal); YFtotal+; YFtuidaot1+=B; YFtuidaot1+=-; YFtuidaot1+=; YFtuidaot1+=; YFtuidaot1+=E; YFtuidaot1+=; YFtuidaot1=#; flag=0; input(); input1(); ch=YFshuru+i1; / f=E(); if(f=0) re

18、turn 0; if(ch=) bi1=ch; printf(%dtB-Et,YFtotal); YFtotal+; flag=0; input(); input1(); ch=YFshuru+i1; else printf(ErrorBBn); return 0; return 1;int E() int f,g; printf(%dtE-FGt,YFtotal); YFtotal+; YFtuidaot1+=E; YFtuidaot1+=-; YFtuidaot1+=; YFtuidaot1+=F; YFtuidaot1+=G; YFtuidaot1=#; flag=1; input();

19、 input1(); f=F(); if(f=0) return 0; g=G(); if(g=0) return 0; else return 1;int F() int f,g,t; printf(%dtF-HRJ;,YFtotal); YFtotal+; YFtuidaot1+=F; YFtuidaot1+=-; YFtuidaot1+=; YFtuidaot1+=H; YFtuidaot1+=R; YFtuidaot1+=J; YFtuidaot1+=; YFtuidaot1=#; flag=1; input(); input1(); f=H(); if(f=0) return 0;

20、t=R(); if(t=0) return 0; g=J(); if(g=0) return 0; ch=YFshuru+i1; return 1;int G() int f,g; if(ch=a&chKGt,YFtotal); YFtotal+; YFtuidaot1+=G; YFtuidaot1+=-; YFtuidaot1+=; YFtuidaot1+=K; YFtuidaot1+=G; YFtuidaot1=#; flag=0; input(); input1(); f=K(); if(f=0) return 0; g=G(); if(g=0) return 0; else retur

21、n 1; printf(%dtG-t,YFtotal); YFtotal+; YFtuidaot1+=G; YFtuidaot1+=-; YFtuidaot1+=; YFtuidaot1+=; YFtuidaot1=#; flag=1; input(); input1(); return 1;int H() st=&YFshurui1; if(ch=i&*(st+1)=n&*(st+2)=t) bi1=ch; printf(%dtH-intt,YFtotal); YFtotal+; YFtuidaot1+=H; YFtuidaot1+=-; YFtuidaot1+=; YFtuidaot1+=

22、i; YFtuidaot1+=n; YFtuidaot1+=t; YFtuidaot1=#; flag=0; input(); input1(); i1=i1+3; ch=YFshurui1; return 1; else return 0;int J()/J ,R J | 空 int f,g; if(ch=,) bi1=ch; printf(%dtJ-,RJt,YFtotal); YFtotal+; YFtuidaot1+=J; YFtuidaot1+=-; YFtuidaot1+=; YFtuidaot1+=,; YFtuidaot1+=R; YFtuidaot1+=J; YFtuidao

23、t1=#; flag=0; input(); input1(); ch=YFshuru+i1; f=R(); if(f=0) return 0; g=J(); if(g=0) return 0; else return 1; printf(%dtJ-t,YFtotal); YFtotal+; YFtuidaot1+=J; YFtuidaot1+=-; YFtuidaot1+=; YFtuidaot1+=; YFtuidaot1=#; flag=1; YFshurui1=ch; input(); input1(); return 1;int K() int f,g; st=&YFshurui1;

24、 if(ch=c&*(st+1)=i&*(st+2)=n) printf(%dtK-cin(R);,YFtotal); YFtotal+; YFtuidaot1+=K; YFtuidaot1+=-; YFtuidaot1+=; YFtuidaot1+=c; YFtuidaot1+=i; YFtuidaot1+=n; YFtuidaot1+=(; YFtuidaot1+=R; YFtuidaot1+=); YFtuidaot1+=; YFtuidaot1=#; flag=0; input(); input1(); i1=i1+4; ch=YFshurui1; f=R(); if(f=0) ret

25、urn 0; if(ch=) printf(%dtK-cin(R);,YFtotal); YFtotal+; YFtuidaot1+=K; YFtuidaot1+=-; YFtuidaot1+=; YFtuidaot1+=c; YFtuidaot1+=i; YFtuidaot1+=n; YFtuidaot1+=(; YFtuidaot1+=R; YFtuidaot1+=); YFtuidaot1+=; YFtuidaot1=#; flag=0; input(); input1(); i1+; ch=YFshuru+i1; else printf(Errorn); return 0; else

26、if(ch=o&*(st+1)=u&*(st+2)=t) bi1=ch; printf(%dtK-out(R);,YFtotal); YFtotal+; YFtuidaot1+=K; YFtuidaot1+=-; YFtuidaot1+=; YFtuidaot1+=o; YFtuidaot1+=u; YFtuidaot1+=t; YFtuidaot1+=(; YFtuidaot1+=R; YFtuidaot1+=); YFtuidaot1+=; YFtuidaot1=#; flag=0; input(); input1(); i1=i1+4; ch=YFshurui1; f=R(); if(f

27、=0) return 0; if(ch=) bi1=ch; printf(%dtK-out(R);,YFtotal); YFtotal+; flag=0; input(); input1(); ch=YFshuru+i1; YFtuidaot1+=; ch=YFshuru+i1; else printf(Errorn); return 0; else if(ch=i&*(st+1)=f) bi1=ch; printf(%dtK-if(N)K;,YFtotal); YFtotal+; YFtuidaot1+=K; YFtuidaot1+=-; YFtuidaot1+=; YFtuidaot1+=

28、i; YFtuidaot1+=f; YFtuidaot1+=(; YFtuidaot1+=N; YFtuidaot1+=); YFtuidaot1+=K; YFtuidaot1+=; YFtuidaot1=#; flag=0; input(); input1(); i1=i1+3; ch=YFshurui1; f=N(); if(f=0) return 0; if(ch=) bi1=ch; printf(%dtK-cin(R);,YFtotal); YFtotal+; flag=0; input(); input1(); ch=YFshuru+i1; YFtuidaot1+=; ch=YFsh

29、uru+i1; else printf(Errorn); return 0; g=K(); if(g=0) return 0; YFtuidaot1+=; ch=YFshuru+i1; else if(ch=w&*(st+1)=h&*(st+2)=i) bi1=ch; printf(%dtK-while(N)K;,YFtotal); YFtotal+; YFtuidaot1+=K; YFtuidaot1+=-; YFtuidaot1+=; YFtuidaot1+=w; YFtuidaot1+=h; YFtuidaot1+=i; YFtuidaot1+=l; YFtuidaot1+=e; YFtuidaot1+=(; YFtuidaot1+=N; YFtuidaot1+=); YFtuidaot1+=K; YFtuidaot1+=; YFtu

温馨提示

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

评论

0/150

提交评论