您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 编译原理简单样本语言的语法分析器2
-1-昆明理工大学信息工程与自动化学院学生实验报告(2012—2013学年第1学期)课程名称:编译原理开课实验室:信自楼44年月日年级、专业、班学号姓名成绩实验项目名称简单样本语言的语法分析器指导教师李亚教师评语该同学是否了解实验原理:A.了解□B.基本了解□C.不了解□该同学的实验能力:A.强□B.中等□C.差□该同学的实验是否达到要求:A.达到□B.基本达到□C.未达到□实验报告是否规范:A.规范□B.基本规范□C.不规范□实验过程是否详细记录:A.详细□B.一般□C.没有□教师签名:年月日一、实验目的及内容实现下述我们定义的语言语法分析器。这种语言的程序结构很简单,语法相当于c的函数体,即由一对大括号括起来的语句序列,没有过程或函数。声明语句、表达式语句及控制语句的写法都与c类似,但规定:一条声明语句只能声明一个整型变量,没有数组;控制语句只是if、for和while三个语句,这三个语句本身也可以包含语句序列;表达式仅局限于布尔表达式和整型算术表达式,布尔表达式由对两个算术表达式的比较组成,该比较使用,,=,=,==,!=比较运算符;算术表达式可以包括整型常数、变量以及+,-,*,/这四个运算符。另外,还可以有复合语句。用read和write语句实现输入输出。注释用/*和*/括起来,但注释不能嵌套二、实验原理及基本技术路线图(方框原理图或程序流程图)对给定的程序通过语法分析器弄够识别一个个单词符号,并以二元式(单词种别码,-2-单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。流程图:开始输入源文件路径路径是否有效是初始化文件指针否将字符加入字符数组Word[]是空格,空白或换行吗是字母吗是数字吗否否是界符吗否打开源文件跳过该字符是是文件结束?否将字符加入字符数组Word[]否将字符加入字符数组Word[]是指向下一字符识别指针内容指向下一字符是字母惑数字吗是将word与关键字表key进行匹配否匹配?是输出word为关键字输出word为普通标示符否将字符加入字符数组Word[]指向下一字符输出word为常数识别指针内容回退是数字吗是否输出word为界符指向下一字符结束是输出Word内容为不可识别将字符加入字符数组Word[]词法分析器产生下述语言的单词序列这个语言的所有的单词符号,以及它们的种别编码和内部值如下表:-3-单词符号种别编码助记符内码值DIMIFDOSTOPEND标识符常数(整)=+***,()1234567891011121314$DIM$IF$DO$STOP$END$ID$INT$ASSIGN$PLUS$STAR$POWER$COMMA$LPAR$RPAR------内部字符串标准二进形式------对于这个小语言,有几点重要的限制:首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的:IF(5)=x其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为-4-IFi0i=1;而绝对不要写成IFi0i=1;因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。三、所用仪器、材料(设备名称、型号、规格等或使用软件)WINDOWS下的VISUALC++6.0;四、实验方法、步骤(或:程序代码或操作过程)代码:#includestdlib.h#includestdio.h#includestring.h#includewindows.htypedefstruct{charR;charr;intflag;}array;arrayF[30];typedefstruct{charE;chare;}charLode;typedefstruct-5-{charLode*base;inttop;}charstack;charstr[80][80],arr[80][80],brr[80][80];intm,kk,p,ppp,FF=1;charr[20];intcrr[30][30],FLAG=0;charccrr1[1][30],ccrr2[30][1];voidInitstack(charstack*s){s-base=(charLode*)malloc(30*sizeof(charLode));s-top=-1;}voidpush(charstack*s,charLodew){s-top++;s-base[s-top].E=w.E;s-base[s-top].e=w.e;}voidpop(charstack*s,charLode*w){w-E=s-base[s-top].E;w-e=s-base[s-top].e;s-top--;}intIsEmpty(charstacks){if(s.top==-1)return1;-6-elsereturn0;}intIsLetter(charch){if(ch='A'&&ch='Z')return1;elsereturn0;}intjudge1(intn){intj=3,flag=1,i;for(i=0;i=n;i++)while(str[i][j]!='\0'){chara=str[i][j];charb=str[i][j+1];if(IsLetter(a)&&IsLetter(b)){flag=0;break;}elsej++;}returnflag;}-7-voidjudge2(intn){inti;for(i=0;i=n;i++)if(str[i][3]=='~'||judge1(n)==0||FLAG==1){printf(语法G不是操作符优先级的语法!\n);FF=0;break;}if(in)printf(语法G是操作符优先级的语法!\n);}intsearch1(charr[],intkk,chara){inti;for(i=0;ikk;i++)if(r[i]==a)break;if(i==kk)return0;elsereturn1;}voidcreateF(intn){intk=0,i=1;charc;-8-intj;chart[10];t[0]=str[0][0];while(i=n){if(t[k]!=str[i][0]){k++;t[k]=str[i][0];i++;}elsei++;}kk=0;for(i=0;i=n;i++){j=3;while(str[i][j]!='\0'){c=str[i][j];if(IsLetter(c)==0){if(!search1(r,kk,c))r[kk]=c;kk++;}j++;}}-9-m=0;for(i=0;ik;i++)for(j=0;jkk-1;j++){F[m].R=t[i];F[m].r=r[j];F[m].flag=0;m++;}}voidsearch(charLodew){inti;for(i=0;im;i++)if(F[i].R==w.E&&F[i].r==w.e){F[i].flag=1;break;}}voidFirstVT(intn){charstacksta;charLodeww;charLodew;inti=0,k;chara,b;Initstack(&sta);while(i=n)-10-{k=3;w.E=str[i][0];a=str[i][k];b=str[i][k+1];if(!IsLetter(a)){w.e=a;push(&sta,w);search(w);i++;}elseif(IsLetter(a)&&b!='\0'&&!IsLetter(b)){w.e=b;push(&sta,w);search(w);i++;}elsei++;}while(!IsEmpty(sta)){pop(&sta,&ww);for(i=0;i=n;i++){w.E=str[i][0];if(str[i][3]==ww.E&&str[i][4]=='\0'){-11-w.e=ww.e;push(&sta,w);search(w);break;}elseif(str[i][3]==ww.E&&w.E!=ww.E){w.e=ww.e;push(&sta,w);search(w);break;}}}p=0;k=1;i=1;while(im){if(F[i-1].flag==1){arr[p][0]=F[i-1].R;arr[p][k]=F[i-1].r;}while(F[i].flag==0&&im)i++;if(F[i].flag==1){if(F[i].R==arr[p][0])k++;-12-else{arr[p][k+1]='\0';p++;k=1;}i++;}}}voidLastVT(intn){charstacksta;charLodew;charLodeee;chara,b;intk,i;for(i=0;im;i++)F[i].flag=0;i=0;Initstack(&sta);while(i=n){intk=strlen(str[i]);w.E=str[i][0];a=str[i][k-1];b=str[i][k-2];if(!IsLetter(a)){w.e=a;-13-push(&sta,w);search(w);i++;}elseif(IsLetter(a)&&!IsLetter(b)){w.e=b;push(&sta,w);search(w);i++;}elsei++;}while(!IsEmpty(sta)){pop(&sta,&ee);for(i=0;i=n;i++){w.E=str[i][0];if(str[i][3]==ee.E&&str[i][4]=='\0'){w.e=ee.e;push(&sta,w);search(w);}}}k=1;i=1;-14-ppp=0;while(im){if(F[i-1].flag==1){brr[ppp][0]=F[i-1].R;brr[ppp][k]=F[i-1].r;}while(F[i].flag==0&&im)i++;if(F[i].flag==1){if(F[i].R==arr[ppp][0])k++;else{brr[ppp][k+1]='\0';ppp++;k=1;}i++;}}}voidcreateYXB(intn){inti,j;intI,mm,pp,J;for(j=1;j=kk;j++)ccrr1[0][j]=r[j-1];-15-for(i=1;i=kk;i++)ccrr2[i][0]=r[i-1];for(i=1;i=kk;i++)for(j=1;j=kk;j++)crr[i][j]=0;I=0,J=3;while(I=n){if(str[I][J+1]=='\0'){I++;J=3;}else{while(str[I][J+1]!='\0'){charaa=str[I][J];charbb=str[I][J+1];if(!IsLetter(aa)&&!IsLetter(bb)){for(i=1;i=kk;i++){if(ccrr2[i][0]==aa)break;}for(j=1;j=kk;j++){if(ccrr1[0][j]==bb)break;-16-}if(crr[i][j]==0)crr[i][j]=1;else{FLAG=1;I=n+1;}J++;}if(!IsLetter(aa)&&IsLetter(bb)
本文标题:编译原理简单样本语言的语法分析器2
链接地址:https://www.777doc.com/doc-2068993 .html