1、编译原理实验报告编译原理实验报告系 别专 业班级学号姓 名XXX指导教师2010年 12 月 27 月实验一:词法分析程序的设计与实现目的:设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解。要求:(1)通过对PL/0词法分析程序(GETSYM)的分析,认真研读描述PL/0语法规则的语法图或EBNF,并在此基础上按照PL/0的语法,编制一个词法分析程序。此程序应具有如下功能:(a)输入为字符串(待进行词法分析的源程序),输出为单词串,即由(单词,类别)所组成的二元组序列。(b)有一定检查错误的能力,例如能发现2A这类不能作为单词的字符串。实验代码:#include #includ
2、e #include #include #include #define NULL 0FILE *fp;char cbuffer;char *key8=if,else,for,while,do,return,break,continue;char *border6=,;,(,);char *arithmetic4=+,-,*,/;char *relation6=,=,;char *consts20;char *label20;int constnum=0,labelnum=0;int search(char searchchar,int wordtype) int i=0; switch(wo
3、rdtype) case 1:for(i=0;i=7;i+) if(strcmp(keyi,searchchar)=0) return(i+1); case 2:for(i=0;i=5;i+) if(strcmp(borderi,searchchar)=0) return(i+1); return(0); case 3:for(i=0;i=3;i+) if(strcmp(arithmetici,searchchar)=0) return (i+1); return(0); case 4:for(i=0;i=5;i+) if(strcmp(relationi,searchchar)=0) ret
4、urn(i+1); return (0); case 5:for(i=0;i=constnum;i+) if(strcmp(constsi,searchchar)=0) return (i+1); constsi-1=(char *)malloc(sizeof(searchchar); strcpy(constsi-1,searchchar); constnum+; return(i); case 6:for(i=0;i=labelnum;i+) if(strcmp(labeli,searchchar)=0) return(i+1); labeli-1=(char *)malloc(sizeo
5、f(searchchar); strcpy(labeli-1,searchchar); labelnum+; return(i); char alphaprocess(char buffer) int atype; int i=-1; char alphatp20; while(isalpha(buffer)|(isdigit(buffer) alphatp+i=buffer; buffer=fgetc(fp); alphatpi+1=0; if(atype=search(alphatp,1) printf(%s (1,%d)n,alphatp,atype-1); else atype=sea
6、rch(alphatp,6); printf(%s (6,%d)n,alphatp,atype-1); return(buffer);char digitprocess(char buffer) int i=-1; char digittp20; int dtype; while(isdigit(buffer) digittp+i=buffer; buffer=fgetc(fp); digittpi+1=0; dtype=search(digittp,5); printf(%s (5,%d)n,digittp,dtype-1); return (buffer);char otherproces
7、s(char buffer) int i=-1; char othertp20; int otype,otypetp; othertp0=buffer; othertp1=0; if(otype=search(othertp,3) printf(%s (3,%d)n,othertp,otype-1); buffer=fgetc(fp); goto out; if(otype=search(othertp,4) buffer=fgetc(fp); othertp1=buffer; othertp2=0; if(otypetp=search(othertp,4) printf(%s (4,%d)n
8、,othertp,otypetp-1); goto out; else othertp1=0; printf(%s (4,%d)n,othertp,otype-1); goto out; if(buffer=:) buffer=fgetc(fp); if(buffer=) printf(:=(2,2)n); buffer=fgetc(fp); goto out; else if(otype=search(othertp,2) printf(%s (2,%d)n,othertp,otype-1); buffer=fgetc(fp); goto out; if(buffer!=n)&(buffer
9、!= ) printf(%c error,not a wordn,buffer); buffer=fgetc(fp);out: return (buffer);void main() int i; for(i=0;i=20;i+) labeli=NULL; constsi=NULL; if(fp=fopen(example.c,r)=NULL) printf(errorn); else cbuffer=fgetc(fp); while(cbuffer!=EOF) if(isalpha(cbuffer) cbuffer=alphaprocess(cbuffer); else if(isdigit
10、(cbuffer) cbuffer=digitprocess(cbuffer); else cbuffer=otherprocess(cbuffer); printf(overn); getchar(); 截图如下:实验二:递归子程序法语法分析程序的设计与实现目的:设计、编制、调试一个典型的语法分析程序,实现对如下文法的递归子程序语法分析,进一步掌握常用的语法分析方法。要求:程序的输入是任意符号串,输出是本次输入的符号串是否是该文法的句子的结论。实验代码:#include #include#include#includechar a50,b50,d200,e10;char ch;int n1,
11、i1=0,flag=1,n=5;int E();int E1();int T();int G();int S();int F();void input();void input1();void output();void main() int f,p,j=0; char x; d0=E; d1=; d2=; d3=T; d4=G; d5=#; printf(请输入字符串(长度50,以#号结束)n); do scanf(%c,&ch); aj=ch; j+; while(ch!=#); n1=j; ch=b0=a0; printf(文法t分析串tt分析字符t剩余串n); f=E1(); if(f
12、=0) return; if(ch=#) printf(acceptn); p=0; x=dp; while(x!=#) printf(%c,x); p=p+1; x=dp; /*输出推导式*/ else printf(errorn); printf(回车返回n); getchar();getchar(); return; printf(n); printf(回车返回n); getchar(); getchar();int E1() int f,t; printf(ETGt); flag=1; input(); input1(); f=T(); if (f=0) return(0); t=G(
13、); if (t=0) return(0); else return(1);int E() int f,t; printf(ETGt); e0=E; e1=; e2=; e3=T; e4=G; e5=#; output(); flag=1; input(); input1(); f=T(); if (f=0) return(0); t=G(); if (t=0) return(0); else return(1);int T() int f,t; printf(TFSt); e0=T; e1=; e2=; e3=F; e4=S; e5=#; output(); flag=1; input();
14、 input1(); f=F(); if (f=0) return(0); t=S(); if (t=0) return(0); else return(1);int G() int f; if(ch=+) bi1=ch; printf(G+TGt); e0=G; e1=; e2=; e3=+; e4=T; e5=G; e6=#; output(); flag=0; input(); input1(); ch=a+i1; f=T(); if (f=0) return(0); G(); return(1); printf(Gt); e0=G; e1=; e2=; e3=; e4=#; outpu
15、t(); flag=1; input(); input1(); return(1);int S() int f,t; if(ch=*) bi1=ch; printf(S*FSt); e0=S;e1=;e2=;e3=*; e4=F;e5=S;e6=#; output(); flag=0; input();input1(); ch=a+i1; f=F(); if(f=0) return(0); t=S(); if(t=0) return(0); else return(1); printf(St); e0=S;e1=;e2=;e3=;e4=#; output(); flag=1; ai1=ch;
16、input();input1(); return(1);int F() int f; if(ch=() bi1=ch; printf(F(E)t); e0=F;e1=;e2=;e3=(; e4=E;e5=);e6=#; output(); flag=0; input();input1(); ch=a+i1; f=E(); if(f=0) return(0); if(ch=) bi1=ch; printf(F(E)t); flag=0; input();input1(); ch=a+i1; else printf(errorn); return(0); else if(ch=i) bi1=ch;
17、 printf(Fit); e0=F;e1=;e2=;e3=i;e4=#; output(); flag=0; input();input1(); ch=a+i1; else printf(errorn); return(0); return(1);void input() int j=0; for(;j=i1-flag;j+) printf(%c,bj); printf(tt); printf(%ctt,ch);void input1() int j; for(j=i1+1-flag;j;dn+2=#;n=n+2;i=n; i=i-2; while(di!=&i!=0)i=i-1; i=i+1; while(di!=e0)i=i+1; q=i; m=q; k=q; while(dm!=) m=m-1; m=m+1; while(m!=q) dn=dm;m=m+1;n=n+1; dn=#; for(j=3;ej!=#;j+) dn=ej; n=n+1; k=k+1; while(dk!=) dn=dk; n=n+1; k=k+1; dn=#;实验截图:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1