【编译原理】第四章 习题
目录
LL(1)文法的条件(是否是LL(1)文法)
左递归的消除
间接左递归的消除
消除文法中全部左递归的算法
FIRST集
FOLLOW集
习题123
LL(1)文法的条件(是否是LL(1)文法)
左递归的消除
间接左递归的消除
消除文法中全部左递归的算法
前提:该文法不含回路。
FIRST集
FOLLOW集
习题123
考虑下面文法G1:
S→a|∧|(T)
T→T,S|S
(1)消除G1的左递归。然后,对每个非终结符,写出不带回溯的递归子程序
(2)经改写或的文法是否是LL(1)的?给出它的预测分析表
对下面的文法G:
E→TE’
E’→+ Elε
T→FT’
T’→Tlε
F→PF’
F’→*F’lε
P→(E)|a|b|^
(1)计算这个文法的每个非终结符的FIRST和 FOLIOW。
(2证明这个文法是LL(1)的。
(3)构造它的预测分析表。
下面文法中,哪些是LL(1)的,说明理由。
(1)
S->Abc
A->a|ε
B→b|ε
(2)
S->Ab
A→a|B|ε
B->b|ε
(3)
S→ABBA
A->a|ε
B->b|ε
(4)
S->aSe|B
B→bBe|C
C->cCe|d
3)对i+i*i进行预测分析的过程表
步骤 | 分析栈 | 余留输入串 | 所用产生式 |
1 | #E | i+i*i# | E->TE' |
2 | #E'T | i+i*i# | T->FT' |
3 | #E'T'F | i+i*i# | F->i |
4 | #E'T'i | i+i*i# | |
5 | #E'T' | +i*i# | T'-> |
6 | #E' | +i*i# | E'->ATE' |
7 | #E'TA | +i*i# | A->+ |
8 | #E'T+ | +i*i# | |
9 | #E'T | i*i# | T->FT' |
10 | #E'T'F | i*i# | F->i |
11 | #E'T'i | i*i# | |
12 | #E'T' | *i# | T'->MFT' |
13 | #E'T'FM | *i# | M->* |
14 | #E'T'F* | *i# | |
15 | #E'T'F | i# | F->i |
16 | #E'T'i | i# | |
17 | #E'T' | # | T'-> |
18 | #E' | # | E'-> |
19 | # | # | 分析成功 |
消除G2的左递归,判断改造后文法是否是LL(1)文法。
文法G2:
S→a|∧|(T)
T→T,S|S
消除G2的左递归
S→a|∧|(T)
T->ST'
T'->,ST'|ε
是LL(1)文法不含左递归
非终结符的各个产生式首符集不相交
First(S)={a,∧,(}
Filrst(T)={a,∧,(}
Filrst(T')={,,ε}
T'首符集存在ε
Filrst(T')={,,ε}
Follow(T')={)}
First(T')∩Follow(T')=∅
G[E]:
E→TE’
E’→+TE’|ε
T→FT’
T’→*FT’|ε
F→(E)|i
First(E’T’)=
{+,*,ε}
FIRST(E)={(,i}
FIRST(T)={(,i}
FIRST(F)={(,i}
FIRST(E')={+,ε}
FIRST(T')={*,ε}
Follow(E)={#,)}
Follow(T)={#,)}
Follow(F)={+,#,)}
Follow(E')={+,#,)}
Follow(T')={*,+,#,)}
消除下列文法G[S]的左递归,获得与其等价的、无左递归的文法G’[S]。
G[S]:S→Qc︱c
Q→Rb︱b
R→Sa︱a
S->Qc|c
Q->Rb|b
R->(bca|ca|a)R'
R'->bcaR'|ε
设文法G]S]: S→^ | a | (T)
T→T,S | S
G’[S]: S→^ | a | (T)
T→ST’ | S
T’→,ST’ |ε
FIRST(S)={a, ^, (}, FOLLOW(S)={#, ,, )}
FIRST(T)={a, ^, (} ,FOLLOW(T)={)}
FIRST(T’)={,, ε} ,FOLLOW(F)={)}
a ^ ( ) , # S S->a S->^ S->(T) T T->ST' T->ST' T->ST' T' T'-> T'->ST'
已知文法G[S]:S→a | ^ | (T)
T→T,S | S
S=(T)=>(T,S)=>(S,S)=>(a,S)=>(a,(T))=>(a,(T,S))=>(a,(S,S))=>(a,(a,S))=>(a,(a,a))
短语:((T,S),a) (T,S),a (T,S) T,S a
直接短语:T,S a
设文法G[S]:
S→(T) | a
T→T+S | S
(1)计算FIRST 和FOLLOW;
(2)构造优先关系表。
FIRST(S)={a, ( }
FIRST(T)={+, a, (}
FOLLOW(S)={a, ) }
FOLLOW(T)={+, a, )}
a + ( ) # a .> .> .> + <. .> <. .> ( <. <. <. =. ) .> .> .> # <. <. =.
已知文法G[S]:
E→E+T | T
T→T*F| F
F→(E)| i
(1) 给出句型 (i+i)*i+i的最左推导及画出语法树;
(2) 给出句型 (E+T)*i+F 的短语,素短语和最左素短语。
E=>E+T=>T+T=>T*F+T=>F*F+T=>(E)*F+T=>(E+T)*F+T=>(T+T)*F+T
=>(F+T)*F+T=>(i+T)*F+T=>(i+F)*F+T=>(i+i)*F+T
=>(i+i)*i+T=>(i+i)*i+F=>(i+i)*i+i
短语: i, F, E+T, (E+T), (E+T)*i, (E+T)*i+F
素短语: i, E+T
最左素短语: E+T