《山东理工大学编译原理作业.doc》由会员分享,可在线阅读,更多相关《山东理工大学编译原理作业.doc(35页珍藏版)》请在三一办公上搜索。
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
2、空 | K GH intR 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)(+,
3、b,t2,t3) (4)(/,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 cou
5、nt200;int CFtotal=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();in
6、t H();int J();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 YYshuru5
7、0;int YYi=0;struct 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(
8、+n); strcpy(count,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关系运算符
9、t%sn,CFtotal,=);/*识别=*/ 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( %d
10、t关系运算符t%sn,CFtotal,);/*识别) 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=)
11、 printf( %dt界符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); print
12、f(n); n1=strlen(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(
13、+ +n); printf( + 编译语义分析 +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.word
14、1.t!=t)printf( , %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,qtYY
15、i-1.temp.i);printf( , _);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,
16、t=0; char *opp; 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
17、=0; input(); 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(
18、); if(f=0) return 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=#; fla
19、g=1; input(); 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=
20、0) return 0; 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
21、0; else return 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+=;
22、 YFtuidaot1+=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
23、+=J; YFtuidaot1=#; 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; s
24、t=&YFshurui1; 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) return 0; if(ch=) printf(%dtK-cin(R);,YFtotal); YFtotal+; YFtuidaot1+=K; YFtuidaot1+=-; YFtuidaot1+=; YFtuidaot1+=c; YFtuidaot1+=