s->ab|bc
a->ε|b
b->ε|ad
c->ad|b
d->as|c
首先建立乙個以文法的非終結符為上界的一維陣列,其陣列元素為非終結符,對應每一非終結符有乙個標誌位,用以記錄能否推出ε。如下表
非終結符sa
bcd初值
未定未定
未定未定
未定第1次掃瞄是是
否第2次掃瞄是否
能否推出ε步驟如下:
first集求法(三種情況)
若x->a,x->b,x->c,則將終結符a加入first(x)中,即first(x)=
若x->ε ,則將終結符ε加入first(x)中
若x->bcd,先檢測到b,則先將first(b)中所有元素(除了空集)加入first(x),若first(b)中不存在空集, 即停止檢測,若存在則向b的後面檢視,將first(c)中所有元素(除了空集)加入first(x),再判斷first(c)中是否有ε…直到最後,若d之前的所有非終結符的first集中都含有ε,就檢測到d時,將first(d)也加入first(x),若first(d)中含有ε,則將 ε加入first(x)
按照上面求法得到:
first(s)=(first(a)-)∪(first(b)-ε)∪∪=
first(a)=∪=
first(b)=∪=
first(c)=(first(a)-) ∪ first(d) ∪ first(b)=
first(d)=∪=
求得例子的first集:
first(s)=
first(a)=
first(b)=
first(c)=
first(d)=
右部的開始符號集:
first(ab)=
first(bc)=
first(ε)=
first(b)=
first(ad)=
first(ad)=
first(b)=
first(as)=
first(c)=
follow集的求法(四種情況)
如s->(l) | al | lc
如果l的右邊是終結符, 那麼這個終結符加入l的follow
如果l的右邊是非終結符, 那麼把這個非終結符的first除去空加到l的follow中
如果l處在末尾,那麼,』->』左邊符號的follow成為l的follow
開始符號的follow中要加上『#』
按照上面求法得到:
follow(s)= ∪ follow(d)
follow(a)=(first(b)-) ∪ follow(s) ∪ first(d)
follow(b)=follow(s)
follow(c)=follow(s)
follow(d)=follow(b) ∪ follow(c)
最終結果
follow(s)=
follow(a)=
follow(b)=
follow(c)=
follow(d)=
select集求法
產生式a->a時,
若a不可以推導出ε,則select(a->a)=frist(a)。
若a可以推導出ε,則select(a->a)=(first(a)-ε) ∪ follow(a)
按照上面求法和之前的求得的集合得到下表:
非終結符
是否推出ε
first集
follow集s是
a是b是
c否d否
根據此表計算select集合如下:
select(s->ab)=(first(ab)- ∪ follow(s)=
select(s->bc)=first(bc)=
select(a->ε) =(first(ε)-) ∪ follow(a)=
select(a->b) =first(b)=
select(b->ε) =(first(ε)-) ∪ follow(b)=
select(b->ad)=first(ad)=
select(c->ad)=first(ad)=
select(c->b) =first(b)=
select(d->as)=fist(as)=
select(d->c) =first(c)=
相同左部的產生式的select交集為
select(s->ab) ∩ select(s->bc)≠∅
select(a->ε) ∩ select(a->b)=∅
select(b->ε) ∩ select(b->ad)=∅
select(c->ad) ∩ select(c->b)≠∅
select(d->as) ∩ select(d->c)=∅
最後根據select交集知道該例子不是ll(1)文法,因為s和c的相同左部,其產生式的select集的交集不為∅ LL(1)語法分析
ll 1 分析法的功能是利用ll 1 控制程式根據顯示棧棧頂內容 向前看符號以及ll 1 分析表,對輸入符號串自上而下的分析過程。可通過消除左遞迴 提取左因子把非ll 1 文法改造成ll 1 文法。在 ll 1 分析程式設計過程中,最重要的兩個問題是 分析表的構造和相關資料結構的設計。而 分析表的構...
LL 1 語法分析
ll 1 文法分析是自頂向下的分析方法,也可以被看作是輸入串的最左推導過程,ll 1 中1的意思就是可以根據可以根據當前輸入串中的乙個字元來判斷是由哪乙個產生式產生。下面給出文法 e te e ate 代表空集 t ft t mft f i e i 0 1 2 9 a m 首先要構造first集合與...
語法分析 自頂向下分析方法
前陣子弄完詞法分析後,這一周開始語法分析的課程。語法分析 在電腦科學和語言學中,語法分析 英語 syntactic analysis,也叫 parsing 是根據某種給定的形式文法對由單詞序列 如英語單詞序列 構成的輸入文字進行分析並確定其語法結構的一種過程。摘自維基百科 其實學習語法分析,並不是一...