语法分析器构造

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

编译原理实验报告实验题目:语法分析器构造指导教师:姓名:班级:学号:实验成绩:实验题目语法分析器构造实验目的和要求借助于词法分析程序提供的分析结果,编写一个算符优先语法分析程序,程序能进行语法结构分析和错误检查并产生相应的归约信息。同时给出出错信息和错误类型,从而加深对语法分析的理解。设计思想与框架main函数:算术表达式函数:算符优先算法:核心算法主要数据结构说明:符号栈:stack[N]栈顶指针:top记录归约步骤号:No[N]输入字符串:strings[N]算术表达式:old_strings[N]记录下一个输入符号:a可归约字符串:*word[6]手动生成的算符优先表:x[9][9]查找算符表达式:expression(char*str)入栈:push(charch)出栈:pop(charch)根据算符优先分析表设置读入优先次序:rank(charch1,charch2)判断是否为终结符:isVT(charch)算符优先分析函数:analysis()算符优先分析算法算法采用一个符号栈的数据结构,既用它存放终结符,也用它存放非终结符。设K为符号栈使用深度,其参考算法如下:K:=1;Stack[K]:='#';Repeat把下一个输入符号读进a中;IfStack[K]∈VTthenj:=Kelsej:=K-1;whileStack[j]优先级比a高doBeginRepeatQ:=Stack[j];IfStack[j-1]∈VTthenj:=j-1elsej:=j-2UntilStack[j]比Q优先级低;把Stack[j+1]…Stack[K]归约为某个N;记录归约产生式序号;K:=j+1;Stack[K]:=NendofwhileIfStack[j]比a优先级低ORStack[j]与a优先级相同thenBeginK:=K+1;Stack[K]:=aendelseERROR{查表打印出错信息}Untila='#'源程序及注释#includestdio.h#includestring.h#includeconio.h#includestdlib.h#defineN100charstack[N],strings[N],old_strings[N];inttop=-1;intk=0;//k输入字符串数字strings[]即将被读的字符位置标识intNo[N],id=1,sr=0,step=1,n=0;chara;//用于传递即将读入的字符charx[9][9]={{'','+','-','*','/','(',')','i','#'},{'+','','','','','','','',''},{'-','','','','','','','',''},{'*','','','','','','','',''},{'/','','','','','','','',''},{'(','','','','','','=','',''},{')','','','','','','','',''},{'i','','','','','','','',''},{'#','','','','','','','','='}};char*word[6]={N+N,N-N,N*N,N/N,)N(,i};//可归约字符串FILE*fp;intisletter(charch){if(ch'a'&&ch'z'||ch'A'&&ch'Z')return1;return0;}intisdigit(charch){if(ch='0'&&ch='9')return1;return0;}voidexpression(char*str){inti=sr,j=0,m=0;if(str[i]!='#'){while(str[i]!='='&&str[i]!='#')//查找赋值号'='的位置{i++;if((str[i-1]==''||str[i-1]==''||str[i-1]=='='||str[i-1]=='!')||str[i-1]=='=')i++;}i++;while(str[i]!='\0'&&str[i]!=''&&str[i]!='#')//将赋值号'='后面的语句读入old_strings中old_strings[j++]=str[i++];sr=i;//记录预处理中字符串读到的位置old_strings[j]='\0';j=0;//将算符表达式中的数字与字母转换为'i'if(isletter(old_strings[j])||isdigit(old_strings[j]))strings[m++]='i';elsestrings[m++]=old_strings[j];j++;while(old_strings[j]!='\0'){if(isletter(old_strings[j])||isdigit(old_strings[j])){if(isletter(old_strings[j-1])==0&&isdigit(old_strings[j-1])==0)strings[m++]='i';}elsestrings[m++]=old_strings[j];j++;}strings[m]='#';strings[m+1]='\0';}}voidpush(charch)//入栈{stack[++top]=ch;}charpop()//出栈{chara;a=stack[top--];stack[top+1]='\0';returna;}intrank(charch1,charch2)//根据算符优先分析矩阵设置读入优先次序//0表示等于,1表示大于,-1表示小于,2表示没有{inti=0,j=0;if(isdigit(ch1))ch1='i';if(isdigit(ch2))ch2='i';switch(ch1){case'+':i=1;break;case'-':i=2;break;case'*':i=3;break;case'/':i=4;break;case'(':i=5;break;case')':i=6;break;case'i':i=7;break;case'#':i=8;break;default:break;}switch(ch2){case'+':j=1;break;case'-':j=2;break;case'*':j=3;break;case'/':j=4;break;case'(':j=5;break;case')':j=6;break;case'i':j=7;break;case'#':j=8;break;default:break;}if(x[i][j]=='')return1;elseif(x[i][j]=='')return-1;elseif(x[i][j]=='=')return0;elsereturn2;}voidprint(intt,intm){printf(\n%-8d%-10s,step++,stack);if(m==1)printf(%-8c,'');elseif(m==0)printf(%-8c,'=');elseprintf(%-8c,'');printf(%-10c,a);printf(%-10s,&strings[k]);if(t){printf(%-8s,归约);No[n++]=step-1;}elseprintf(%-8s,移进);}intisVT(charch){if(ch=='N')return0;elsereturn1;}voidanalysis(){inti,j=-1,m;charch[20],str;push('#');print(0,-1);a=strings[0];while(a!='\0'){if(stack[top]=='N'&&k==(strlen(strings)))a=strings[k-1];else{a=strings[k];k++;}if(isVT(stack[top]))j=top;elsej=top-1;while(isVT(a)&&rank(stack[j],a)==1)//判断是否满足规约的条件{memset(ch,0,sizeof(ch));inth;do{h=j;//h记录要规约的位置if(isVT(stack[j-1]))j=j-1;elsej=j-2;}while(rank(stack[j],stack[h])!=-1);i=-1;while((top-j)!=0)ch[++i]=pop();ch[i+1]='\0';for(m=0;m=5;m++)//把字符数组ch规约成'N'{if(strcmp(word[m],ch)==0)str='N';}push(str);//将规约后的N压入stack栈中//k++;print(1,1);}if(rank(stack[j],a)==-1){push(a);//k++;print(0,-1);}elseif(rank(stack[j],a)==0){push(a);//k++;print(0,0);}elseif(a!='\0'){printf(出错!);printf(错误为第%d个字符%c\n,k+1,strings[k]);exit(1);}}}intmain(){printf(******************************算符优先语法分析程序******************************\n);printf(E-E+T|E-T|T\n);printf(T-T*F|T/F|F\n);printf(F-(E)|i\n);printf(E表示算术表达式.T表示项.F表示因子.i表示变量或常数.\n);printf(优先表\n);printf(+-*/()i#\n);printf(+\n);printf(-\n);printf(*\n);printf(/\n);printf((=e1\n);printf()e2e2\n);printf(ie2e2\n);printf(#e3=\n);if((fp=fopen(预处理.txt,r))==NULL){printf(文件打开失败!);exit(0);}charch[4048]={'\0'};inti=0,j=0;ch[0]=fgetc(fp);while(ch[i]!='#')//将预处理文件的内容读入至数组ch中ch[++i]=fgetc(fp);ch[++i]='\0';fclose(fp);i=0;while(ch[i]!='#'){memset(strings,0,sizeof(strings));//输入表达式strings初始化memset(old_strings,0,sizeof(old_strings));expression(ch);//查找算术表达式if(ch[sr]=='\0')break;printf(算术表达式%d为:%s\n,id,old_strings);printf(转换为输入串:%s\n,strings);printf(步骤号符号栈优先关系当前分析符剩余输入串动作\n);analysis();//算符优先分析intn=0;printf(\n算术表达式%d的归约产生式步骤号为:,id++);while(No[n]){printf(%d,No[n]);n++;}printf(\n);while(stack[0]!='\0')pop();while(No[--n])No[n]='\0';top=-1;a='\0';k=0;step=1;n=0;}printf(算符优先语法分析结束!\n);getch();return0;}问题

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功