构建LALR(1)项目集族
构建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,# |
|
|
|
构建LALR(1)项目集族相关推荐
- 在k8s中使用gradle构建java web项目镜像Dockerfile
在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...
- Maven学习总结(八)——使用Maven构建多模块项目
2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(八)--使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分 ...
- 微软todo使用教程_Todo教程可能很有趣-但是,这是从头开始构建自己的项目的方法...
微软todo使用教程 There are many great tutorials that walk you through creating apps, from simple todo list ...
- 构建一个react项目_您想要了解更多有关React的内容吗? 让我们构建一个游戏,然后玩。...
构建一个react项目 by Samer Buna 通过Samer Buna 您想要了解更多有关React的内容吗? 让我们构建一个游戏,然后玩. (Do you want to learn more ...
- jenkins构建一个maven项目[五]
标签(linux): jenkins 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 构建一个maven项目,即为构建java项目.模拟实验之前先把实验代码推送到 ...
- 使用maven一步一步构建spring mvc项目
1 使用eclipse构建maven web项目 1.1新建Maven的web项目 打开菜单File –New-MavenProject. 点击Next 选择模板类型archtype--ma ...
- Maven学习总结(8)——使用Maven构建多模块项目
2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(八)--使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分 ...
- Maven-EclipseEE使用Maven构建Java web项目从0到1
Maven是什么 安装Maven 解压apache-maven-350-binzip 新建变量M2_HOME配置Maven主目录 在 Path 变量中添加 Maven的bin目录 命令窗口mvn -v ...
- myeclipse java maven web 项目结构,Myeclipse 10 Maven 构建 Java Web 项目
下载 Maven http://maven.apache.org/download.cgi,解压到任意非C盘位置,比如:D:\Java\apache-maven-3.1.0 打开 Myeclipse ...
- 构建强化学习_如何构建强化学习项目(第1部分)
构建强化学习 Ten months ago, I started my work as an undergraduate researcher. What I can clearly say is t ...
最新文章
- excel pandas 空格_Pandas写入excel:1)索引中的空白行;2)每天保存索引
- 多delegate使用
- java 匿名类 实现接口_细谈 Java 匿名内部类 【分别 使用 接口 和 抽象类实现】...
- html2canvas的踩坑之路
- 网址出现error.aspx?aspxerrorpath=404.htm?aspxerrorpath=的原因及解决办法转
- 哈工大理论力学第八版电子版_校史上的这些天(37)| 和你一起在“岁月”中读懂哈工大...
- HDU 1512 Monkey King(左偏堆)
- kudu:插入报错:Row error for primary key=9, tablet=null, server=xx, status=Not found: key not found
- 从零开始学前端:购物车和鲜花价格排序 --- 今天你学习了吗?(JS:Day12)
- 呉服屋 2011/03/24早会文章
- AutoCAD输出矢量图
- 小巧的网页聊天工具提供-GOFLY在线客服系统
- Zigbee协议网络相关的东西(1)
- 光耦主要参数和高速光耦如何选型
- js中三大特殊数据underfined,null,NaN
- Windows 微信双开(批处理)
- android 微信文件位置改变大小,安卓微信8.0.6内测更新:发文件大小上调1G等6个变化!...
- c语言静态检测工具,静态代码检测工具---PC-lint(for c/c )
- IoU优化——在Anchor-Free中提升目标检测精度(附源码)
- 一度智信:新开的电商店铺销量低?如何快速提升
热门文章
- 产学研2.0:麦可思大学生就业据、企业创新调查年鉴(含产学研部分)、RD相关数据等
- [dig]使用dig查看当前网络连通情况
- FreeRTOS学习记录(安富莱FreeRTOS教程摘录)
- oracle64位 32位plsql,64位oracle 安装32位plsql develop
- 线性规划问题(excel和python)
- 如何设置sap生产订单自动关闭
- 关于破解Quartus
- Matlab读取显示图像顺序
- 小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 F2812的存储器映像
- 利用Contacts Provider读取手机联系人信息