第十次——消除左递归

1.将以下文法消除左递归,求FIRST集、FOLLOW集,SELECT集,并分析符号串 i*i+i  

     E -> E+T | T

     T -> T*F | F

     F -> (E) | i

 消除左递归:

  E→TE‘

  E‘→+TE‘|ε

  T→FT‘

  T‘→*FT‘|ε

  F→(E)|i

 FIRST集:

  FIRST(TE‘)={T}

  FIRST(+TE‘)={+}

  FIRST(ε)={ε}

  FIRST(FT‘)={F}

  FIRST(*FT‘)={*}

  FIRST((E))={(}

  FIRST(i)={i}

 FOLLOW集:

  FOLLOW(E)={)}

  FOLLOW(E‘)={#}

  FOLLOW(T)={E‘}

  FOLLOW(T‘)={#}

  FOLLOW(F)={#}

 SELECT集:

  SELECT(E→TE‘)=FIRST(TE‘)={T}

  SELECT(E‘→+TE‘)=FIRST(+TE‘)={+}

  SELECT(E‘→ε)=(FIRST(ε)-{ε})∪FOLLOW(E‘)={)}

  SELECT(T→FT‘)=FIRST(FT‘)={F}

  SELECT(T‘→*FT‘)=FIRST(*FT‘)={*}

  SELECT(T‘→ε)=(FIRST(ε)-{ε})∪FOLLOW(T‘)={#}

  SELECT(F→(E))=FIRST((E))={(}

  SELECT(F→i)=FIRST(i)={i}

 分析符号串i*i+i:

2.P101练习7(2)(3)

 A → aABe|a

 B → Bb|d

 提取左公因子:

  A→aA‘

  A‘→ABe|ε

 消除左递归:

  B→dB‘

  B‘→bB‘|ε

 FIRST集:

  FIRST(aA‘)={a}

  FIRST(ABe)={A}

  FIRST(ε)={ε}

  FIRST(dB‘)={d}

  FIRST(bB‘)={b}

 FOLLOW集:

  FOLLOW(A)={Be}

  FOLLOW(A‘)={#}

  FOLLOW(B)={e}

  FOLLOW(B‘)={#}

 SELECT集:

  SELECT(A→aA‘)=FIRST(aA‘)={a}

  SELECT(A‘→ABe)=FIRST(ABe)={A}

  SELECT(A‘→ε)=(FIRST(ε)-{ε})∪FOLLOW(A‘)={#}

  SELECT(B→dB‘)=FIRST(dB‘)={d}

  SELECT(B‘→bB‘)=FIRST(bB‘)={b}

  SELECT(B‘→ε)=(FIRST(ε)-{ε})∪FOLLOW(B‘)={#}

 S → Aa|b

 A → SB

 B → ab

 代入:

  S→SBa|b

 消除左递归:

  S →bS‘

  S‘→BaS‘|ε

  B→ab

 FIRST集:

  FIRST(SBa)={S}

  FIRST(b)={b}

  FIRST(bS‘)={b}

  FIRST(BaS)={B}

  FIRST(ε)={ε}

  FIRST(ab)={ab}

 FOLLOW集:

  FOLLOW(S)={B}

  FOLLOW(S‘)={#}

  FOLLOW(B)={a}

 SELECT集:

  SELECT(S→SBa)=FIRST(SBa)={S}

  SELECT(S→b)=FIRST(b)={b}

  SELECT(S→bS‘)=FIRST(bS‘)={b}

  SELECT(S‘→BaS‘)=FIRST(BaS‘)={B}

  SELECT(S‘→ε)=(FIRST(ε)-{ε})∪FOLLOW(S‘)={#}

  SELECT(B→ab)=FIRST(ab)={a}

 求以下文法的FIRST集、FOLLOW集

 S -> Ap

 A -> a |ε

 A -> cA

 A -> aA

  FIRST(a)={a}

  FIRST(ε)={ε}

  FIRST(cA)={c}

  FIRST(aA)={a}
  FIRST(Ap)={a,c,p}

  FOLLOW(S)={#}

  FOLLOW(A)= {p}

  SELECT(S→Ap)=FIEST(Ap)={A}

  SELECT(A→a)=FIRST(a)={a}

  SELECT(A→ε)=(FIRST(ε)-{ε})∪FOLLOW(A)={p}

  SELECT(A→cA)=FIRST(cA)={c}

  SELECT(A→aA)=FIRST(aA)={a}

   S -> Ap
   S -> Bq
   A -> a
   A -> cA
   B -> b
   B -> dB

  FIRST(a)={a}

  FIRST(cA)={c}

  FIRST(b)={b}

  FIRST(dB)={d}

  FIRST(Ap)={a,c}

  FIRST(Bq)={b,d}

  FOLLOW(S)={#}

  FOLLOW(A)={p}

  FOLLOW(B)={q}

  SELECT(S→Ap)=FIEST(Ap)={A}

  SELECT(S→Bq)=FIRST(a)={a}

  SELECT(A→a)=FIRST(a)={a}

  SELECT(A→cA)=FIRST(cA)={c}

  SELECT(B→b)=FIRST(b)={b}

  SELECT(B→dB)=FIRST(dB)={d}

原文地址:https://www.cnblogs.com/lxml/p/11839669.html

时间: 2024-10-12 22:58:20

第十次——消除左递归的相关文章

【转】消除左递归

转自:http://guanjy0129.blog.163.com/blog/static/111549445201061491810507/ 一个文法含有下列形式的产生式之一时: 1)A→Aβ,A∈VN,β∈V* 2)A→Bβ,B→Aα,A.B∈VN,α.β∈V* 则称该文法是左递归的. 然而,一个文法是左递归时,不能采取自顶向下分析法. 消除左递归方法有: a)把直接左递归改写为右递归: 设有文法产生式:A→Aβ|γ.其中β非空,γ不以A打头. 可写为:A→γA' A'→βA'|ε 一般情况

文法改进(消除左递归)

在上次的文法中有存在左递归的情况,将会影响以后的语法分析使用,所以需要消除左递归,以便于语法分析使用. <程序> → <外部声明> <程序>` <程序>`→<程序> | ε <外部声明> → <函数定义> | <定义> <函数定义> → <函数声明> <函数体> <函数声明> → <函数返回类型> <函数头> <函数返回类型>

二义性 消除左递归

书是龙书 编译器中常用的方法可以分为自顶向下和自底向上的.一个是从语法分析树的顶部开始向底部构造语法分析树,一个则是从叶子节点开始,逐渐向根结点构造,这两种分析方法中,语法分析器的输入总是照着从左向右. 二义性:如果一个文法可以为某个句子生成多棵语法分析树,那么他就是二义性的. 例如例子id + id * id 消除左递归 如果一个文法中有一个非终结符号A使得对某个串a 存在一个推导A=>Aa 那么这个文法就是左递归 消除办法: A-> Aa1| Aa2|......Aam|β1|β2|βn

如何消除左递归

首先,什么叫做左递归呢? 一个左递归的语法通常有这样的形式 :  A-> Aa .而自顶向下的语法分析是无法处理左递归语法的.为什么呢?无论是递归分析还是预测分析或者是LL文法分析,在碰到左递归这种语法时都会陷入死循环当中.如果我们用递归分析,那么在分析A这个非终结符号的时候就会调用functionA,functionA将A分解成A,a,然后在我们再次碰到A的时候又会调用functionA,这样便形成了无限递归.如果我们用非递归的LL文法分析,那么在我们将把A->Aa无限次地压入到栈中,即每次

10 消除左递归

1.将以下文法消除左递归,并分析符号串 i*i+i   (1)E -> E+T | T E -> TE' E' -> +TE'|ε (2)T -> T*F | F T -> FT' T' -> *F|ε (3)F -> (E) | i 2.P101练习7(2)(3)文法改写,并分别求FIRST集.FOLLOW集,和SELECT集 (2) A -> aABe|a B -> Bb|d First(A)={a,e} First(B)={b,d}  (3) S

编译原理:消除左递归

1.将以下文法消除左递归,分析符号串 i*i+i . 并分别求FIRST集.FOLLOW集,和SELECT集 E -> E+T | T T -> T*F | F F -> (E) | i 2.P101练习7(2)(3)文法改写,并分别求FIRST集.FOLLOW集,和SELECT集 课堂练习: 求以下文法的FIRST集.FOLLOW集和SELECT集. S->ApA->a |εA->cA A->aA S->ApS->BqA->aA->cAB

11.13消除左递归

1.将以下文法消除左递归,分析符号串 i*i+i . 并分别求FIRST集.FOLLOW集,和SELECT集 E -> E+T | T T -> T*F | F F -> (E) | i 答: 消除左递归: E -> TE’ E’ -> +TE’ | ε T -> FT’ T’ -> *FT’ | ε F -> (E) | i 分析符号串 i*i+i : FIRST集: FIRST(E) = { ( , i } FIRST(E’) = {+ , ε } FI

编译原理10 消除左递归

1.将以下文法消除左递归,分析符号串 i*i+i . 并分别求FIRST集.FOLLOW集,和SELECT集 E -> E+T | T T -> T*F | F F -> (E) | i 消除左递归得: E->TE’ E’->+TE’|ε T->FT’ T’->*FT’|ε F->(E)|i 分析字符串如下: FIRST集: FIRST(TE’)={ (, i } FIRST(+TE')={+,ε} FIRST(FT’)={(,i} FIRST(*FT')=

消除左递归

1.将以下文法消除左递归,分析符号串 i*i+i . 并分别求FIRST集.FOLLOW集,和SELECT集 E -> E+T | T T -> T*F | F F -> (E) | i 解: 消除左递归:         E  ->TE`         E` ->+TE`|ε         T  ->FT `         T `->*FT `|ε         F  ->i|(E) FIRST集: FIRST(TE`)={T} FIRST(+TE