確定的自頂向下分析方法,首先要解決從某文法的開始符號出發,對給定的輸入符號串如何根據當前的輸入符號(單詞符號)唯一地確定選用哪個產生式替換相應非終結符往下推導,或構造一棵相應的語法樹,若能夠推導出給定的輸入符號串,或能構造出語法樹其末端結點以從左向右的順序連線正好為給定的輸入符號串,則所給的輸入符號串為該文法的句子。
設g=(vt,vn,s,p)是上下文無關文法, 其中a a 是文法g的乙個產生式,編號為i,則可選集:
(1)select(i)=first(α),當α!=>* ε (a不能推導出空字元)
(2)select(i)= first(α)∪follow(a),當α=>* ε
(第乙個l從左向右掃瞄字串 第二個l生成最左推導)
設g=(vt,vn,s,p)是上下文無關文法,該文法g是ll(1)文法,當且僅當對於g的每乙個非終結符a的任何兩個不同產生式aα,aβ,在產生式中的編號分別為i和j,當且僅當下面的條件成立:select(i)∩select (j)= ø, 當α, β不能同時=>* ε,能夠實現確定的自頂向下語法分析。
1、計算first集
(1)若x∈vt,則first(x)=。(本身為終結符)
(2)若x∈vn,且有產生式x-> a…,則把a加入到first(x)中。(推出終結符)
(3)若x->ε也是一條產生式,則把ε也加到first(x)中。(推導出空串)
(4)若x->y…是乙個產生式且y∈vn,則把first(y)中的所有非ε元素都加到first(x)中;(推導出非終結符)
若x->y1y2…yk 是乙個產生式,y1,y2,…,y(i-1)都是非終結符,而且,對於任何j,1≤j ≤i-1,first(yj)都含有ε。
即y1..y(i-1) =>* ε,則把first(yj)中的所有非ε元素都加到first(x)中;
特別是,若所有的first(yj , j=1,2,…,k)均含有ε,則把ε加到frist(x)中。
如果開始符號能推導出ε,則還需要考慮follow集
2、計算follow集
(1)對於文法的開始符號s,置#於follow(s) 中;(開始符號)
(2)若a=>*αb β是乙個產生式,則把first(β)-加至follow(b)中;(字尾跟乙個不能推導出空字元,加first-)
(3)若a=>*αb是乙個產生式,或a=>*αbβ是乙個產生式而β=>* ε(即ε∈first(β)),則把follow(a)加至follow(b)中.
(字尾為空,或者字尾可以推導出空字元,加follow(a))
3、計算select集
根據可選集的定義,其中a α 是文法g的乙個產生式,編號為i,則可選集:
①select(i)=first(α),當α!=>* ε
②select(i)= first(α)∪follow(a),當α=>* ε
1、編寫文法,消除二義性,
2、改寫文法(消除左遞迴和提取做引子)
3、求非終結符的first集合follow集
4、檢查是不是ll(1)文法
若不是ll(1)文法,則說明文法的複雜性超過自頂向下的分析能力
5、按照ll(1)文法畫語法圖
6、化簡語法圖
7、按照語法圖,編寫程式演算法
1、**分析表的構造演算法
1) 對於每一產生式 a→α,作 2)和3)
2) 對於 first(α)中的每一終結符a, 將 a→α 填入 m[a,a]
3) 如果ε屬於 first(α),則將 a→α填入 follow(a)中任一元素 b 的 m[a,b];
4) 將所有無定義的 m[a,b] 標上錯誤標誌。
2、**分析法(狀態矩陣法)
1) 編寫文法,消除二義性;
2) 消除左遞迴、提取左因子;
3) 求 first 集和 follow 集
4)檢查是不是 ll(1) 文法
若不是 ll(1),說明文法的複雜性超過自頂向下方法的分析能力
5) 按照 ll(1) 文法構造**分析表
6) 實現**分析器
語法分析 自頂向下分析
確定的自頂向下分析方法,首先要解決從某文法的開始符號出發,對給定的輸入符號串如何根據當前的輸入符號 單詞符號 唯一地確定選用哪個產生式替換相應非終結符往下推導,或構造一棵相應的語法樹,若能夠推導出給定的輸入符號串,或能構造出語法樹其末端結點以從左向右的順序連線正好為給定的輸入符號串,則所給的輸入符號...
語法分析 自頂向下分析方法
前陣子弄完詞法分析後,這一周開始語法分析的課程。語法分析 在電腦科學和語言學中,語法分析 英語 syntactic analysis,也叫 parsing 是根據某種給定的形式文法對由單詞序列 如英語單詞序列 構成的輸入文字進行分析並確定其語法結構的一種過程。摘自維基百科 其實學習語法分析,並不是一...
簡述自頂向下的語法分析
在我們得到了context free grammar 之後,下一步就要將它轉換成一棵語法分析樹了,語法分析樹使得我們的編譯器能夠識別輸入串是否符合我們的context free grammar 中文翻譯為上下文無關語言 有兩種方法能夠將context free grammar轉換為語法分析樹。今天我...