编译原理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‘)={ *,ε}

FIRST((E))={ (}

FIRST(i)={ i }

FOLLOW集:

FOLLOW(E)={ ),# }

FOLLOW(E‘)={ ),# }

FOLLOW(T)={+,),#}

FOLLOW(T‘)={+,),#}

FOLLOW(F)={*,+,),#}

SELECT集:

SELECT (E -> TE’) = FIRST(TE’) = { ( , i }

SELECT(E’ -> +TE’) = FIRST(+TE’) = { + }

SELECT(E’ -> ε) = FIRST(ε) - {ε} U FOLLOW(E’) = FOLLOW(E’) = { ) , # }

SELECT(T -> FT’) = FIRST(FT’) = { ( , i }

SELECT(T’ -> *FT’) = FIRST(*FT’) = { * }

SELECT(T’ -> ε) = FIRST(ε) - {ε} U FOLLOW(T’) = FOLLOW(T’) = { + , ) ,# }

SELECT(F -> (E)) = FIRST((E)) = { ( }

SELECT(F -> i) = FIRST(i) = { i }

2.P101练习7(2)(3)文法改写,并分别求FIRST集、FOLLOW集,和SELECT集

原题:

(1)A->aABe|a

B->Bb|d

消除左递归得:

A -> aA’

A’ -> ABe | ε

B -> dB’

B’ -> bB’ | ε

FIRST集:

FIRST(aA‘)={a}

FIRST(ABe)= FIRST(aA’Be)={a}

FIRST(ε)={ε}

FIRST(dB‘)={d}

FIRST(bB‘)={b}

FOLLOW集:

FOLLOW(A)={d,#}

FOLLOW(A‘)={d,#}

FOLLOW(B)={e,#}

FOLLOW(B‘)={e,#}

SELECT集:

SELECT(A->aA‘)=FIRST(aA‘)={a}

SELECT(A‘->ABe)=FIRST(ABe)={a}

SELECT(A‘->ε) =FOLLOW(A‘)={d,#}

SELECT(B->dB‘)=FIRST(dB‘)={d}

SELECT(B‘->bB‘)=FIRST(bB‘)={b}

SELECT(B‘->ε) =FOLLOW(B‘)={e}

(3)S->Aa|b

A->SB

B->ab

S -> SBa | b

B -> ab

文法改写:

S -> bS’

S’ -> BaS’ | ε

B -> ab

FIRST集:

FIRST(bS’) = { b }

FIRST(BaS’) = { a , ε }

FIRST(ab) = { a }

FOLLOW集:

FOLLOW(S) = {#}

FOLLOW(S’) = {#}

FOLLOW(B) = {a}

SELECT集:

SELECT (S -> bS’) = FIRST(bS’) = { b }

SELECT(S’ -> BaS’) = FIRST(BaS’) = { a }

SELECT(S’ -> ε) = FIRST(ε) - {ε} U FOLLOW(S’) = FOLLOW(S’) = { # }

SELECT(B -> ab) = FIRST(ab) = { a }

课堂练习:

求以下文法的FIRST集、FOLLOW集和SELECT集。

S->Ap
A->a |ε  # 有ε空 可跳P
A->cA

A->aA

FIRST集:

FIRST(AP) = { a , c , p }

FIRST(A) = { a , c , ε }

FOLLOW集:

FOLLOW(S) = { # }

FOLLOW(A) = { p }

SELECT集:

SELECT(S -> Ap) = FIRST(Ap) = { a , c , p }

SELECT(A -> a ) = FIRST(a) = { a }

SELECT(A -> ?) = FIRST(ε) - {ε} U FOLLOW(A) = FOLLOW(A) = { p }

SELECT(A -> cA) = FIRST(cA) = { c }

SELECT(A -> aA) = FIRST(aA) = { a }

S->Ap
S->Bq
A->a   #A无 ε不可跳P
A->cA
B->b
B->dB

FIRST集:

FIRST(S1) = FIRST(Ap) = { a , c }

FIRST(S2) = FIRST(Bq) = { b , d }

FIRST(A) = { a , c}

FIRST(B) = { b ,d }

FOLLOW集:

FOLLOW(S) = { # }

FOLLOW(A) = { p }

FOLLOW(B) = { q }

SELECT集:

SELECT(S -> Ap) = FIRST(Ap) = { a , c }

SELECT(S -> Bq ) = FIRST(Bq) = { b , d }

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/longlog/p/11864854.html

时间: 2024-10-11 21:54:58

编译原理10 消除左递归的相关文章

编译原理:消除左递归

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

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

如何消除左递归

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

【转】消除左递归

转自: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

第十次——消除左递归

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))

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

消除左递归

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