构建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)项目集族相关推荐

  1. 在k8s中使用gradle构建java web项目镜像Dockerfile

    在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...

  2. Maven学习总结(八)——使用Maven构建多模块项目

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(八)--使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分 ...

  3. 微软todo使用教程_Todo教程可能很有趣-但是,这是从头开始构建自己的项目的方法...

    微软todo使用教程 There are many great tutorials that walk you through creating apps, from simple todo list ...

  4. 构建一个react项目_您想要了解更多有关React的内容吗? 让我们构建一个游戏,然后玩。...

    构建一个react项目 by Samer Buna 通过Samer Buna 您想要了解更多有关React的内容吗? 让我们构建一个游戏,然后玩. (Do you want to learn more ...

  5. jenkins构建一个maven项目[五]

    标签(linux): jenkins 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 构建一个maven项目,即为构建java项目.模拟实验之前先把实验代码推送到 ...

  6. 使用maven一步一步构建spring mvc项目

    1      使用eclipse构建maven web项目 1.1新建Maven的web项目 打开菜单File –New-MavenProject. 点击Next 选择模板类型archtype--ma ...

  7. Maven学习总结(8)——使用Maven构建多模块项目

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(八)--使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分 ...

  8. Maven-EclipseEE使用Maven构建Java web项目从0到1

    Maven是什么 安装Maven 解压apache-maven-350-binzip 新建变量M2_HOME配置Maven主目录 在 Path 变量中添加 Maven的bin目录 命令窗口mvn -v ...

  9. 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 ...

  10. 构建强化学习_如何构建强化学习项目(第1部分)

    构建强化学习 Ten months ago, I started my work as an undergraduate researcher. What I can clearly say is t ...

最新文章

  1. excel pandas 空格_Pandas写入excel:1)索引中的空白行;2)每天保存索引
  2. 多delegate使用
  3. java 匿名类 实现接口_细谈 Java 匿名内部类 【分别 使用 接口 和 抽象类实现】...
  4. html2canvas的踩坑之路
  5. 网址出现error.aspx?aspxerrorpath=404.htm?aspxerrorpath=的原因及解决办法转
  6. 哈工大理论力学第八版电子版_校史上的这些天(37)| 和你一起在“岁月”中读懂哈工大...
  7. HDU 1512 Monkey King(左偏堆)
  8. kudu:插入报错:Row error for primary key=9, tablet=null, server=xx, status=Not found: key not found
  9. 从零开始学前端:购物车和鲜花价格排序 --- 今天你学习了吗?(JS:Day12)
  10. 呉服屋 2011/03/24早会文章
  11. AutoCAD输出矢量图
  12. 小巧的网页聊天工具提供-GOFLY在线客服系统
  13. Zigbee协议网络相关的东西(1)
  14. 光耦主要参数和高速光耦如何选型
  15. js中三大特殊数据underfined,null,NaN
  16. Windows 微信双开(批处理)
  17. android 微信文件位置改变大小,安卓微信8.0.6内测更新:发文件大小上调1G等6个变化!...
  18. c语言静态检测工具,静态代码检测工具---PC-lint(for c/c )
  19. IoU优化——在Anchor-Free中提升目标检测精度(附源码)
  20. 一度智信:新开的电商店铺销量低?如何快速提升

热门文章

  1. 产学研2.0:麦可思大学生就业据、企业创新调查年鉴(含产学研部分)、RD相关数据等
  2. [dig]使用dig查看当前网络连通情况
  3. FreeRTOS学习记录(安富莱FreeRTOS教程摘录)
  4. oracle64位 32位plsql,64位oracle 安装32位plsql develop
  5. 线性规划问题(excel和python)
  6. 如何设置sap生产订单自动关闭
  7. 关于破解Quartus
  8. Matlab读取显示图像顺序
  9. 小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 F2812的存储器映像
  10. 利用Contacts Provider读取手机联系人信息