LR(1)项目集族的构造:如何确定前向搜索符(旧版)
已经按照markdown格式重新改写和发布,链接 https://blog.csdn.net/hhhhhhhhhhkkkkkkkkkk/article/details/85680859
按照这个标题搜进来的各位是不是以为这也是和课本一样的内容呢,其实这是我看了两天课本才理解出来的内容啊,绝对和课本不一样。
课本上LR(1)项目集族的构造内容如下:
以S′→·S,#属于初始项目集中,把'#'号作为向前搜索符,表示活前缀为γ(若γ是有关S产生式的某一右部)要归约成S时,必须面临输入符为'#'号才行。我们对初始项目S′→·S,# 求闭包后再用转换函数逐步求出整个文法的LR(1)项目集族。具体构造步骤如下:
(1) 构造LR(1)项目集的闭包函数。
a)假定I是一个项目集, I 的任何项目都属于CLOSURE(I)。
b) 若有项目 A→α·Bβ,a 属于CLOSURE(I),B→γ是文法中的产生式,β∈V*,b∈FIRST(βa), 则 B→·γ,b 也属于CLOSURE(I)中。
c) 重复b)直到CLOSURE(I)不再增大为止。
大家是不是看的一头雾水呢。课本上还给出了一个例子:
文法G'为:
(0)S'->S
(1)S->aAd
(2)S->bAc
(3)S->aec
(4)S->bed
(5)A->e
之后直接给出了这个文法的LR(1)项目集规范族:
I0:S'->·S,#
S->·aAd,#
S->·bAc,#
S->·aec,#
S->·bed,#
I1:S'->S·,#
I2:S->a·Ad,#
S->a·ec,#
A->·e,d
I3:S->b·Ac,#
S->b·ed,#
A->·e,c
I4:S->aA·d,#
I5:S->ae·c,#
A->e·,d
I6:S->bA·c,#
I7:S->be·d,#
A->e·,c
I8:S->aAd·,#
I9:S->aec·,#
I10:S->bAc·,#
I11:S->bed·,#
大家是不是在想I5中A->e·,d后的d、I7中A->e·,c后的c是怎么来的呢?
课本的答案是对的,但是写法很是让我们一头雾水,下面让我们来看看答案是怎么出来的:
1.一开始,绿框处S'是整个句子,所以后面理所当然跟句子结束符#。然后S后面是‘ε’(就是什么都没有)所以β=ε,接着逗号后面是‘#’即a=#,这样FIRST(βa)=FIRST(ε#)={#}。这就是I0中S后面#号的来历。
2.在I2中,如红线所示,在I2:S->a·Ad,#中A的后面是d,所以FIRST(d#)={d}(就是“d#”的第一个终结符d),所以接下来A的后面跟的是d。
3.在确定了A的逗号后面的搜索符后,基本上就可以直接照搬下去了,如图中的紫线所示。(其实#号一直都在照搬来着,大家注意到没?)
下面再讲一点FIRST(β)的计算。
1.如果β的第一个字符是终结符,如:
β=aAbbC
β=eBbbD
那么FIRST(β)=FIRST(aAbbC)+FIRST(eBbbD)={a}+{e}={a,e}; (‘+’代表‘并’,那个符号不好打,用‘+’来代替了。)
2.如果β的第一个字符是非终结符,如:
β=AEbC
A=DBac
D=ε
B=ea
B=bd
E=ε
那么:
FIRST(β)=FIRST(AEbC)
=FIRST(FIRST(A)EbC)
=FIRST(FIRST(DBac)EbC)
=FIRST(FIRST(FIRST(D)Bac)EbC)
=FIRST(FIRST(εBac)EbC) (ε表示空,如果不是空,就结束了,但是空还要计算ε后面的Bac)
=FIRST(FIRST(εBac)EbC)+FIRST(FIRST(Bac)EbC)
=FIRST(εEbC)+FIRST(FIRST(Bac)EbC)
=FIRST(FIRST(E)bC)+FIRST(FIRST(Bac)EbC)
={εbC}+FIRST(FIRST(Bac)EbC)
={bC}+FIRST(FIRST(FIRST(ea)ac)EbC)+FIRST(FIRST(FIRST(bd)ac)EbC) (由于B有两个推导式,所以分开来写并求并集,‘+’代表‘并’)
={b}+FIRST(FIRST(eac)EbC)+FIRST(FIRST(bac)EbC)
={b}+FIRST(eEbC)+FIRST(bEbC)
={b}+{e}+{b}
={e,b}
为了普遍性,我把β搞的复杂了点,多看几遍,你就会了。如果不会,在下面留言。我可是看了两天才看懂的。
LR(1)项目集族的构造:如何确定前向搜索符(旧版)相关推荐
- LR(1)项目集族的构造:如何确定前向搜索符(新版)
旧版链接 https://blog.csdn.net/hhhhhhhhhhkkkkkkkkkk/article/details/19990287 按照这个标题搜进来的各位是不是以为这也是和课本一样的内 ...
- 编译原理学习笔记(二十六)~习题:构造基于LR(0)、LR(1)项目的识别活前缀的DFA
题目 文法: S–>Aa | bAc | dc | bda A–>d 通过构造基于LR(0).LR(1)项目的识别活前缀的DFA,判断上面文法 是否是SLR(1)文法?? 是否是LALR( ...
- 编译原理中LR(0)项目集规范族的构造
本文转载自: http://www.cnblogs.com/lazycoding/archive/2012/05/12/2497065.html 此文略长.我也没想到这写起来这么多,但对构造过程绝对 ...
- LR(0)项目集规范族的构造及LR(0)分析表的构造
求出文法的所有项目,按一定规则构造识别活前缀的NFA, 再确定化为DFA确定化的工作量较大,而且容易出错,实际应用中并不使用,这里介绍的目的仅仅是为了便于理解.具体见识别活前缀的有限自动机构建方法_用 ...
- 编译原理LR(0)项目集规范族的构造详解
学编译原理的时候,感觉什么LL(1).LR(0).SLR(1).LALR(1)思想满天飞. 而且做题的时候,一不留意,一道题就写了三页纸了. 就拿今天这个玩意儿来讲,我真的是考试前花了最多的时间,搞懂 ...
- LR(0)项目集规范族和分析表的构造
1. LR分析 LR分析是干什么用的?简单来说就是你在编程时编译器用来判断你输入的符号串是否合法以及时哪一种类型.官方的说法时LR分析是一种能根据当前分析栈中的符号串和向右顺序查看输入串的k个符号就能 ...
- 编译原理LR(0)项目集规范族的构造和分析的构造
学编译原理的时候,感觉什么LL(1).LR(0).SLR(1).LALR(1)思想满天飞. 而且做题的时候,一不留意,一道题就写了三页纸了. 就拿今天这个玩意儿来讲,我真的是考试前花了最多的时间,搞懂 ...
- 一个项目涉及到的50个Sql语句(整理版)
/* 标题:一个项目涉及到的50个Sql语句(整理版) 作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 时间:2010-05-10 地点:重庆航天职业学院 说明:以下五十个语句都按照测试数据进行 ...
- 维护旧项目_为什么您的旧版软件难以维护-以及如何处理。
维护旧项目 Believe it or not, some organizations still rely on legacy software to carry out operations ev ...
最新文章
- c++ sort 从大到小排序_C语言必学的12个排序算法:冒泡排序(第4篇)
- jQuery 3.1.1 官方下载地址
- mysql metadata lock(一)
- 某大型数据中心离心式冷水机组 控制板UPS电源改造项目案例分享
- 鸿蒙开发目录结构及文件使用规则介绍
- discrete mathematics important questions
- 我爱你,与你无关——登录系统的逻辑与结构
- 4. 用MVC实现URL路由
- 加载页面就触发ajax,AJAX post方法,有时会在页面加载时触发,有时不会
- c语言小学生四则运算出题_软件工程第一次作业,小学生四则运算的出题程序...
- JAVA——利用wait和notify实现生产者和消费者
- cocos2d-x学习之旅(九): 2.2 盘古开天辟地,进入游戏世界
- ASP.NET验证控件祥解[转]
- 逆向分析 工具、加壳、安全防护篇
- 51单片机外部中断实例
- 区块链的七阶段位,你属于哪一段?
- selenium中键盘操作:Keys类
- ZYNQ7010 CAN的官方例程改为XCANPS_MODE_NORMAL模式,程序没跑通
- 深度学习之openvino预训练模型测试(车牌识别)
- PHPMyWind支持Word导入