您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 北方工业大学编译原理实验2报告语法分析
编译原理实验报告实验题目:语法分析器构造指导教师:杨健姓名:杨先宇班级:计13-4学号:15901020402实验成绩:实验题目实验二语法分析器构造实验目的和要求借助于词法分析程序提供的分析结果,编写一个算符优先语法分析程序,程序能进行语法结构分析和错误检查,并产生相应的归约信息。同时给出出错信息和错误类型,从而加深对语法分析的理解。说明提示:1.本实验的优先表可以手工先设计好。2.本实验要求中提出的“产出相应的归约信息”意指在语法分析的过程中,一旦产生归约,在程序上产生并最终输出归约产生式序号。3.出错类型的产生可预先对应优先表中出错栏列表说明其出错类型,并分别编序,当分析中产生错误时以字符串输出相应表中错误信息。设计思想与框架功能描述:LL(1)分析法是一种不带回溯的非递归的自上而下的分析法.其基本思想是根据输入串的当前输入符号来唯一确定选用某条规则来进行推倒,当这个输入符号与推倒的第一个符号相同时再取输入串的下一个符号,继续确定下一个推倒应选的规则,如此下去,直到推倒出被分析的输入串为止.1.首先,手工制作一个算符优先表(也可以编程序实现)。2.将词法分析所得到的预处理文件作为该程序的输入文件,并根据相应的算法提取出算术表达式并转换为输入串,将其保存在strings这个字符数组中,并把表达式中相应常量用字符‘i’来表示,以便规约(以#结束输入串)。3.其次,初始化符号栈。将输入串里的字符读进a里(a用于表示当前的输入字符),将栈顶元素与a(当前字符)相比较,如果栈顶元素的优先级比a的低或等于则进栈;如果栈顶元素的优先级比a的高则将栈顶指针下移,直到找到一个字符串的优先级比它上一个字符串的优先级低的字符串(该过程为寻找最左素短语),然后将这两个字符中间的符号串寻找匹配的产生式后进行规约,并将其弹出站定,将规约得到的非终结符入栈;栈顶元素的下一个元素优先级低于或等于当前输入的字符串就移进,否则就出错。然后重复c过程,直到输入串结束(遇见#)。(输出相应的移近——规约过程)。4.重复b和c过程,直到该预处理文件结束(遇见#)。核心算法voidprocess(char*temp){intk=1,j,w,l,m,t=0,p,q,v,yu=0;stack[0]='';stack[k]='#';dangqianfuhao='';panduanshengyuzifuchuan(yu);step=0;shuchu(0,-1);//这是对#号的处理//-1代表0代表=1代表charQ;inti=0;do{dangqianfuhao=temp[i];//取符号intflag=0;//对终结符号的善意假设for(w=0;w8;w++)//查找运算符表,谁与stack[k]匹配{if(stack[k]==word[w])flag=1;}if(flag==1)j=k;//j指向终极符了elsej=k-1;//j指向stack中最后一个非终结符for(w=0;w8;w++)//找出s[j]和当前字符在优先表里的位置{if(stack[j]==word[w])l=w;//l记录了当前字符的终结符类型if(dangqianfuhao==word[w])m=w;//终结符的处理}while(M[l][m]==''){do{Q=stack[j];intflag=0;//再次做出善意假设终结符for(w=0;w8;w++){if(stack[j-1]==word[w])flag=1;}if(flag==1)j=j-1;elsej=j-2;for(w=0;w8;w++)//找出s[j]和Q对应优先表里的位置,对决{if(stack[j]==word[w])p=w;//p记录员,代理人if(Q==word[w])q=w;//q记录员,代理人}}while(M[p][q]!='');//当然所有前提是,可行的情况下,但是为了做出最初的判断,使用了do-whilestack[j+1]='N';//N的诞生,非终结符代替for(w=j+2;w=k;w++)//符号栈出栈,向前走一步,找到另一个非终结符stack[w]='\0';//以绝后患,置'\0'k=j+1;shuchu(1,1);//规约之break;}if(M[l][m]=='')//剩下的事情就是根据M判断,规约之{k=k+1;stack[k]=dangqianfuhao;yu++;panduanshengyuzifuchuan(yu);shuchu(0,-1);i++;}elseif(M[l][m]=='='){k=k+1;stack[k]=dangqianfuhao;yu++;panduanshengyuzifuchuan(yu);shuchu(0,0);i++;}else{if(M[l][m]=='e1'){printf(非法左括号!\n);i++;}elseif(M[l][m]=='e2'){printf(缺少运算符!\n);i++;}elseif(M[l][m]=='e3'){printf(非法右括号!\n);i++;}}}while(temp[i]!='\0');}源程序及注#includestdio.h#includestring.h#includectype.hcharword[8]={'+','-','*','/','(',')','i','#'};char*xingshi[6]={N+N,N-N,N*N,N/N,)N(,i};释charM[8][8]={{'','','','','','','',''},{'','','','','','','',''},{'','','','','','','',''},{'','','','','','','',''},{'','','','','','=','','e1'},{'','','','','e2','','e2',''},{'','','','','e2','','e2',''},{'','','','','','e3','','='}};charstack[10];intstep,k,j;chardangqianfuhao;//当前字符charshengyushuruchuan[20];//剩余输入字符串FILE*fp;chartemp[100];//要处理的表达式charaftertemp[100];//处理之后的表达式voidshuchu(intt,intm)//t代表移近或者规约,m代表输出的符号={printf(%-10d,step);printf(%-10s,stack);if(m==-1)printf();if(m==0)printf(=);if(m==1)printf();printf(%10c,dangqianfuhao);printf(%10s,shengyushuruchuan);if(t==0)printf(移进\n);if(t==1)printf(规约\n);step++;}voidpanduanshengyuzifuchuan(inta)//判断剩余字符串{intt,v;for(t=0;tstrlen(aftertemp);t++)shengyushuruchuan[t]='\0';for(t=0,v=a;vstrlen(aftertemp);t++,v++)shengyushuruchuan[t]=aftertemp[v];}voidprocess(char*temp){intk=1,j,w,l,m,t=0,p,q,v,yu=0;stack[0]='';stack[k]='#';dangqianfuhao='';panduanshengyuzifuchuan(yu);step=0;shuchu(0,-1);//这是对#号的处理//-1代表0代表=1代表charQ;inti=0;do{dangqianfuhao=temp[i];//取符号intflag=0;//对终结符号的善意假设for(w=0;w8;w++)//查找运算符表,谁与stack[k]匹配{if(stack[k]==word[w])flag=1;}if(flag==1)j=k;//j指向终极符了elsej=k-1;//j指向stack中最后一个非终结符for(w=0;w8;w++)//找出s[j]和当前字符在优先表里的位置{if(stack[j]==word[w])l=w;//l记录了当前字符的终结符类型if(dangqianfuhao==word[w])m=w;//终结符的处理}while(M[l][m]==''){do{Q=stack[j];intflag=0;//再次做出善意假设终结符for(w=0;w8;w++){if(stack[j-1]==word[w])flag=1;}if(flag==1)j=j-1;elsej=j-2;for(w=0;w8;w++)//找出s[j]和Q对应优先表里的位置,对决{if(stack[j]==word[w])p=w;//p记录员,代理人if(Q==word[w])q=w;//q记录员,代理人}}while(M[p][q]!='');//当然所有前提是,可行的情况下,但是为了做出最初的判断,使用了do-whilestack[j+1]='N';//N的诞生,非终结符代替for(w=j+2;w=k;w++)//符号栈出栈,向前走一步,找到另一个非终结符stack[w]='\0';//以绝后患,置'\0'k=j+1;shuchu(1,1);//规约之break;}if(M[l][m]=='')//剩下的事情就是根据M判断,规约之{k=k+1;stack[k]=dangqianfuhao;yu++;panduanshengyuzifuchuan(yu);shuchu(0,-1);i++;}elseif(M[l][m]=='='){k=k+1;stack[k]=dangqianfuhao;yu++;panduanshengyuzifuchuan(yu);shuchu(0,0);i++;}else{if(M[l][m]=='e1'){printf(非法左括号!\n);i++;}elseif(M[l][m]=='e2'){printf(缺少运算符!\n);i++;}elseif(M[l][m]=='e3'){printf(非法右括号!\n);i++;}}}while(temp[i]!='\0');}intmain(){charch,str;aftertemp[0]='\0';if((fp=fopen(预处理.txt,r))==NULL)printf(源文件无法打开!);else{ch=fgetc(fp);while(ch!='#'){while(ch!='='&&ch!='#'){str=ch;ch=fgetc(fp);if((str==''||str==''||str=='!'||str=='=')&&ch=='=')ch=fgetc(fp);}intk=0;if(ch=='#'){printf(语法分析结束!\n);fclose(fp);return0;}ch=fgetc(fp);while(ch!=''&&ch!='#'){temp[k++]=ch;ch=fgetc(fp);}temp[k]='\0';printf(要处理的表达式为%s\n,temp);intt=0;inty=0;while(temp[t]!='\0')//现在开始处理该串{intflag=0;//做出善意推断,非终结符while(isdigit(temp[t])!=0){t++;flag=1;//数字是终结符}if(flag==1){aftertemp[y]='i';//tempa为终结符料理后事,既提取类型y++;}if(flag==0){after
本文标题:北方工业大学编译原理实验2报告语法分析
链接地址:https://www.777doc.com/doc-5702292 .html