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

更新时间:2023-08-28 02:49:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

编译原理实验报告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 输入串

1 0 # abb# S3 ... ... ... ... ... ...

三.实验过程及结果

(说明:实验结果可以是运行画面的抓屏,抓屏图片要尽可能的小。) 实验代码:

#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表*/

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

0,0,

0,5,

0,8,

0,0,

0,0,

0,9,

0,0,

0,0,

0,0};

char vt[3]={'a','b','#'}; /*存放非终结符*/ char vn[2]={'S','B'}; /*存放终结符*/ char *LR[4]={"E->S#","S->BB#","B->aB#","B->b#"};/*存放产生式*/

int a[10];

char b[10],c[10],c1;

int top1,top2,top3,top,m,n;

void main(){

int g,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("请输入表达式\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){ /*输出符号栈*/

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

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++; /*处理移进*/ /*处理归约*/

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

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");

getchar();

}

截屏如下:

四.实验中的问题及心得

同前面一样。实验加深了对LR(1)的理解,再接再厉吧

本文来源:https://www.bwwdw.com/article/xtii.html

Top