LR1分析法Word文档格式.docx
《LR1分析法Word文档格式.docx》由会员分享,可在线阅读,更多相关《LR1分析法Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
(3)接受acc:
当归约到文法符号栈中只剩文法的开始符号S时,并且输入符号串已结束即当前输入符是'
#'
,则为分析成功。
(4)报错:
当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入端不是该文法能接受的符号串。
四、实验要求
1、编程时注意编程风格:
空行的使用、注释的使用、缩进的使用等。
2、如果遇到错误的表达式,应输出错误提示信息。
3、程序输入/输出实例:
输入一以#结束的符号串(包括+—*/()i#):
在此位置输入符号串
输出过程如下:
步骤状态栈符号栈剩余输入串动作
10#i+i*i#移进
i+i*i的LR分析过程
步骤
状态栈
符号栈
输入串
动作说明
1
#
i+i*i#
ACTION[0,i]=S5,状态5入栈
2
05
#i
+i*i#
r6:
F→i归约,GOTO(0,F)=3入栈
3
03
#F
r4:
T→F归约,GOTO(0,T)=3入栈
4
02
#T
r2:
E→T归约,GOTO(0,E)=1入栈
5
01
#E
ACTION[1,+]=S6,状态6入栈
6
016
#E+
i*i#
ACTION[6,i]=S5,状态5入栈
7
0165
#E+i
*i#
F→i归约,GOTO(6,F)=3入栈
8
0163
#E+F
T→F归约,GOTO(6,T)=9入栈
9
0169
#E+T
ACTION[9,*]=S7,状态7入栈
10
01697
#E+T*
i#
ACTION[7,i]=S5,状态5入栈
11
016975
#E+T*i
F→i归约,GOTO(7,F)=10入栈
12
0169710
#E+T*F
r3:
T→T*F归约,GOTO(6,T)=9入栈
13
r1:
E→E+T,GOTO(0,E)=1入栈
14
Acc:
分析成功
4、输入符号串为非法符号串(或者为合法符号串)
算术表达式文法的LR分析表
状
态
ACTION
GOTO
i
+
*
(
)
E
T
F
S5
S4
S6
acc
r2
S7
r4
r6
S11
r1
r3
r5
五、实验步骤
1、根据流程图编写出各个模块的源程序代码上机调试。
2、编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计的LR
(1)语法分析程序;
直至能够得到完全满意的结果。
3、书写实验报告;
实验报告正文的内容:
◆描述LR
(1)语法分析程序的设计思想。
◆程序结构描述:
函数调用格式、参数含义、返回值描述、函数功能;
函数之间的调用关系图。
◆详细的算法描述(程序执行流程图)。
◆给出软件的测试方法和测试结果。
◆实验总结(设计的特点、不足、收获与体会)。
源程序:
#include<
iostream>
cstdio>
cstdlib>
cstring>
stack>
usingnamespacestd;
intk=0;
structNode1
{
intstate;
charvt;
ints;
}map[100];
//当状态栈中的状态遇到终结符或者非终结符时应如何归约或移进
//用M代表S'
用R代表E'
W代表T'
e代表空
intss[12]={0,1,2,3,4,5,6,7,8,9,10,11};
charS[12][4]={"
S0"
"
S1"
S2"
S3"
S4"
S5"
S6"
S7"
S8"
S9"
S10"
S11"
};
charR[12][4]={"
r0"
r1"
r2"
r3"
r4"
r5"
r6"
charG[10][10]={"
M->
E"
E->
E+T"
T"
T->
T*F"
F"
F->
(E)"
i"
//存储文法中的产生式
charVN[6]={'
E'
'
T'
F'
//存储非终结符
charVT[6]={'
+'
*'
('
)'
i'
//存储终结符
charRight[10][8]={"
stack<
char>
stak1,stak2;
//stak用于状态栈,stak1用于符号栈
intACTION[12][6]={200,200,4,200,5,200,6,200,200,200,200,0,102,7,200,102,200,102,104,104,200,104,200,104,200,200,4,200,5,200,106,106,200,106,200,106,200,200,4,200,5,200,200,200,4,200,5,200,6,200,200,11,200,200,101,7,200,101,200,101,103,103,200,103,200,103,105,105,200,105,200,105};
intGOTO[12][3]={1,2,3,200,200,200,200,200,200,200,200,200,8,2,3,200,200,200,200,9,3,200,200,10,200,200,200,200,200,200,200,200,200,200,200,200};
intFind(intstate,charvt)
inti;
for(i=0;
i<
k;
i++)
{
if(map[i].vt==state&
&
map[i].vt==vt)
returnmap[i].s;
}
return200;
}
intempty1(intq[],intn)
{
for(inti=0;
n;
if(q[i]!
=-1)return1;
break;
return0;
intpoint(intstak[],intn)
inttemp=0;
for(inti=0;
if(stak[i]==-1)break;
temp=i-1;
returntemp;
voidpop1(intq[],intn){
inttemp;
temp=point(q,n);
q[temp]=-1;
voidpush1(intq[],intn,inte){
q[temp+1]=e;
inttop1(intq[],intn)
inttemp;
temp=point(q,n);
returnq[temp];
intvn_t(charc){
6;
if(VT[i]==c)returni;
for(i=0;
if(VN[i]==c)returni;
return100;
}
char*Analyse(char*word)
{
intstak[12];
intp,q;
inth;
intvt_n1;
intact;
charoutput[10];
inti=1,j,l=strlen(word),k=0,m;
for(intd=0;
d<
12;
d++)
stak[d]=-1;
while(!
stak1.empty())
stak1.pop();
while(empty1(stak,12))
pop1(stak,12);
push1(stak,12,100);
stak1.push('
);
push1(stak,12,0);
printf("
________________________________________________________________________________\n"
\n对符号串%s的分析过程\n"
word);
步骤状态栈元素符号栈顶元素剩余输入串ACTIONGOTO\n"
p=top1(stak,12);
h=stak1.top();
while(p!
=100)
%3d"
i++);
q=point(stak,12);
for(i=1;
=q;
printf("
%d"
stak[i