1. 文法 g(s):
(1)s -> ab
(2)a ->da|ε
(3)b -> cc
(4)c -> aadc |ε
(5)d -> b|ε
驗證文法 g(s)是不是 ll(1)文法?
答:證明:first(da) =
first(ε) =
first(aadc) =
first(b) =
follow(a) =
follow(c) =
follow(d) =
select(a -> da) = first(da) =
select(a -> ε) = first(ε) - ufollow(a) = follow(a) =
因為select(a -> da) ∩ select(a -> ε) ≠ ø
所以g(s)不是 ll(1)文法。
2.法消除左遞迴之後的表示式文法是否是ll(1)文法?
答:文法為:(1)e -> te'
(2)e' -> +te' | ε
(3)t -> ft'
(4)t' -> *ft' | ε
(5)f -> (e) | i
first(+te') =
first(ε) =
first(*ft') =
first((e)) =
first(i) =
follow(e') =
follow(t') =
follow(f) =
select(e' -> +te') = first(+te') =
select(e' -> ε) = first(ε) - ufollow(e') = follow(e') =
select(t' -> *ft') = first(*ft') =
select(t' -> ε) = first(ε) - ufollow(t') = follow(t') =
select(f -> (e)) = first((e)) =
select(f->i)=first(i)=
因為select(e' -> +te') ∩ select(e' -> ε) = ø
select(t' -> *ft') ∩ select(t' -> ε) = ø
select(f -> (e)) ∩ select(f -> i) = ø
所以此表示式文法是ll(1)文法。
3.接2,如果是ll(1)文法,寫出它的遞迴下降語法分析程式**。
e(){t();
e'();
e'()
t()t'()
f()答:select集:
select(e->te')=first(te')=
select(e'->+te')=first(+te')=
select(e'->ε)=first(ε)-ufollow(e')=follow(e')=
select(t->ft')=first(ft')=
select(t'->*ft')=first(*ft')=
select(t'->ε)=first(ε)-ufollow(t')=follow(t')=
select(f->(e))=first((e))=
select(f->i)=first(i)=
遞迴下降語法分析程式:
void parsee(){
switch(lookahead){
case '(','i':
parset();
parsee'();
break;
default:
print("syntax error \n");
exit(0);
void parsee'(){
switch(lookahead){
case '+':
matchtoken('+');
parset();
parsee'();
break;
case ')','#':
break;
default:
print("syntax error \n");
exit(0);
void parset(){
switch(lookahead){
case '(','i':
parsef();
parset'();
break;
default:
print("syntax error \n");
exit(0);
void parset'(){
switch(lookahead){
case '*':
matchtoken('*');
parsef();
parset'();
break;
case '+',')','#':
break;
default:
print("syntax error \n");
exit(0);
void parsef(){
switch(lookahead){
case '(':
matchtoken('(');
parsee();
matchtoken(')');
break;
case 'i':
matchtoken('i');
break;
default:
print("syntax error \n");
exit(0);
4.加上實驗一的詞法分析程式,形成可執行的語法分析程式,分析任意輸入的符號串是不是合法的表示式。
LL 1 文法判斷
ll 1 文法判斷 題型 1.判斷該文法是否是ll 1 文法?2.若是,給出它的ll 1 分析表,否則說明理由。概念 對於產生式 a 1.如果 均不能推導出 空語句 則 first first 2.和 至多有乙個能推導出 3.如果 經過0步或多步可以推導出 則 first follow a 關鍵 求...
LL(1)文法解析
一 問題描述 給定上下文無關文法,對其進行解析,得出first集和follow集。在有能力的情況下,可以求出ll 1 分析表。二 演算法設計 本程式主要分成三塊內容,第一是文法的讀入解析,第二是first集的求解,第三為follow集的求解。文法的解析需要根據整行讀入的文法,生成rulelist 表...
如何判斷文法是否是LL 1 文法
判斷該文法是不是ll 1 文法,說明理由 s abc a a b b first集合求法就是 能由非終結符號推出的所有的開頭符號或可能的 但要求這個開頭符號是終結符號。如此題a可以推導出a和 所以first a a,同理first b s可以推導出abc,還可以推導出bc,還可以推導出c,所以fir...