編譯原理之LL 1 文法的判斷,遞迴下降分析程式

2022-07-04 10:24:08 字數 2050 閱讀 3364

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 中某個終結符號開頭的串。類似的,如果 那麼 不能推導...