4 4 算 符 優 先 分 析 法

2021-10-23 10:43:48 字數 4351 閱讀 8614

4.4.1 方法概述

所謂算符優先分析法就是依照算術表示式的四則運算過程而設計的一種語法分析方法

這種分析方法首先要規定運算子之間(確切地說是終結符之間)的優先關係和結合性質,然後借助這種關係,比較相鄰運算子的優先順序來確定句型的可歸約串並進行歸約。

下面,以表示式的文法為例,說明採用這種分析法分析符號串 id + id * id 的分析過程。

例如,文法 g [ e ]為

e → e + e | e * e | ( e ) | id
這個文法是乙個二義性文法,因而對句子 id + id * id 有兩種不同的規範歸約,也就是在歸約過程中句型的控制代碼不唯一。

句子 id + id * id 的兩種不同的規範歸約過程如下:

第乙個規範歸約過程           第二個規範歸約過程

(1 ) id + id * id (1 ) id + id * id

(2 ) e + id * id (2 ) e + id * id

(3 ) e + e * id (3 ) e + e * id

(4 ) e + e * e (4 ) e * id

(5 ) e + e (5 ) e * e

(6 ) e (6 ) e

分析上述歸約過程,句型 e + e * id 在第乙個規範歸約中 id 是它的控制代碼;而在第二個規範歸約中 e + e 是它的控制代碼。此現象是由於沒有定義運算子 + 和 * 的優先關係而引起的。在第乙個規範歸約中是假定 * 優先於 + ,所以不能立即把 e + e 歸約為 e ;而在第二個規範歸約中是假定 + 優先於 * ,因此必須先把 e + e 歸約為 e 。可見上述歸約過程中起決定作用的是相鄰兩個終結符號之間的優先關係。於是算符優先分析法的關鍵在於用合適的方法去定義任何兩個可能相鄰出現的終結符號 a 和 b 之間的優先關係。

任何兩個相鄰終結符號 a 和 b 之間的優先關係有 3 種:

a 

a =· b a 的優先順序等於 b

a >· b a 的優先順序高於 b

注意,優先關係與出現的左右次序有關,這一點不同於數學中的 < , = 和 > 。例如,a · a 。通常表示式中運算子的優先關係有( < · + 但沒有 +> ·(而是有 +< ·(。

乙個文法的終結符號之間的優先關係可用乙個矩陣來表示,矩陣的每一行每一列都是文法的終結符,矩陣元素是兩終結符之間可能的優先關係。算符優先分析法借助優先關係矩陣(也稱優先關係表,簡稱優先表)尋找句型的可歸約串。

需要指出的是,算符優先分析法並不是對所有的文法都適合,它對文法有一定的要求,要求文法是算符優先文法,也就是說,只有當描述語言的文法是算符優先文法,才能採用算符優先分析法進行語法分析。

4.4.2算符優先文法的定義

算符文法的定義

設有文法 g ,若 g 中沒有形如 u → … vw … 的規則,其中 v 和 w 為非終結符,則稱 g 為算符文法,也稱 og 文法。也就是說,在算符文法中,任何乙個規則右部都不存在兩個非終結符相

鄰的情況,由定義可知,算符文法具有兩個重要的性質(不證明,僅給出結論)。

性質 1 在算符文法中任何句型都不含兩個相鄰的非終結符。

性質 2 若 ab 或 ba 出現在算符文法的句型 β 中,其中 a ∈ v n ,b ∈ v t ,則 β 中任何含 b的短語必含有 a 。

定義任意兩個終結符號之間的優先關係設 g 是乙個算符文法,a 和 b 是任意兩個終結符, p , q , r 是非終結符,算符優先關係 ·定義如下:

(1 ) a= · b 當且僅當 g 中含有形如 p → … ab … 或 p → … aqb 的規則。

(2 ) a

(3 ) a >· b 當且僅當 g 中含有形如 p → … rb … 的規則,且 r ⇒+… a 或 r ⇒+… aq 。

3. 算符優先文法的定義設有乙個不含 ε 規則的算符文法 g ,如果任意兩個終結符號對(a , b )在 ·和 · 3 種關係中只有一種關係成立,則稱 g 是算符優先文法,也稱 opg 文法

對前述算術表示式的文法

e → e + e | e * e | ( e ) | id

由算符文法和算符優先文法的定義,我們不難證明該文法是乙個算符文法,但不是算符優先文法。因為該文法的任一規則右部都不包含兩個相鄰的非終結符,所以該文法是算符文法。但是,由於 e → e + e 和 e ⇒+ e * e ,有+ · * ,即運算子 + 和 * 之間存在兩種不同的優先關係,所以該表示式的文法只是算符文法而不是算符優先文法。

若算術表示式的文法為

e → e + t | t

t → t * f | f

f → ( e ) | id

顯然,該算術表示式的文法是算符優先文法。

4.4.3算符優先關係表的構造

對算符優先文法,根據優先關係的定義,可按如下方法直接構造優先關係表。

首先對文法每個非終結符 a 定義兩個集合:

firstvt ( a ) = 

lastvt ( a ) =

使用這兩個集合,構造文法 g 的優先關係表的演算法如下。

輸入:算符優先文法 g 。

輸出:關於文法 g 的優先關係表。

方法:

(1 )為每個非終結符 a 計算 firstvt ( a )和 lastvt ( a )。

(2 )執行程式

for (每個產生式 a → x 1 x 2 … x n )

for ( i =1 ; i <= n -1 ; i ++ )

(3 )對 firstvt ( s )中的所有 b ,置 $ · $ ;置 $ · $ ( s 為文法開始符號)。

【例 4.12 】

設有表示式的文法 g [ e ]:

e → e + t | t

t → t * f | f

f → ( e ) | id

構造該文法的算符優先關係表。

首先計算每個非終結符的 firstvt 和 lastvt :

執行演算法,逐條掃瞄文法規則,因有 e → ( e )的規則,則有(· )。

尋找終結符在左邊,非終結符在右邊的符號對有

+ t 則 +

* f 則 *

( e 則(

尋找非終結符在左邊,終結符在右邊的符號對有

e + 則 lastvt ( e ) >·+

t * 則 lastvt ( t ) >·*

e )則 lastvt ( e ) >· )

最後,對 $ 有 $ · $ , $ < · firstvt ( e ), lastvt ( e ) > · $ ,從而構造出文法 g [ e ]的算符優先關係表如表 4.4 所示。

4.4.4算符優先分析演算法的設計

對於算符優先分析法,它雖然是一種自下而上的語法分析方法,但它並不是一種規範歸約的分析方法。這是因為在算符優先文法中,僅在終結符號之間定義優先關係而未對非終結符定義優先關係,從而無法使用優先關係表去識別由單個非終結符組成的可歸約串,也就是說,算符優先分析法不是用控制代碼來刻畫可歸約串,而是用最左素短語來刻畫可歸約串的。

最左素短語

所謂句型的素短語是指這樣一種短語,它至少包含乙個終結符,並且除自身之外,不再包含其他的素短語。句型最左邊的素短語稱為最左素短語。

例如,考慮例 4.12 中的文法 g [ e ]的句型 t + t * f + id 的素短語和最左素短語。

首先給出句型 t + t * f + id 的語法樹,見圖 4.5 。

由素短語定義可知 t * f 和 id 是素短語。 t * f 為最左素短語(注意: t 是該句型的控制代碼,而不是素短語)。

編譯原理 八 算符優先分析法 分析過程

算符優先分析法 構造演算法優先關係表 算符優先關係主要用於界定右句型的控制代碼 標記控制代碼的左端 出現在控制代碼的內部 標記控制代碼的右端。發現控制代碼的過程 非終結符的處理 因為非終結符不能影響語法分析,所以不需要區分它們,於是只用乙個佔位符來代替它們 演算法的主體思想 用棧儲存已經看到的輸入符...

算符優先分析法 思路方法在這裡

編寫乙個算符優先分析程式,能實現以下功能 1.輸入文法,判斷是否為算符文法 2.構造並輸出該文法的每個非終結符的 firstvt 集和 lastvt 集 3.構造並輸出算符優先分析表,判斷是否為算符優先文法,若不是提示無法進行分析 4.任意輸入乙個輸入串,可得到成功的分析或錯誤的提示,輸出其分析過程...

編譯原理 算符優先分析法

一 算符文法的定義 二 定義任意兩個終結符號之間的優先關係 解釋 1 ab兩個可以同時規約,故優先順序相等 2 將r的推導式代入p的產生式中,最終也會形成如 1 中一樣的p的產生式的形式,但此時需要對b先進行規約,再規約a,故a的優先順序小於b的優先順序 3 同理可得,b的優先順序小於a的優先順序 ...