這段時間學習了編譯原理的兩種語法分析,想要記錄下來,方便考前自己複習。
1.分析過程是帶**的
2.分析過程是一種試探過程(所以需要進行回溯)
3.效率低
對任何輸入串,試圖用一切可能的辦法,從文法的開始符號出發,自頂向下的為輸入串建立一棵語法樹。
一般方法是帶「回溯「的。
不能處理具有左遞迴的文法,也就是說,要使用自頂向下分析方法,就必須消除文法的左遞迴。
左遞迴的消除
直接消除左遞迴:
假設p關於的全部產生式是
p->pα1 | pα2|···|pαn
消除p的直接左遞迴性就是:
p->β1 p' | β2 p' |···| βn p'
p』->α1p'| α2p'|···|αnp'
消除左遞迴的演算法
(1)把文法g的所有非終結符按人一順序排列成p1,p2···pn;按此順序執行
(2)
for i:
=1 to n do
begin
for j:
=1 to i-1do
把每個形如ai::
=aj r的規則替換成
ai::
=δ1γ|δ2γ|···|δkγ
其中aj::
=δ1|δ2
|···|δk是當前aj的全部規則
消除ai過程中的直接左遞迴
end
first集合的構造方法first(α)=
即為非終結符α的首符集為所有可能推到的開頭終結符或者空字
若a->b | ····則 first(a)包含first(b)
如果要避免回溯就需要
first(αi) ∩ first(αj) = 空集
要做到文法的任何非終結符的所有候選首符集兩兩不相交,就需要提取公共左因子
follow集合的求法follow(a)=
即follow集合為在文法中所有在a後面的非終結符的集合
另外,若s->a|··· 則規定 #∈follow(a)
若有a->αbβ|··· 如果β為空時,則follow(b)包含 follow(a)
如果β不為空時,則follow(b)包含 first(β)-空集
ll(1)的分析條件(1)不含左遞迴
(2)對於文法中 a->α1 | α2 |···
first(αi) ∩ first(αj) = 空集
(3)對於每個非終結符a,如果它存在某個first集合包含空字,則
first(a) ∩ follow(a)=空集
**分析表的構造(1)對文法g的每個產生是a->α執行(2)和(3)
(2)對每個a∈first(α),把a->α加入m[a,a]中
(3)若first(α)含有空字,則把任何b∈follow(a)把a->α加入m[a,b]
(4)把所有無定義的m[a,a]標上「出錯標誌」
語法分析 自頂向下分析
確定的自頂向下分析方法,首先要解決從某文法的開始符號出發,對給定的輸入符號串如何根據當前的輸入符號 單詞符號 唯一地確定選用哪個產生式替換相應非終結符往下推導,或構造一棵相應的語法樹,若能夠推導出給定的輸入符號串,或能構造出語法樹其末端結點以從左向右的順序連線正好為給定的輸入符號串,則所給的輸入符號...
語法分析 自頂向下分析
確定的自頂向下分析方法,首先要解決從某文法的開始符號出發,對給定的輸入符號串如何根據當前的輸入符號 單詞符號 唯一地確定選用哪個產生式替換相應非終結符往下推導,或構造一棵相應的語法樹,若能夠推導出給定的輸入符號串,或能構造出語法樹其末端結點以從左向右的順序連線正好為給定的輸入符號串,則所給的輸入符號...
語法分析 自頂向下分析方法
前陣子弄完詞法分析後,這一周開始語法分析的課程。語法分析 在電腦科學和語言學中,語法分析 英語 syntactic analysis,也叫 parsing 是根據某種給定的形式文法對由單詞序列 如英語單詞序列 構成的輸入文字進行分析並確定其語法結構的一種過程。摘自維基百科 其實學習語法分析,並不是一...