- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验五 LR 分析
.实验目的与任务
设计一个 LR分析器,实现对表达式语言的分析,加深对
LR 语法分析方法的
基本思想的理解,掌握
LR分析器设计与实现的基本方法。
2.实验要求
太原科技大学 计算机学科学与技术院
计算机 08200 班
李永峰
建立文法及其 LR 分析表表示的数据结构,设计并实现一个
LALR(1)的分析
器,对源程序经词法分析后生成的二元式代码流进行分析,
如果输入串是文法定
义的句子则输出“是” ,否则输出“否”。
3.实验内容
(1)文法描述及其 LALR(1)分析表
描述表达式语言的文法 G如下:
0.
S → E
1.
E→E+T
2.
E → T
3.
T→T*F
4.
T → F
5.
F→(E)
6.
F→ID
该文法的 LALR(1)分析表如下:
分析表
动作 Action
表(Yy_action ) 转
移
Goto
表
状态
(Yy_goto)
#
ID
+
*
(
)
S
E
T
F
0
-
S1
-
-
S2
-
-
3
4
5
1
R6
-
R6
R6
-
R6
-
-
-
-
2
-
S1
-
-
S2
-
-
6
4
5
3
A
-
S7
-
-
-
-
-
-
-
4
R2
-
R2
S8
-
R2
-
-
-
-
5
R4
-
R4
R4
-
R4
-
-
-
-
6
-
-
S7
-
-
S9
-
-
-
-
7
-
S1
-
-
S2
-
-
-
10
5
8
-
S1
-
-
S2
-
-
-
-
11
9
R5
-
R5
R5
-
R5
-
-
-
-
10
R1
-
R1
S8
-
R1
-
-
-
-
11
R3
-
R3
R3
-
R3
-
-
-
-
SN =
移进并转移到状态 N
A = accept
接受
RN = 按第 N条产生式进行规约
- = error
转移
(2)LR 分析器总控程序框架如下:
push(0);
advance();
while(Action[tos][sym]!=accept)
if(Action[tos][sym]== ’- ’ ) error();
else if (Action[tos][sym]==SN){
push(N);
advance();
}
else if ( 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 + * ( ) 非终结符:S E T F
整数值:0 1 2 3 4 5 整数值: 0 1 2 3
Yy_action 数组是以状态号为下标的下标数组, 每个元素含有指向数组 Yyan 的指针;下标数组 Yy_goto 的每个元素含有指向数组
原创力文档


文档评论(0)