课 程 编译原理 实验名称 实验四 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
程序输入#结束符号串(包括ab#):abb#输出程:
步骤
状态栈
符号栈
输入串
ACTION
GOTO
1
0
#
abb#
S3
三 实验程结果
(说明:实验结果运行画面抓屏抓屏图片)
实验代码:
#include
#include
char *action[10][3]{S3#S4#NULL *ACTION表*
NULLNULLacc
S6#S7#NULL
S3#S4#NULL
r3#r3#NULL
NULLNULLr1#
S6#S7#NULL
NULLNULLr3#
r2#r2#NULL
NULLNULLr2#}
int goto1[10][2]{
12 *GOTO表*
00
05
08
00
00
09
00
00
00}
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 top1top2top3topmn
void main(){
int ghijklpyzcount
char xcopy[10]copy1[10]
top10top20top30top0
a[0]0ya[0]b[0]'#'
count0z0
printf(请输入表达式\n)
*输出状态栈输出符号栈输出输入串*
do{
scanf(c&c1)
c[top3]c1
top3top3+1
}while(c1'#')
printf(步骤\t状态栈\t\t符号栈\t\t输入串\t\tACTION\tGOTO\n)
do{
yzm0n0 *yz指状态栈栈顶*
gtopj0k0
xc[top]
count++
printf(d\tcount)
while(m
mm+1
}
printf(\t\t)
while(n
nn+1
}
printf(\t\t)
while(g
gg+1
}
printf(\t\t)
while(xvt[j]&&j<2) j++
if(j2&&xvt[j]){
printf(error\n)
return
}
if(action[y][j]NULL){
printf(error\n)
return
}
else
strcpy(copyaction[y][j])
if(copy[0]'S'){ *处理移进*
zcopy[1]'0'
top1top1+1
top2top2+1
a[top1]z
b[top2]x
toptop+1
i0
while(copy[i]'#'){
printf(ccopy[i])
i++
}
printf(\n)
}
if(copy[0]'r'){ *处理约*
i0
while(copy[i]'#'){
printf(ccopy[i])
i++
}
hcopy[1]'0'
strcpy(copy1LR[h])
while(copy1[0]vn[k]) k++
lstrlen(LR[h])4
top1top1l+1
top2top2l+1
ya[top11]
pgoto1[y][k]
a[top1]p
b[top2]copy1[0]
zp
printf(\t)
printf(d\np)
} }
while(action[y][j]acc)
printf(acc\n)
getchar()
}
截屏:
四 实验中问题心
前面样实验加深LR(1)理解接厉吧
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档