LR(1)项目集族的构造:如何确定前向搜索符

按照这个标题搜进来的各位是不是以为这也是和课本一样的内容呢,其实这是我看了两天课本才理解出来的内容啊,绝对和课本不一样。

课本上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

2.如果β的第一个字符是非终结符,如:

β=AEbC

A=DBac

D=ε

B=ea

B=bd

那么:

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(Bac)EbC)

={ε}+FIRST(FIRST(FIRST(ea)ac)EbC)+FIRST(FIRST(FIRST(bd)ac)EbC)        (由于B有两个推导式,所以分开来写并求并集,‘+’代表‘并’)

={ε}+FIRST(FIRST(eac)EbC)+FIRST(FIRST(bac)EbC)

={ε}+FIRST(eEbC)+FIRST(bEbC)

={ε}+{e}+{b}

={ε,e,b}

转载自:https://blog.csdn.net/hhhhhhhhhhkkkkkkkkkk/article/details/19990287

LR(1)项目集族的构造:如何确定前向搜索符相关推荐

  1. LR(1)项目集族的构造:如何确定前向搜索符(旧版)

    已经按照markdown格式重新改写和发布,链接 https://blog.csdn.net/hhhhhhhhhhkkkkkkkkkk/article/details/85680859 按照这个标题搜 ...

  2. LR(1)项目集族的构造:如何确定前向搜索符(新版)

    旧版链接 https://blog.csdn.net/hhhhhhhhhhkkkkkkkkkk/article/details/19990287 按照这个标题搜进来的各位是不是以为这也是和课本一样的内 ...

  3. 编译原理学习笔记(二十六)~习题:构造基于LR(0)、LR(1)项目的识别活前缀的DFA

    题目 文法: S–>Aa | bAc | dc | bda A–>d 通过构造基于LR(0).LR(1)项目的识别活前缀的DFA,判断上面文法 是否是SLR(1)文法?? 是否是LALR( ...

  4. 编译原理中LR(0)项目集规范族的构造

    本文转载自:  http://www.cnblogs.com/lazycoding/archive/2012/05/12/2497065.html 此文略长.我也没想到这写起来这么多,但对构造过程绝对 ...

  5. LR(0)项目集规范族的构造及LR(0)分析表的构造

    求出文法的所有项目,按一定规则构造识别活前缀的NFA, 再确定化为DFA确定化的工作量较大,而且容易出错,实际应用中并不使用,这里介绍的目的仅仅是为了便于理解.具体见识别活前缀的有限自动机构建方法_用 ...

  6. 编译原理LR(0)项目集规范族的构造详解

    学编译原理的时候,感觉什么LL(1).LR(0).SLR(1).LALR(1)思想满天飞. 而且做题的时候,一不留意,一道题就写了三页纸了. 就拿今天这个玩意儿来讲,我真的是考试前花了最多的时间,搞懂 ...

  7. LR(0)项目集规范族和分析表的构造

    1. LR分析 LR分析是干什么用的?简单来说就是你在编程时编译器用来判断你输入的符号串是否合法以及时哪一种类型.官方的说法时LR分析是一种能根据当前分析栈中的符号串和向右顺序查看输入串的k个符号就能 ...

  8. 编译原理LR(0)项目集规范族的构造和分析的构造

    学编译原理的时候,感觉什么LL(1).LR(0).SLR(1).LALR(1)思想满天飞. 而且做题的时候,一不留意,一道题就写了三页纸了. 就拿今天这个玩意儿来讲,我真的是考试前花了最多的时间,搞懂 ...

  9. C++实现LR(1)分析表的构造

    构造LR(1)分析表的算法参考了龙书本科教学版: 龙书给的例子:(1)S′→S(2)S→CC(3)C→cC∣d\begin{aligned} &(1) S' \rightarrow S \\ ...

  10. 基于大数据的软件项目知识图谱构造及问答方法

    摘要:随着软件规模的不断扩大.软件演化周期的不断延长,构建软件项目知识图谱对软件维护.软件开发的意义越来越重大.如何基于软件项目开发过程中产生的源代码.邮件列表.缺陷报告等多源异构大数据,快速构建语义 ...

最新文章

  1. 银行计算机设备管理 总结,【2017年银行自助设备中心年终总结】_银行自助设备工作总结...
  2. Ant Design Pro 开发上手
  3. 智能指针:-和*运算符重载 + 模板技术 实现智能指针(C++)
  4. linux apache 多域名配置,apache-2.4.12基于域名访问的多虚拟主机配置
  5. fastJson工具类
  6. C/C++[codeup 1929,]日期处理
  7. 每日一句 i'm by disposition one of life's neutrals,a human Switzerland
  8. McAfee杀毒软件中的提权漏洞
  9. 创建了对嵌入的互操作程序集间接引用,无法嵌入互操作类型
  10. sox处理mp3_ffmpeg sox 音频转换 MP3 转 wav
  11. redhat linux 系统修复,简述rhel7系统修复
  12. 每日一坑:加载DLL失败:找不到指定模块
  13. NLTK异常问题 [nltk_data] Error loading reuters: <urlopen error [Errno 11004] [nltk_data] getaddrinfo
  14. python换发型_初学Python的一些细节
  15. 随心所欲b超工作站图像处理_正版B超随心所欲超声工作站vista版最新版模拟数字影像软件win7...
  16. 计算机硬件是怎么影响性能的,哪些硬件影响电脑的性能
  17. 基于人脸识别的课堂签到管理系统【学习三】
  18. 云平台 物联网 概念 数据挖掘技术
  19. 元分析 | 大脑同伦共激活的性别差异
  20. Redis底层 知识(校招、社招必看)

热门文章

  1. SharePoint Online 自定义Modern UI表单
  2. 00048_this关键字
  3. 利用cloudera manager搭建Hadoop集群
  4. ThinkPHP空操作及命名空间
  5. 03-树2. List Leaves (25) 二叉树的层序遍历
  6. C++构造函数异常(二)
  7. Windows线程生灭 (二)
  8. Activity的启动模式standard,singleTop,singleTask,singleInstance(转)
  9. 修复VS2010 Beat2的Application cannot start”问题
  10. 如何在Spring MVC工程中进行单元测试