主要內容:
本章將重點介紹典型的語法分析方法及相關的概念和實現技術
語法分析分為:
自上而下:遞迴下降分析法(ll**分析法—>推導自下而上:算符優先分析法(lr分析法—>歸約
完成的任務:
① 對詞法分析器產生的單詞符號進行處理,輸出分析樹
②與單詞相關的資訊記錄到符號表中
③型別檢查
④錯誤處理
符號的使用約定
終結符①.字母表中比較靠前的小寫字,如a,b,c
②. 操作符,如+、-等
③. 標點符號,如括號、逗號等
④. 數字0、1、。。。9
⑤. 黑體串,如if 、id等
非終結符①.字母表中比較靠前的大寫字,如a、b、c
②.字母s,常用來表示開始符號
③. 小寫斜體名字,如expr、stmt
字母表中比較靠後的大寫字母,如x、y、z等,用來表示文法符號,也就是說,可以是終結符,也可以是非終結符
字母表中比較靠後的小寫字母,如u、v…z等,表示終結符的串聯
5.小寫希臘字母α、β、γ等表示 文法符號的串,所以乙個產生式可寫作:a⟶推導\longrightarrow
⟶α
就是用產生式的右部的串來代替左部的非終結符
事實上,推導給出了自頂向下構成樹的精確描述
例:
有描述算數表示式的文法g
e⟶
\longrightarrow
⟶e+e|e*e|(e)|-e|id
字串id+id*id是該文法的推導過程:
e=>e+t=>e+t*f=>e+t*id=>e+f*id=e+id*id=> t+id*id=>f+id*id=>id+id*id
幾個約定:
e=>-e:e推導出了-e
=(*)>零步或多步推導
=(+)>一步或多步推導
**最左推導:**每一步都堅持替換當前句型中最左非終結符的推導
**最右推導:**每一步都堅持替換當前句型中最右非終結符的推導,也稱為規範推導
句子:s=(+)>w 稱為終結符串w是文法g的句子
句型:s=(+)>α 稱α是文法g的句型
語言:l(g)=
語法樹語法描繪了如何從文法的開始符號推導出乙個句子的過程
語法樹可以看成是推導的圖形表示,但它不能顯示出替代的順序
語法具有如下特性的樹:
1.樹根標記為開始符號語法樹的葉結點從左到右的排列,剛好是這個文法所產生的語言的乙個句子2.每個葉結點由終結符或者ε標記
3.每個內結點由乙個非終結符標記
4.如果a是某個內結點的非終結符標記,a1, a2,…… an是該結點從左到右排列的所有子結點的標記,則a→ a1 a2…… an是乙個產生式
乙個文法生成的語言就是它的某個分析樹所生成的句子的集合
為給定的終結符串(句子)構造一棵分析樹的過程稱為這個串(句子)的語法分析(parsing)
二義性給定乙個文法g,如果l(g)中存在乙個具有兩棵或兩棵以上分析樹的句子,我們就稱該文法為二義性的,g也叫二義性文法。
造成二義性的原因:
文法中沒有體現出結合率和優先順序
消除二義性:
我們通常採用」最近匹配「原則來解決這種二義性
左遞迴如果文法g具有乙個非終結符a使得對某個字串α存在推導a=>a α,則稱文法g是左遞迴的;如果a→a α,則稱文法g是直接左遞迴的
左遞迴會使分析進入到無限迴圈之中
消除簡單左遞迴的方法:
對於含有左遞迴的產生式 a→a α| β
可用下面的非左遞迴的產生式 代替:
a→ β a』對於一般情況而言,若某一文法g的產生式具有如下形式:a』 → αa』| ε
a→a α1| a α2 |…| a αm| β1| β2|…| βn
則可用如下方法消除左遞迴:
a→β1a』| β2a』 |…| βn a』
a』 → α1a』| α2a』|… | αma』 | ε
消除左遞迴的一般演算法:
輸入:無限迴圈推導和ε產生式的方法g
輸出:與g等價的無左遞迴文法
提取左因子
輸入:文法g
輸出:乙個等價的提取了左因子的文法
方法:對於a→ αβ1| α β2 |…| α βn| γ
可改寫為: a→ αa』| γ;a』→ β1| β2 |…| βn
first與follow集
first
定義:first( α)是由α推導出的所有的第乙個終結符號組成的集合,即:
first( α )=,如果α => ε 則 ε ∈ first( α )。
演算法:
①如果x是終結符,則first(x)是follow②如果x →ε是乙個產生式,則ε∈ first(x)
⑶如果x是非終結符,且x →y1 y2…… yk,則
y1 => ε first(y1 )中的所有符號都在first(x)中
y1 y2…… yi-1=> ε, first( yi ),中的所有符號都在first(x)中
y1 y2…… yk=> ε,則ε ∈ first(x)
定義:follow(a)是由所有句型中緊跟在a後面的終結符a組成的集合,follow(a)={a|s=> αaa β,a ∈vt
演算法
①$ ∈follow(s)
②對於a→ αbβ的產生式,則first( β)- ε放入follow(b)
③對於a→ αb或a→ αbβ,其中β=> ε,則將follow(a)放入follow(b)中
ll(1)文法
乙個上下文無關文法若滿足下列條件,我們就稱它為ll(1)文法
⑴文法不含左遞迴
⑵文法中每個非終結符a的各個產生式的首終結符集兩兩不相交,即,若
a→ α1| α 2 |…| α n,則 first( αi )∩first( αj )=φ
⑶文法中每個非終結符a若其首字符集中含有ε,則first( αi )∩follow(a)= φ
ll(1)文法的說明:
這裡ll(1)中的第乙個l表示從左到右掃瞄輸入串,第二個l表示最左推導,1表示分析時每步
只需向前檢視乙個符號
編譯原理(四 語法分析)
語法分析是編譯過程的核心部分。它的任務是在詞法分析識別出單詞符號串的基礎上,分析並判定程式的語法結構是否符合語法規則。4.1自上而下分析 語言的語法結構是用上下文無關文法描述的。因此,語法分析器的工作本質上就是按文法的產生式,識別輸入符號串是否為乙個句子。按照語法分析樹的建立方法,可以把語法分析辦法...
語法分析 編譯原理
實驗目的 對迴圈語句和條件判斷語句編寫詞法分析編譯程式,只能通過一遍掃瞄完成。用c 實現 實驗要求 1 關鍵字 for if then else while do 所有關鍵字都是小寫。2 運算子和分隔符 3 其他識別符號 id 和整型常數 num 通過以下正規式定義 id letter letter...
編譯原理 語法分析
根據上課內容順序寫的部落格,並不是按照書的目錄來的 使用龍書以及編譯程式設計原理 第二版 金成植 金英編著 老師的ppt是英文的,我自己隨便翻的,不一定對 上下文無關文法 語法分析書和抽象語法樹 二義性簡單語言的語法 知識圖譜 語法分析器的功能輸入 詞法單元 詞法單元序列 輸出 語法結構的內在表示式...