实验四非递归预测分析Word文档下载推荐.doc
- 文档编号:13046682
- 上传时间:2022-10-03
- 格式:DOC
- 页数:9
- 大小:1.16MB
实验四非递归预测分析Word文档下载推荐.doc
《实验四非递归预测分析Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《实验四非递归预测分析Word文档下载推荐.doc(9页珍藏版)》请在冰豆网上搜索。
3prgm’→ε10term’→ε
4expr→termexpr’11factor→(expr)
5expr→ε12factor→num
6expr’→+termexpr’13system_goal→prgm
7expr’→ε
该LL
(1)文法的LL
(1)分析表如下:
T
N
Num
+
*
(
)
;
#
prgm
1
prgm’
2
3
expr
4
5
expr’
6
7
term
8
term’
10
9
factor
12
11
system_goal
13
对文法中每个文法符号指定一个常数值,符号编码表如下:
文法符号
常数值
备注
终结符
(#为输入结束标志)
Expr
258
260
259
262
261
256
257
263
非终结符
四、文法及其LL
(1)分析表的数据结构
文法的产生式可用数组Yy_pushtab[]存放。
数组的第一个下标是产生式号,第一个产生式的序号为0;
每列按逆序存放该产生式右部各符号的常数值,并以0结束。
对于该表达式语言XL的LL
(1)分析表,可用数组Yy_d[]存放。
第一个下标是非终结符数值,第二个下标是终结符数值,数组元素的值为:
0(表示接受),1(表示产生式号),-1(表示语法错)。
数组Yy_d[]的具体内容及表示如下:
0123456
#;
+*()Num
-1
prgm256
prgm’257
expr258
term259
expr’260
factor261
term’262
system_goal263
数组Yy_pushtab[]的具体内容及表示如下:
五、预测分析器总控程序结构
预测分析器总控程序使用上面的两个表Yy_pushtab、Yy_d和一个分析栈(元素类型为int),其结构如下:
初始化;
/*把开始符号的常数值压入分析站,输入指向第一个输入符号*/
while(分析栈非空){
if(栈顶常数表示一个终结符)
if(该常数与输入符号的常数不等)
报语法错;
else{
把一个数从栈顶弹出;
advance读下一输入符号;
}
else{/*栈顶的常数表示一个非终结符*/
what_to_do=Yy_d[栈顶常数][当前输入符号的常数];
if(what_to_do==-1)
把栈顶元素弹出栈;
把Yy_pushtab[what_to_do]中列出的全部常数压入分析栈;
请实现该程序。
在程序中添加输出栈内容的功能,以便和手工模拟分析过程作比较。
六、预测分析控制程序的测试用例
用预测分析器和手工模拟两种方式对文法的句子1+2;
进行分析。
综合分析过程可用下表表示。
栈(符号)
栈(数值)
输入串
What_to_do
prgm’;
expr
expr’term
expr’term’factor
expr’term’Num
expr’term’
expr’
expr’term
expr’term’
prgm’
2571258
2571260259
2571260262261
25712602626
2571260262
2571260
25712602592
2571260259
2571260262
257
1+2;
+2;
2;
;
思考:
请考虑如何设计并实现LL
(1)分析表的自动生成程序。
七、实验代码
根据上述LALR
(1)分析表压缩表示方法,完成LR分析器的程序设计,并添加输出状态栈内容的功能。
用上述表达式文法G的一个句子作为输入,进行测试。
实验源程序:
#include<
stdio.h>
string.h>
char*action[10][3]={"
S3#"
"
S4#"
NULL,
/*ACTION
表
*/
NULL,NULL,"
acc"
"
S6#"
S7#"
r3#"
r1#"
r2#"
};
intgoto1[10][2]={1,2,/*QOTO表*/
0,0,
0,5,
0,8,
0,9,
0,0};
charvt[3]={'
a'
'
b'
#'
/*存放非终结符*/
charvn[2]={'
S'
B'
/*存放终结符*/
char*LR[4]={"
E->
S#"
S->
BB#"
B->
aB#"
b#"
/*存放产生式*/
inta[10];
charb[10],c[10],c1;
inttop1,top2,top3,top,m,n;
voidmain(){
intg,h,i,j,k,l,p,y,z,count;
charx,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"
);
-------------------汪鑫-------------------\n"
----------------20170527----------------\n"
----------------请输入表达式--------------\n"
do{
scanf("
%c"
&
c1);
c[top3]=c1;
top3=top3+1;
}while(c1!
='
步骤\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++;
%d\t"
count);
while(m<
=top1){/*输出状态栈*/
%d"
a[m]);
m=m+1;
}
\t\t"
while(n<
=top2){/*输出符号栈*/
b[n]);
n=n+1;
while(g<
=top3){/*输出输入串*/
c[g]);
g=g+1;
while(x!
=vt[j]&
&
j<
=2)j++;
if(j==2&
x!
=vt[j]){
error\n"
return;
}
if(action[y][j]==NULL){
else
strcpy(copy,ac
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 递归 预测 分析