前陣子弄完詞法分析後,這一周開始語法分析的課程。
語法分析:在電腦科學和語言學中,語法分析(英語:syntactic analysis,也叫 parsing)是根據某種給定的形式文法對由單詞序列(如英語單詞序列)構成的輸入文字進行分析並確定其語法結構的一種過程。
(摘自維基百科)
其實學習語法分析,並不是一上來就看其演算法應該怎麼做,而是需要一些概念進行鋪墊。
語法分析方式分為兩種,一種是自頂向下分析,一種是自底向上分析。這篇博文要講的是自頂向下分析。
概念1:推導方式
在推導過程中,有最左推導和最右推導。
最左推導:每次選擇最左非終結符進行替換。
最右推導:每次選擇最右非終結符進行替換。
而自頂向下選擇的是最左推導。
概念2:回溯
回溯現象:同乙個非終結符的多個候選式存在共同字首,將導致回溯現象。
比如:a —> abd | acd。那麼這個將會產生回溯,因為假如選了abd這個之後,程式發現不對,那麼就得重新回來,選擇acd這個,這樣子是不好的,效率很低。
既然這樣的話,如何消除回溯現象呢?
a —> abd | acd
還是以這個為例,我們可以改造成下面這個:
a —> ad
d —> bd | cd
也就是通過改寫產生式來推遲決定,等讀入了足夠多的輸入,獲得足夠資訊後再做出正確的決定。
概念3:ll(k)文法:
**分析:
**分析是遞迴下降分析技術的乙個特例,通過在輸入中向前看固定個數(通常為1)符號來選擇正確的產生式。
ll(k)文法:
可以對某些文法構造出向前看k個輸入符號的**分析。
文法轉換:
並不是所有的文法都適用於自頂向下的分析,我們有時候需要對文法進行改造,使之適合。
概念4:左遞迴
如果乙個文法中有乙個非終結符a使得對某個字串a存在乙個推導:a —> *aa,那麼這個文法就是左遞迴的。
如:
a —> aa
e —> e + t | e - t
左遞迴分為兩種:
直接左遞迴:
如:
a —> aa | b
e —> e + t | e - t
a和e都可以直接推出a和e。
那麼如何消除左遞迴呢?
如a —> aa | b
則其r = ba*。
令 a —> bc, c —> ac | e。(這裡e代表空字串)。
間接左遞迴:
如:
s —> aa | b
a —> ac | sd | e (這裡e代表空字串,下同)
上面那個可以推出:
s —> aa —> sda,即經過兩步及兩步以上推出了左遞迴。
那麼如何消除呢?
還是以上面為例:
將s的定義代入a的產生式得:
a —> ac | aad | bd | e
消除a的直接左遞迴:
a —> bd | c
c —> cc | adc | e
ll(1)文法:
在了解ll(1)文法之前,我們需要來了解一下以下幾個概念:
first(x)集:
可以從x推導出的所有串首終結符構成的集合,如果式空串e,也要加入。
如:a —> bd | c c —> cc | adc | e
那麼first(a) = 。
這個應該不是很難理解?那就過了。
follow(a)集:
可能在某個句型中緊跟在a後面的終結符a的集合。如果a是某個句型的最右符號,則將結束符「#"新增到follow(a)中。
如何求解:
①設s為文法中開始符號,把加入follow(s)中(這裡「#」 為句子括號)。
②若a→αbβ是乙個產生式,則把first(β)的非空元素加入follow(b)中。如果β能夠推導出ε則把follow(a)也加入follow(b)中。
③反覆使用②直到每個非終結符的follow集不再增大為止。
例子可以看一下這篇文章
select(a —> b):產生式的可選集
產生式 a —> b的可選集是指可以選用該產生式進行推導時對應的輸入符號的集合,記為select(a —> b)。
例如:select(a —> ab) = .
select(a —> e) = follow(a).
ll(1) 文法:
當同個非終結符推出的select集不相交時,則是ll(1)文法。
如select(a —> ab) = . select(a —> e) = follow(a).演示a和follow不相交的話,那麼a —> ab,a —> e構成的文法就是ll(1)文法。
ll(1) 文法分析方法:
遞迴的**分析法:
在遞迴下降分析中,編寫沒有給非終結符對應的過程時,根據**分析表進行產生式的選擇。
非遞迴的**分析法:
不需要為每乙個非終結符編寫遞迴下降過程,而是根據**分析表構造乙個自動機,也叫驅動的**分析。
一般寫語法分析器**就是依照上面其中一中方法來。
總結:上面講的其實是乙個大概,其中的細節並沒有深挖,推薦這個教程,老師講的很不錯。看了幾遍應該就可以了。
語法分析 自頂向下分析
確定的自頂向下分析方法,首先要解決從某文法的開始符號出發,對給定的輸入符號串如何根據當前的輸入符號 單詞符號 唯一地確定選用哪個產生式替換相應非終結符往下推導,或構造一棵相應的語法樹,若能夠推導出給定的輸入符號串,或能構造出語法樹其末端結點以從左向右的順序連線正好為給定的輸入符號串,則所給的輸入符號...
語法分析 自頂向下分析
確定的自頂向下分析方法,首先要解決從某文法的開始符號出發,對給定的輸入符號串如何根據當前的輸入符號 單詞符號 唯一地確定選用哪個產生式替換相應非終結符往下推導,或構造一棵相應的語法樹,若能夠推導出給定的輸入符號串,或能構造出語法樹其末端結點以從左向右的順序連線正好為給定的輸入符號串,則所給的輸入符號...
簡述自頂向下的語法分析
在我們得到了context free grammar 之後,下一步就要將它轉換成一棵語法分析樹了,語法分析樹使得我們的編譯器能夠識別輸入串是否符合我們的context free grammar 中文翻譯為上下文無關語言 有兩種方法能夠將context free grammar轉換為語法分析樹。今天我...