LR分析程序Word格式文档下载.docx
《LR分析程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《LR分析程序Word格式文档下载.docx(7页珍藏版)》请在冰点文库上搜索。
当在栈顶形成句柄时,则归约为相应的非终结符A,即文法中有A-B的产生式,若B的长度为R(即|B|=R),则从状态栈和文法符号栈中自顶向下去掉R个符号,即栈指针SP减去R,并把A移入文法符号栈内,j=GOTO[i,A]移进状态栈,其中i为修改指针后的栈顶状态。
(3)接受acc:
当归约到文法符号栈中只剩文法的开始符号S时,并且输入符号串已结束即当前输入符是'
#'
,则为分析成功。
(4)报错:
当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入端不是该文法能接受的符号串。
2)、实验过程
(1):
数据结构:
动作表(ACTION)和状态转换(GOTO)表用二维数组表示.
(2)).使用文法
E->
E+T
T
T->
T*F
F
F->
(E)
i
3)程序思路
(1)建立LR分析表
(2)控制部分:
从键盘输入一个表达式符号串;
利用LR分析算法进行表达式处理:
根据LR分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。
(3)主函数:
从键盘输入一个表达式符号串进行识别;
参考程序
#include<
stdio.h>
string.h>
char*action[12][6]={"
S5#"
NULL,NULL,"
S4#"
NULL,NULL,/*ACTION表*/
NULL,"
S6#"
NULL,NULL,NULL,"
acc"
NULL,"
r2#"
"
S7#"
NULL,"
r4#"
"
NULL,NULL,
r6#"
S11#"
NULL,
r1#"
r3#"
r5#"
};
intgoto1[12][3]={1,2,3,/*GOTO表*/
0,0,0,
0,0,0,
8,2,3,
0,9,3,
0,0,10,
0,0,0};
charvt[6]={'
i'
'
+'
*'
('
)'
/*存放终结符*/
charvn[3]={'
E'
T'
F'
/*存放非终结符*/
char*LR[7]={"
S->
E#"
E+T#"
T#"
T*F#"
F#"
(E)#"
i#"
/*存放产生式*/
inta[10];
charb[10],c[10],c1;
inttop,m,n;
intjudge()
{intg,h,i,j,k,l,p,y,z,count;
charx,copy[10],copy1[10];
length;
top=0;
a[0]=0;
y=a[0];
b[0]='
;
count=0;
z=0;
printf("
步骤\t状态栈\t\t符号栈\t\t输入串\t\tACTION\tGOTO\n"
);
do{
y=z;
/*y,z指向状态栈栈顶*/
g=top;
k=0;
x=c[top];
count++;
printf("
%d\t"
count);
m=0;
while(m<
=top){/*输出状态栈*/
printf("
%d"
a[m]);
m=m+1;
}
\t\t"
n=0;
while(n<
=top){/*输出符号栈*/
%c"
b[n]);
n=n+1;
while(g<
=length){/*输出输入串*/
c[g]);
g=g+1;
j=0;
while(j<
6&
&
x!
=vt[j])j++;
if(j>
=6){
error\n"
return0;
if(action[y][j]==NULL){
return0;
strcpy(copy,action[y][j]);
if(copy[0]=='
a'
)return1;
S'
){/*处理移进*/
z=copy[1]-'
0'
if(copy[2]!
='
)z=z*10+copy[2]-'
top=top+1;
a[top]=z;
b[top]=x;
i=0;
while(copy[i]!
){
printf("
copy[i]);
i++;
}
\n"
r'
){/*处理归约*/
h=copy[1]-'
strcpy(copy1,LR[h]);
while(copy1[0]!
=vn[k])k++;
l=strlen(LR[h])-4;
top=top-l+1;
y=a[top-1];
p=goto1[y][k];
a[top]=p;
b[top]=copy1[0];
z=p;
\t"
%d\n"
p);
}while
(1);
}
voidmain(){
inti;
length=0;
请输入表达式\n"
scanf("
&
c1);
c[length]=c1;
length=length+1;
}while(c1!
i=judge();
if(i==1)printf("
acc\n"