构建LALR(1)项目集族
构造LALR(1)项目有两种思路。一种是:先构造LR(1)项目,再合并同心项目;另一种是:先构造LR(0)项目,再为为其配上搜索符。本文介绍第二种方法。
搜索符生成有两种方法。一是,自己生成。二是,上一项目集传播获得的。项目集之间传播搜索符遇到的问题是:若多个项目集可以直接转移到一个项目集I上,那么每当I接收到,这些项目集传播过来的新的搜索符时,I就得重新再往下传播自己新的搜索符。考虑到这一点可以使用压栈的方式,将可以传播的项目压栈存好,将栈顶弹出用于传播,在传播过程中同时压入新的可传播项目。直到最后栈为空,即没有项目可以传播为止。
假设一含S’->S的拓广文法为G。具体算法如下:
1.
构造G的
LR(0)项目集规范族(实就是为了方便分析,有皆可)。
2.
将I0,S’->S,#压入栈。(I0为S’->S所在项目,#为搜索符,显然它是可以传播的)
3.
将规范族中的所有项目集的生成搜索符压入栈。因为它们是新生的可传播的。
4.
弹出栈顶,使栈顶往下传播。传播到下一个项目中后,生成自生成项目(就是自生符)。将新项入栈。继续传播,直到不能传播为止。
5.
重复第4步,直到栈为空。
上面过程中,所有新项就是LALR(1)项目集族了,包括自生的,和传播的。
示例。考虑如下文法,求其LALR(1)项目集族:
(1)S->L=R
(2)S->R
(3)L->*R
(4)L->i
(5)R->L
此文法的LR(0)项目集规范族为:
I0:
|
S'->·S
|
|
I4:
|
L->*·R
|
|
S->·L=R
|
|
R->·L
|
|
S->·R
|
|
L->·*R
|
|
L->·*R
|
|
L->·i
|
|
L->·i
|
I5:
|
L->i·
|
|
R->·L
|
I6:
|
S->L=·R
|
I1:
|
S'->S·
|
|
R->·L
|
I2:
|
S->L·=R
|
|
L->·*R
|
|
R->L·
|
|
L->·i
|
I3:
|
S->R·
|
I7:
|
L->*R·
|
|
|
I8:
|
R->L·
|
|
|
I9:
|
S->L=R·
|
LALR(1)项目集族构建过程详解(略去了记录新项目操作):
将I0,S'->·S,#压栈。接着各项目集自生符压栈
只有I0有生成符:
I0,L->·*R,=
I0,L->·i,=
栈中的状态为:
I0,S'->·S,#
|
I0,L->·*R,=
|
I0,L->·i,=
|
|
接下来,处理栈顶。
弹出:I0,L->·i,=传播得:I5,L->i·,=。止住。
弹出:I0,L->·*R,=传播得:I4,L->*·R,=。此项可以传播,又可以自生成。先不急传播,保存一下自生成的项目:
I4,R->·L,=
I4, L->·*R,=
I4, L->·i,=
栈状态:
I0,S'->·S,#
|
I0,L->·*R,=
|
I4,R->·L,=
|
I4, L->·*R,=
|
I4, L->·i,=
|
|
好I4, L->*·R,=接着往下传播,得到I7, L->*R·,=。止住。
弹出:I4, L->·i,=传播得I5,L->i·,=。止住。注意,此项已经存在。
弹出I4, L->·*R,=传播得:I4, L->*·R,=。此项已经传播过了。(算法应该有个机制记录项目是否被传播过)
弹出:I4,R->·L,=传播得:I8, R->L·,=。止住。
弹出:I0,L->·*R,=传播得:I4, L->*·R,=。已传播过。
弹出I0,S'->·S,#此时,它还没有自生成,不着急传播。它会生成:
I0,S->·L=R,#
I0,S->·R,#
I0,L->·i,#
I0,L->·*R,#
I0,R->·L,#
而这些项目都是可以传播的,所有都得入栈(我的天呀,还有这么多!)。入栈后,栈状态为:
I0,S->·L=R,#
|
I0,S->·R,#
|
I0,L->·i,#
|
I0,L->·*R,#
|
I0,R->·L,#
|
|
I0,S'->·S,#传播得:I1,
S'->S·,#不能继续了。
弹出:I0,R->·L,#传播得:I2,R->L·,#。止住。
弹出:I0,L->·*R,#传播得:I4,L->*·R,#。此项又自生成:
I4,R->·L,#
I4,L->·*R,#
I4,L->·i,#
此时栈顶状态:
I0,S->·L=R,#
|
I0,S->·R,#
|
I0,L->·i,#
|
I4,R->·L,#
|
I4,L->·*R,#
|
I4,L->·i,#
|
|
I4,L->*·R,#传播得I7,L->*R·,#
弹出:I4,L->·i,#传播得:I5,L->i·,#
弹出:I4,L->·*R,#传播得:I4,L->*·R已经传播过了。
弹出:I4,R->·L,#传播得:I8,R->L·,#。
弹出:I0,L->·i,#传播得:I5,L->i·,#(I5中已有,所以要注意冗余处理)
弹出:I0,S->·R,#传播得:I3,S->R·,#
弹出:I0,S->·L=R,#传播得:I2,S->L·=R,#,没有自生成项,但可以传播,故接着传播得:I6,S->L=·R,#,此项自生成:
I6,R->·L,#
I6,L->·*R,#
I6,L->·i,#
此时栈状态为:
I6,R->·L,#
|
I6,L->·*R,#
|
I6,L->·i,#
|
|
传播I6,S->L=·R,#得:I9,S->L=R·,#
弹出:I6,L->·i,#传播得:I5,L->i·,#
弹出:I6,L->·*R,#传播得:I4,L->*·R,#已经处理过了。
弹出:I6,R->·L,#传播得:I8,R->L·,#到此为止栈终于空了!LALR(1)项目集族也构建好了!
I0:
|
I1:
|
I2:
|
I3:
|
I4:
|
I0,S'->·S,#
|
I1, S'->S·,#
|
I2,S->L·=R,#
|
I3,S->R·,#
|
I4,L->*·R,=/#
|
I0,L->·*R,=/#
|
|
I2,R->L·,#
|
|
I4,R->·L,=/#
|
I0,L->·i,=/#
|
|
|
|
I4,L->·*R,=/#
|
I0,S->·L=R,#
|
|
|
|
I4,L->·i,=/#
|
I0,S->·R,#
|
|
|
|
|
I0,R->·L,#
|
|
|
|
|
I5:
|
I6:
|
I7:
|
I8:
|
I9:
|
I5,L->i·,=/#
|
I6,S->L=·R,#
|
I7, L->*R·,=/#
|
I8, R->L·,=/#
|
I9,S->L=R·,#
|
|
I6,R->·L,#
|
|
|
|
|
I6,L->·*R,#
|
|
|
|
|
I6,L->·i,#
|
|
|
|
分享到:
相关推荐
程序说明: 该程序能够根据给定的文法判断它是否为LR0,SLR1,LR1,LALR1文法; 打印项目集,分析表,Go...若文法属于LR1,将进行LALR1文法的判断,若属于LALR1文法,将继续打印LALR1文法的项目集,分析表和Go函数。
LR1状态图构造与LR1与LALR分析表构造的Flash程序与代码(包含.fla,.as,.exe文件) ●LR1状态图构造 →输入文法,可以构造出LR1状态图 →可以对状态图用张力-斥力模型自动布局 →点击状态编号以高亮显示该状态...
对文法进行自动分析,生成用于LALR1语法分析器的状态转换表,加上框架代码,构造出LALR1语法分析程序
关于SLR,LR(1)及LALR(1)在实践中的效率及状态集规模的探讨以及程序代码 摘要: 编译器的构造中,语法分析是一个非常关键也是较难的部分之一,虽然现在已经有非常成熟的语法分析器的生成器,但是真正大的编译器设计者...
然后构造LALR(1)项目集规范族;再实现LALR(1)分析表构造算法。以教材P.115例5.13为输入,构造并输出其LALR(1)分析表。 详细介绍参考:https://blog.csdn.net/sheziqiong/article/details/125370313
LALR(1)类文法判定及其分析器构造 课程设计 内容全面
LEMON 语法分析生成器(LALR(1)类型)源代码情景分析
其中LR(0), LR(1)以及LALR(1)对程序设计语言语法分析提供了很好的解决方案。但是他们三者的性能如何,到底实际中适和使用哪种分析方法?很多书都提出LALR分析方法同时拥有了前两者的优点,所以是最提倡的。 据笔者...
编译原理及实现技术:16.语法分析_LALR(1)方法.ppt
我在学编译原理课的时候编的,把文法写进文件,然后运行程序即可.产生的DFA在屏幕上显示,分析表写到文件里面.
设计内容及要求: 对任意给定的文法 G 构造 LR(1)项目集规范族(按教材 P.115 所述方法构造...然后构造 LALR(1)项目集规范族;再实现 LALR(1)分析表构造算法。以教材 P.115 例 5.13 为输入,构造并输出其 LALR(1)分析表
语法分析生成器源代码分析,一本不错的书,值得细看。
java编写的LALR1文法分析器
python编写的带图形界面LALR(1)文法,直接运行.py文件即可,含测试用例
构造LR(1)和LALR(1)分析表.pdf
学习编译原理时写的LALR语法分析表生成算法以及归约分析算法. 主要使用了stl. 仅供学习和参考
用java写的LALR编译器,实现语法分析
疯狂的java讲义项目源码LALR(1) 解析器生成研究 LALR(1) 解析器生成的研究和示例代码 介绍 说我疯了,但我一直对 LALR(1) 解析器生成着迷,自从我购买了 Aho、Sethi 和 Ullman 的永恒经典“编译器:原理、技术和工具...
区别LR(0),SLR (1),LR(1),LALR (1).pdf