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)=
first(b)
first(d), first(c), follow(c)
follow(c)=
follow(d)=
所以
select(a->da)=select(a->ε)=
select(c->aadc)=
select(c->ε)=
select(d->b)=
select(d->ε)=
其中因為select(a->da)與select(a->ε)有交集所以該g(s)不是ll(1)文法。
2.判斷下列文法是否是ll(1)文法?
e -> te'e' -> +te' | ε
t -> ft'
t' -> *ft' | ε
f -> (e) | i
解:由題可得
select(e'->+te')=first(+te')=select(e'->ε)=follow(e')=follow(e)=
select(t'->*ft')=frist(*ft')=
select(t'->ε)=follow(t')=follow(t)=
select(f->(e))=frist((e)) =
select(f->i)=frist(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(e->te) =first(te')=firsi(t)-first(f)u=select(e'->+te')=first(+te')=
select(e'->ε)=follow(e')=follow(e)=
select(t -> ft')=frist(ft')=first(f)=
select(t'->*ft')=frist(*ft')=
select(t'->ε)=follow(t')=follow(t)=
select(f->(e))=frist((e)) =
select(f->i)=frist(i) =
偽**:
void parsee()}void parseep()
}void parset()
}void parsetp()
}void parsef()
}
4.加上詞法分析程式,形成可執行的語法分析程式,分析任意輸入的符號串是不是合法的表示式。
LL 1 文法判斷
ll 1 文法判斷 題型 1.判斷該文法是否是ll 1 文法?2.若是,給出它的ll 1 分析表,否則說明理由。概念 對於產生式 a 1.如果 均不能推導出 空語句 則 first first 2.和 至多有乙個能推導出 3.如果 經過0步或多步可以推導出 則 first follow a 關鍵 求...
編譯原理實驗 LL(1)文法
目標任務 實現 ll 1 分析中控制程式 表驅動程式 完成以下描述算術表示式的 ll 1 文法的 ll 1 分析程式。g e e te e ate t ft t mft f e i a m 說明 終結符號 i 為使用者定義的簡單變數,即識別符號的定義。compiler3.cpp 定義控制台應用程式的...
編譯原理之證明LL 1 文法
ll 1 文法的證明方法 乙個文法g是ll 1 的,當且僅當g的任意兩個不同的產生式a 滿足下面的條件 1.不存在終結符號a使得 和 都能夠推導出以a開頭的串。2.和 中最多只有乙個可以推導出空串。3.如果 那麼 不能推導出任何以follow a 中某個終結符號開頭的串。類似的,如果 那麼 不能推導...