編譯原理(四) 語法分析

2021-10-02 21:40:43 字數 3634 閱讀 6143

主要內容:

本章將重點介紹典型的語法分析方法及相關的概念和實現技術

語法分析分為:

自上而下:遞迴下降分析法(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』

a』 → αa』| ε

對於一般情況而言,若某一文法g的產生式具有如下形式:

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)是

②如果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

定義: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是英文的,我自己隨便翻的,不一定對 上下文無關文法 語法分析書和抽象語法樹 二義性簡單語言的語法 知識圖譜 語法分析器的功能輸入 詞法單元 詞法單元序列 輸出 語法結構的內在表示式...