北方工业大学编译原理实验2报告材料语法分析报告.docx
- 文档编号:13240257
- 上传时间:2023-06-12
- 格式:DOCX
- 页数:17
- 大小:60.40KB
北方工业大学编译原理实验2报告材料语法分析报告.docx
《北方工业大学编译原理实验2报告材料语法分析报告.docx》由会员分享,可在线阅读,更多相关《北方工业大学编译原理实验2报告材料语法分析报告.docx(17页珍藏版)》请在冰点文库上搜索。
北方工业大学编译原理实验2报告材料语法分析报告
编译原理实验报告
实验题目:
语法分析器构造
指导教师:
杨健
某某:
杨先宇
班级:
计13-4
学号:
实验成绩:
实验题目
实验二语法分析器构造
实验目的和要求
借助于词法分析程序提供的分析结果,编写一个算符优先语法分析程序,程序能进展语法结构分析和错误检查,并产生相应的归约信息。
同时给出出错信息和错误类型,从而加深对语法分析的理解。
说明提示:
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;w<8;w++)//查找运算符表,谁与stack[k]匹配
{
if(stack[k]==word[w])
flag=1;
}
if(flag==1)
j=k;//j指向终极符了
else
j=k-1;//j指向stack中最后一个非终结符
for(w=0;w<8;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;w<8;w++)
{
if(stack[j-1]==word[w])
flag=1;
}
if(flag==1)
j=j-1;
else
j=j-2;
for(w=0;w<8;w++)//找出s[j]和Q对应优先表里的位置,对决
{
if(stack[j]==word[w])
p=w;//p记录员,代理人
if(Q==word[w])
q=w;//q记录员,代理人
}
}while(M[p][q]!
='<');//当然所有前提是,可行的情况下,但是为了做出最初的判断,使用了do-while
stack[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');
}
源程序与注释
#include
#include
#include
charword[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;t shengyushuruchuan[t]='\0'; for(t=0,v=a;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;w<8;w++)//查找运算符表,谁与stack[k]匹配 { if(stack[k]==word[w]) flag=1; } if(flag==1) j=k;//j指向终极符了 else j=k-1;//j指向stack中最后一个非终结符 for(w=0;w<8;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;w<8;w++) { if(stack[j-1]==word[w]) flag=1; } if(flag==1) j=j-1; else j=j-2; for(w=0;w<8;w++)//找出s[j]和Q对应优先表里的位置,对决 { if(stack[j]==word[w]) p=w;//p记录员,代理人 if(Q==word[w]) q=w;//q记录员,代理人 } }while(M[p][q]! ='<');//当然所有前提是,可行的情况下,但是为了做出最初的判断,使用了do-while stack[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) { aftertemp[y]=temp[t];//提取类型 y++; t++; } aftertemp[y]='#'; aftertemp[y+1]='\0';//完毕本串 printf("表达式转化为输入串为%s\n",aftertemp); printf("步骤号符号栈优先关系当前分析符剩余输入串动作\n"); for(intw=1;w<10;w++)//初始化栈 stack[w]='\0'; process(aftertemp); } } fclose(fp); printf("END! \n"); return0; } 问题与处理 在调试时经常报错以与出现语法分析失败。 原因与处理文件没有调入。 实验结果 实验心得 语法分析在编译原理课上教师强调了许多,但是编译原理相对较难理解我在课上认真听了教师讲课,但是课下也看了书,觉得理解太难,通过实验认真查资料以与了解语法分析器的具体的处理流程,也学到了很多编程的技巧在教师布置的实验也独立完成了,虽然不怎么好,但还是学到了许多。 同时加深了对语法的分析程度。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北方工业 大学 编译 原理 实验 报告 材料 语法分析