编译原理实验报告LR(1)分析法

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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];
int a[10];
char b[10],c[10],c1;
int top1,top2,top3,top,m,n;
voidmain(){
ﻩintg,h,i,j,k,l,p,y,z,count;
ﻩchar x,copy[10],copy1[10];
top1=0;top2=0;top3=0;top=0;
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;
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){/*输出符号栈*/
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");
ﻩ(说明:实验结果可以是运行画面的抓屏,抓屏图片要尽可能的小。)
实验代码:
#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#"};
int goto1[10][2]={
ﻩ 1,2,/*GOTO表*/
z=p;
printf("\t");
printf("%d\n",p);
} }
while(action[y][j]!="acc");
printf("acc\n");
getchar();
}
截屏如下:
四.实验中的问题及心得
同前面一样。实验加深了对LR(1)的理解,再接再厉吧
河南工业大学实验报告
课 程编译原理实验名称实验四 LR(1)分析法
一.实验目的
ﻩ1.掌握LR(1)分析法的基本原理;
2.掌握LR(1)分析表的构造方法;
3.掌握LR(1)驱动程序的构造方法。
二.实验内容及要求
根据某一文法编制调试LR(1)分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对LR(1)分析法的理解。
对下列文法,用LR(1)分析法对任意输入的符号串进行分析:
(0)E->S
(1)S->BB
(2)B->aB
(3)B->b
ﻩ程序输入一以#结束的符号串(包括a、b、#),如:abb#。输出过程如下:
步骤
状态栈
符号栈
输入串
ACTION
GOTO

0
#
abb#
S3
...
...
...
...
...Байду номын сангаас
...
三.实验过程及结果
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");
0,0,
ﻩ 0,5,
0,8,
0,0,
0,0,
0,9,
0,0,
0,0,
0,0};
charvt[3]={'a','b','#'};/*存放非终结符*/
char vn[2]={'S','B'};/*存放终结符*/
char*LR[4]={"E->S#","S->BB#","B->aB#","B->b#"};/*存放产生式*/
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]);
相关文档
最新文档