自頂向下的語法分析(修改)

2021-08-27 06:09:50 字數 3680 閱讀 5299

自頂向下語法分析可以被看作是為輸入串構造語法分析樹的問題,它從語法分析樹的根結點開始

,按照先序遍歷建立這棵語法分析樹的各個結點。自頂向下語法分析也可以被看作尋找輸入串的最左推導的過程。

遞迴下降的語法分析

乙個遞迴下降語法分析程式由一組過程組成,每個非終結符號有乙個對應的過程。程式的執行從開始符號對應的過程開始,如果這個過程的過程體掃瞄了整個輸入串,它就停止執行並宣布語法分析成功完成。

乙個左遞迴的文法會使它的遞迴下降語法分析器進入乙個無限迴圈。即使是帶回溯的語法分析器也是如此。也就說,當我們試圖展開乙個非終結符號a

的時候,我們可能會沒有讀入任何輸入符號就再次試圖展開a。

first和

follow

自頂向下和自底向上語法分析器的構造可以使用和文法g

相關的兩個函式

first

和follow

來實現。在自頂向下語法分析過程中,

first

和follow

使得我們可以根據下乙個輸入符號來選擇應用哪個產生式。在恐慌模式的錯誤恢復中,由

follow

產生的詞法單元集合可以作為同步詞法單元。

first(α

)被定義為可從α推導得到的串的首符號(終止符號)的集合,其中α是任意的文法符號串。

計算各個文法符號x

的first(x)

時,不斷應用下列規則,直到再沒有新的終結符號或ε可以被加到任何

first

集合中為止。 1)

如果x是乙個終結符號,那麼

first(x)=x。

2)如果x

是乙個非終結符號,且

x--->y1y2...yk

是乙個產生式,其中

k>=1,

那麼如果對於某個i,

a在first(yi)

中且ε在所有的

first(y1)

、first(y2)

、...

、first(yi-1)

中,就把a加到

first(x)

中。也就是說,

y1...yi-1==>*

ε。如果對於所有的

j=1,2,

...,

k,ε在

first(yj)

中,那麼將ε加到

first(x)

中。比如,

first(y1)

中的所有符號一定在

first(x)

中。如果

y1不能推導出ε,那麼我們就不會再向

first(x)

中加入任何符號,但是如果

y1==>*

ε,那麼我們就加上

first(y2)

,依此類推。 3)

如果x--->

ε是乙個產生式,那麼將ε加入到

first(x)

中。

對於非終結符號a

,follow(a)

被定義為可能在某些句型中緊跟在

a右邊的終結符號的集合。也就是說,如果存在形如

s--->αaa

β的推導,終結符號a就在

follow(a)

中,其中

α和β是文法符號串。注意,在這個推導的某個階段,a和a

之間可能存在一些文法符號。但如果是這樣,這些符號會推導得到ε並消失。另外,如果

a是某些句型的最右符號,那麼$也在

follow(a)

中。($

是乙個特殊的「結束標記」符號,我們假設它不是任何文法的符號)

計算所有非終結符號a

的follow(a)

集合時,不斷應用下面的規則,直到再沒有新的終結符號可以加到任意

follow

集合中為止。 1)

將$放到

follow(s)

中,其中

s是開始符號,而

$是輸入右端的結束標記。 2)

如果存在乙個產生式a--->αb

β,那麼

first(β)

中除ε之外的所有符號都在

follow(b)中。

3)如果存在乙個產生式a--->αb

,或存在產生式

a--->αb

β且first(β)

包含ε,那麼

follow(a)

中的所有符號都在

follow(b)中。

上面的計算方法理解起來比較費勁,我們來看下面的比較容易理解的方法:

first集的定義

:

如果α是任意的文法符號串

,則我們定義

first(α)

是從α推導出的串的開始符號的終結符集合,即

first(α

)=。如果α

==>*

ε,則ε也屬於

first(α)

。 follow集的定義:設

a是乙個非終結符

,則定義

follow(a)

是包含所有在句型中緊跟在

a後面的終結符

a的集合,即

follow(a)=

。注意,在推導的某一時刻,在a和

a之間可能有符號,但如果是這樣,它們將推導出ε並消失。如果

a是某個句型的最右符號或開始符號,那麼$屬於

follow(a)。(

注:$是輸入串的結束符)

例:求下列文法各個非終結符號的first

和follow

集合。

解答:(

注意==>*

表示經過多次推導)

由於 e==>*(e)t'e'

e==>*

idt'e'

故first(e)= 同理

first(t)=first(f)=

first(e')=

first(t')=

由於 e==>*(e)且

e是開始符號

故follow(e)=

由於 e==>te',即

e'是該

句型的最右符號

e==>*+(e)

故follow(e')=

由於 e==>*t,即t是該

句型的最右符號

e==>*t+t

e==>*(t)

故follow(t)= 同理

follow(t')=

follow(e')=

follow(f)=

語法分析 自頂向下分析

確定的自頂向下分析方法,首先要解決從某文法的開始符號出發,對給定的輸入符號串如何根據當前的輸入符號 單詞符號 唯一地確定選用哪個產生式替換相應非終結符往下推導,或構造一棵相應的語法樹,若能夠推導出給定的輸入符號串,或能構造出語法樹其末端結點以從左向右的順序連線正好為給定的輸入符號串,則所給的輸入符號...

語法分析 自頂向下分析

確定的自頂向下分析方法,首先要解決從某文法的開始符號出發,對給定的輸入符號串如何根據當前的輸入符號 單詞符號 唯一地確定選用哪個產生式替換相應非終結符往下推導,或構造一棵相應的語法樹,若能夠推導出給定的輸入符號串,或能構造出語法樹其末端結點以從左向右的順序連線正好為給定的輸入符號串,則所給的輸入符號...

語法分析 自頂向下分析方法

前陣子弄完詞法分析後,這一周開始語法分析的課程。語法分析 在電腦科學和語言學中,語法分析 英語 syntactic analysis,也叫 parsing 是根據某種給定的形式文法對由單詞序列 如英語單詞序列 構成的輸入文字進行分析並確定其語法結構的一種過程。摘自維基百科 其實學習語法分析,並不是一...