编译原理实验5LR0分析.doc
- 文档编号:338260
- 上传时间:2022-10-09
- 格式:DOC
- 页数:6
- 大小:22KB
编译原理实验5LR0分析.doc
《编译原理实验5LR0分析.doc》由会员分享,可在线阅读,更多相关《编译原理实验5LR0分析.doc(6页珍藏版)》请在冰豆网上搜索。
一、实验目的与任务
构造LR(0)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。
二、实验涉及的相关知识点
1、使用LR
(1)的优点:
(1)LR分析器能够构造来识别所有能用上下文无关文法写的程序设计语言的结构。
(2)LR分析方法是已知的最一般的无回溯移进-归约方法,它能够和其他移进-归约方法一样有效地实现。
(3)LR方法能分析的文法类是预测分析法能分析的文法类的真超集。
(4)LR分析器能及时察觉语法错误,快到自左向右扫描输入的最大可能。
为了使一个文法是LR的,只要保证当句柄出现在栈顶时,自左向右扫描的移进-归约分析器能够及时识别它便足够了。
当句柄出现在栈顶时,LR分析器必须要扫描整个栈就可以知道这一点,栈顶的状态符号包含了所需要的一切信息。
如果仅知道栈内的文法符号就能确定栈顶是什么句柄。
LR分析表的转移函数本质上就是这样的有限自动机。
不过,这个有限自动机不需要根据每步动作读栈,因为,如果这个识别句柄的有限自动机自底向上读栈中的文法符号的话,它达到的状态正是这时栈顶的状态符号所表示的状态,所以,LR分析器可以从栈顶的状态确定它需要从栈中了解的一切。
2、LR分析器由三个部分组成:
(1)总控程序,也可以称为驱动程序。
对所有的LR分析器总控程序都是相同的。
(2)分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表将不同,分析表又可以分为动作表(ACTION)和状态转换(GOTO)表两个部分,它们都可用二维数组表示。
(3)分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。
分析器的动作就是由栈顶状态和当前输入符号所决定。
LR分析器结构:
三、实验内容与过程
程序输入/输出示例:
对下列文法,用LR(0)分析法对任意输入的符号串进行分析:
(1)E->E+T
(2)E->E—T
(3)T->T*F
(4)T->T/F
(5)F->(E)
(6)F->i
四、实验结果及分析
输出的格式如下:
(1)LR(0)分析程序,编制人:
姓名,学号,班级
(2)输入一以#结束的符号串(包括+—*/()i#):
在此位置输入符号串
(3)输出过程如下:
步骤
状态栈
符号栈
剩余输入串
动作
1
0
#
i+i*i#
移进
(4)输入符号串为非法符号串(或者为合法符号串)
六、实验有关附件(如程序、附图、参考资料,等)
#include
#include
char*action[10][3]={"S3#","S4#",NULL,/*ACTION表*/
NULL,NULL,"acc",
"S6#","S7#",NULL,
"S3#","S4#",NULL,
"r3#","r3#",NULL,
NULL,NULL,"r1#",
"S6#","S7#",NULL,
NULL,NULL,"r3#",
"r2#","r2#",NULL,
NULL,NULL,"r2#"};
intgoto1[10][2]={1,2,/*QOTO表*/
0,0,
0,5,
0,8,
0,0,
0,0,
0,9,
0,0,
0,0,
0,0};
charvt[3]={'a','b','#'};/*存放非终结符*/
charvn[2]={'S','B'};/*存放终结符*/
char*LR[4]={"E->S#","S->BB#","B->aB#","B->b#"};/*存放产生式*/
inta[10];
charb[10],c[10],c1;
inttop1,top2,top3,top,m,n;
voidmain(){
intg,h,i,j,k,l,p,y,z,count;
charx,copy[10],copy1[10];
top1=0;top2=0;top3=0;top=0;
a[0]=0;y=a[0];b[0]='#';
count=0;z=0;
printf("请输入表达式\n");
do{
scanf("%c",&c1);
c[top3]=c1;
top3=top3+1;
}while(c1!
='#');
printf("步骤\t状态栈\t\t符号栈\t\t输入串\t\tACTION\tGOTO\n");
do{
y=z;m=0;n=0;/*y,z指向状态栈栈顶*/
g=top;j=0;k=0;
x=c[top];
count++;
printf("%d\t",count);
while(m<=top1){/*输出状态栈*/
printf("%d",a[m]);
m=m+1;
}
printf("\t\t");
while(n<=top2){/*输出符号栈*/
printf("%c",b[n]);
n=n+1;
}
printf("\t\t");
while(g<=top3){/*输出输入串*/
printf("%c",c[g]);
g=g+1;
}
printf("\t\t");
while(x!
=vt[j]&&j<=2)j++;
if(j==2&&x!
=vt[j]){
printf("error\n");
return;
}
if(action[y][j]==NULL){
printf("error\n");
return;
}
else
strcpy(copy,action[y][j]);
if(copy[0]=='S'){/*处理移进*/
z=copy[1]-'0';
top1=top1+1;
top2=top2+1;
a[top1]=z;
b[top2]=x;
top=top+1;
i=0;
while(copy[i]!
='#'){
printf("%c",copy[i]);
i++;
}
printf("\n");
}
if(copy[0]=='r'){/*处理归约*/
i=0;
while(copy[i]!
='#'){
printf("%c",copy[i]);
i++;
}
h=copy[1]-'0';
strcpy(copy1,LR[h]);
while(copy1[0]!
=vn[k])k++;
l=strlen(LR[h])-4;
top1=top1-l+1;
top2=top2-l+1;
y=a[top1-1];
p=goto1[y][k];
a[top1]=p;
b[top2]=copy1[0];
z=p;
printf("\t");
printf("%d\n",p);
}
}while(action[y][j]!
="acc");
printf("acc\n");
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 LR0 分析