最新LR1分析法.docx
- 文档编号:27448725
- 上传时间:2023-07-01
- 格式:DOCX
- 页数:12
- 大小:78.60KB
最新LR1分析法.docx
《最新LR1分析法.docx》由会员分享,可在线阅读,更多相关《最新LR1分析法.docx(12页珍藏版)》请在冰豆网上搜索。
最新LR1分析法
LR
(1)分析法
河南工业大学实验报告
课 程 编译原理 实验名称 LR
(1)分析法
系 别___河南工业大学信息科学与工程学院_
专业班级__计科0905___实验日期2012年5月10日
姓 名__杨金锋______学 号__200948140512___
实验指导教师_ __阎娟___
一、实验目的和要求
1.掌握LR(1)分析法的基本原理
2.掌握LR
(1)分析表的构造方法
3.掌握LR
(1)驱动程序的构造方法
二、实验内容
构造LR
(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。
(1)LR(1)分析程序,编制人:
姓名,学号,班级
(2)输入一以#结束的符号串(包括+-*/()i#):
i*i+i#
(3)输出过程如下:
步骤
状态栈
符号栈
剩余输入串
动作
1
0
#
i+i*i#
移进
(4)输入符号串为非法符号串(或者为合法符号串)
三、实验步骤
基于实验的内容,构造程序所需的模块
全局变量与表:
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#”};
int goto1[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(){
printf(”LR
(1)分许程序:
姓名:
杨金锋 学号:
2 班级:
计科0905\n");
ﻩ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(”请输入表达式”);
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”);
}
四、实验过程记录:
ﻩ程序源代码:
#include〈stdio.h>
#include〈string.h〉
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;
void main(){
ﻩprintf(”LR(1)分许程序:
姓名:
杨金锋学号:
200948140512班级:
计科0905\n”);
ﻩintg,h,i,j,k,l,p,y,z,count;
char x,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("请输入表达式”);
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");
}
运行结果:
五、实验总结:
此次试验为LR(1)分析法的试验,通过实验,让我对LR
(1)分析法基本原理,LR
(1)分析表的构造方法等都有了一定的熟悉,还有LR
(1)的不同扫描方法。
通过程序的分析与揣摩,让我对这方面的文法实现有了一定的头绪,对以后的一些文法的实现程序的编写有很大的帮助。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 LR1 分析