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

原创 2014年02月26日 18:23:03

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

    课本上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
那么:
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}
为了普遍性,我把β搞的复杂了点,多看几遍,你就会了。如果不会,在下面留言。我可是看了两天才看懂的。大哭


如何判断文法是LL(1)SLR(1)LR(1)LALR(1)的?

1.首先LL(1)分析法是自上而下的分析法。LR(0),LR(1),SLR(1),LALR(1)是自下而上的分析法。    2.自上而下?从开始符号出发,根据产生式规则推导给定的句子。    3....
  • carino_ly
  • carino_ly
  • 2014-04-19 11:10:59
  • 2936

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

按照这个标题搜进来的各位是不是以为这也是和课本一样的内容呢,其实这是我看了两天课本才理解出来的内容啊,绝对和课本不一样。     课本上LR(1)项目集族的构造内容如下:     以S′→·S,#...
  • hhhhhhhhhhkkkkkkkkkk
  • hhhhhhhhhhkkkkkkkkkk
  • 2014-02-26 18:23:03
  • 4598

编译原理 <em>LR(</em>0<em>)项目集</em>规范<em>族的构造</em> <em>LR(</em>0)分析表+分析串的...

构造<em>LR(1)项目集</em>,生成LR(1)分析表、进行相应的语法分析 编译原理中LR(0)项目集规范<em>族的构造</em> LR(0)项目集规范<em>族构造</em> 立即下载 上传者: wc_3344 时间: ...
  • 2018年04月16日 00:00

构造LR(1)项目集,生成LR(1)分析表、进行相应的语法分析

 目        录   引言.............................................................  2第一章    概述..............
  • freeagle5
  • freeagle5
  • 2007-07-02 20:40:00
  • 15495

构建LALR(1)项目集族

构建LALR(1)项目集族     构造LALR(1)项目有两种思路。一种是:先构造LR(1)项目,再合并同心项目;另一种是:先构造LR(0)项目,再为为其配上搜索符。本文介绍第二种方法。   ...
  • tms_li
  • tms_li
  • 2011-03-01 11:06:00
  • 4663

<em>LR(</em>0)分析表<em>的构造</em>

<em>构造</em>识别文法活前缀DFA有3种方法:<em>(1)</em>根据形式定义求出活前缀的正则表达式,然后由此正则表达式<em>构造</em>NFA再确定为DFA;(2)求出文法的所有<em>项目</em>,按一定规则<em>构造</em>识别活前缀...
  • 2018年04月18日 00:00

<em>LR(</em>0<em>)项目集</em>规范<em>族构造</em>

LR(0)项目集规范<em>族的构造</em>,按照编译原理相应的算法... 构造<em>LR(1)项目集</em>,生成LR(1)分析表、进行相应的语法分析 编译原理中LR(0)项目集规范<em>族的构造</em> 编译原理 ...
  • 2018年04月17日 00:00

编译原理 LR(0)项目集规范族的构造 LR(0)分析表+分析语句 详解分析+代码

详细代码下载地址:http://download.csdn.net/detail/qdbszsj/9331155 编译原理  LR(0)项目集规范族的构造 http://blog.csdn.n...
  • qdbszsj
  • qdbszsj
  • 2015-12-06 17:30:28
  • 3493

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

编译原理中LR(0)项目集规范族的构造   此文略长。我也没想到这写起来这么多,但对构造过程绝对清楚,一步步慢慢看吧。      LR的第一个L和LL的第一个L含义相同,即从左到右扫描句子 ...
  • u011921487
  • u011921487
  • 2015-01-10 06:01:16
  • 1964

编译原理 LR(0)项目集规范族的构造 LR(0)分析表+分析串的代码实现

  • 2015年12月06日 17:22
  • 11KB
  • 下载
收藏助手
不良信息举报
您举报文章:LR(1)项目集族的构造:如何确定前向搜索符
举报原因:
原因补充:

(最多只允许输入30个字)