LR分析Word格式文档下载.doc
《LR分析Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《LR分析Word格式文档下载.doc(11页珍藏版)》请在冰豆网上搜索。
5.F→(E)
6.F→ID
该文法的LALR
(1)分析表如下:
分析表
状态
动作Action表(Yy_action)
转移Goto表(Yy_goto)
#
ID
+
*
(
)
S
E
T
F
-
S1
S2
3
4
5
1
R6
2
6
A
S7
R2
S8
R4
S9
7
10
8
11
9
R5
R1
R3
SN=移进并转移到状态NA=accept接受
RN=按第N条产生式进行规约-=error转移
(2)LR分析器总控程序框架如下:
push(0);
advance();
while(Action[tos][sym]!
=accept)
if(Action[tos][sym]==’-’)error();
elseif(Action[tos][sym]==SN){
push(N);
}
elseif(Action[tos][sym]==RN{
act(N);
pop(产生式N的右部的符号个数);
push(Goto[新tos][产生式N的左部符号]);
accept();
上述算法中的有关函数与符号的意义如下:
accept():
返回成功状态,LR分析器停止工作;
act(N):
执行利用产生式N的归约的动作,通常为产生代码;
advance():
丛输入流读下一单词到sym;
error():
出错处理;
pop(N):
从栈顶弹出N个符号(状态);
push(N):
把状态N压入状态栈;
sym:
当前输入的单词符号;
tos:
栈顶状态号。
(3)存放LR分析表的数据结构
①实现方法一:
用一个二维整数数组表示
数组元素为表示动作的整数。
数组的行下标为状态号,列下标用来表示终结符与非终结符的整数表示。
数组元素可作如下约定:
正整数:
表示移进动作,如S6用数6表示;
负整数:
表示归约动作,如R5用数-5表示;
0:
表示接受,通常为按产生式0归约;
状态号也用整数表示;
用不可能是状态号的较大的整数表示错误转移。
请将上述LALR
(1)分析表用这种表示方法,完成LR分析器的程序设计,并添加输出状态栈内容的功能。
用上述表达式文法G的一个句子作为输入,进行测试。
②实现方法二:
采用压缩表示法
动作Action表的每一行用一个数组表示,数组的第一个元素是本数组中存放的数偶个数,第二个元素到最后一个元素都以[终结符,动作]的数偶的形式存放。
再用一个以状态号为下标的下标数组,每个元素含一个指向数偶数组的指针。
若数组元素的值为NULL,则表示从此状态无转移弧发出。
若分析表有几行相同,则只需保存一行,其它元素则都指向存放这一行表的数组即可。
转移Goto表也按同样方式组织,只是这个行数组的数偶为[非终结符,下一状态号]。
每个行数组Yyan表示动作表Yy_action的一行,每个行数组Yygn表示转移表Yy_goto的一行。
假定上述表达式文法G中终结符及非终结符的整数值为:
终结符:
#ID+*()非终结符:
SETF
整数值:
012345整数值:
0123
Yy_action数组是以状态号为下标的下标数组,每个元素含有指向数组Yyan的指针;
下标数组Yy_goto的每个元素含有指向数组Yygn的指针。
表达式文法G的LALR
(1)分析表的具体压缩表示如下:
Yy_action
.
4,2
1,1
Yya000
5,-6
3,-6
2,-6
0,-6
Yya001
0,0
2,7
Yya003
5,-2
2,-2
0,-2
3,8
Yya004
5,-4
3,-4
2,-4
0,-4
Yya005
5,9
Yya006
5,-5
3,-5
2,-5
0,-5
Yya009
5,-1
2,-1
0,-1
Yya010
5,-3
2,-3
0,-3
Yya011
Yyg000
3,5
2,4
1,3
NULL
1,6
Yyg002