#編譯原理# 文法和內容(二)


文法和內容

編譯原理筆記第二部分,內容參考:北航軟院教師邵兵課堂課件及內容、張莉著《編譯原理及編譯程序構造》、國防工業出版社的《編譯原理——學習指導與典型題解析》、AlvinZH的學習筆記以及個人理解

目前是包含了全部內容的版本,后續會推出精簡版和復習知識點版

如有建議或錯誤錯誤歡迎在評論中指出或聯系我:QQ:847590417

閱讀目錄

本章內容

2.1 形式語言基礎

2.2 文法的非形式討論

2.3 文法和語言的形式定義

2.4 語法樹和二義性文法

2.5 句子的分析

2.6 有關文法的實用限制

2.7 文法的其他表示法

2.8 文法和語言分類

習題內知識

 

本章內容

重點:符號串、符號串集合的計算、文法、語言、遞歸、短語、句柄、語法樹、文法的二義性、文法的使用限制、BNF表示文法、語法圖、文法的分類。

 

2.1 形式語言基礎

一、字母表和符號串

字母表:符號的非空有限集

符號:字母表中的元素

符號串:由符號拼接成的有窮序列

空符號串:沒有任何符號的符號串

 

符號串的形式定義:

假設有一個字母表P:1.空符號串是P上的符號串;2.若x是P上的符號串,且a是字母表里的一個元素,則ax或xa(可以左,可以右,但只能一個不能同時加)是P上的符號串(一個符號也是符號串,a拼接ε);3.y是P上的符號串,當且僅當(iff)y是符合1.和2.的符號串。

 

二、符號串和符號串集合的運算

1.符號串相等:若x、y是集合上的兩個符號串,則x=yiff組成x的每一個符號和組成y的每一個符號依次相等。

2.符號串的長度:x是符號串,x的長度|x|等於組成器的符號個數。(空符號串長度為0)

3.符號串的聯接:若x、y是定義在P上的符號串,則x和y的聯接xy也是P上的符號串,符號串xy不等於yx,而空字符串無論在左還是右聯接到一個符號串上都是一樣的。εx=xε

4.符號串的冪運算:假設x是符號串,那么其冪運算就是自身的拼接,0次冪等於一個空符號串,n次冪既是自身重復n次

5.符號串集合的乘積運算:假設A、B是符號串集合,則AB就等於一個A集合中的符號在前聯接B集合中的符號在后:

 

6.符號串集合的冪運算:假設有一個符號串集合A,則A的零次冪是一個僅包含空符號串的集合,n次冪則是n個A拼接得到的結果。計算A的n次冪時可以用A拼接A的n-1次冪來計算。

7.符號串集合的閉包運算:設A是符號串集合,則有:

A的正閉包:

A的閉包:

閉包只是比正閉包多了一個空符號串。

 

如何用符號得到一個程序:

A是某語言的基本字符串:

 

B是該語言的單詞集:

 

則有B屬於A的閉包,因為是從A的所有結果中提取出來的

而該語言的一個句子,即一條語句,也是一個在B上的符號串

令C是該語言的句子集合,則C也屬於B的閉包,一個程序也屬於C

 

2.2 文法的非形式討論

文法:對語言結構的定義與描述,從形式上用於描述和規定語言結構,也稱為語法。

語法規則:通過建立一組規則,來描述句子的語法結構,一般規定用“::=”的符號代替“由...組成”,一些基本的語法結構如下:

 

利用規則推導句子:有了規則后便可按照一定的方式用他們來推導或產生句子,方法如下:從一個要識別的符號開始推導,即用相應規則的右部來替代規則的左部,從左向右推導,每次使用一條規則進行推導。

例子:

推導直到所有的非終結符號被終結符號代替為止。

這種推導稱為最左推導,除了這種還有最右推導

 

觀感上就沒有最左推導好了。

從一個<句子>推導出一個完整的句子的推導可以寫成:

 

根據上述的介紹可知,文法只是在形式上對句子結構的定義與描述,而未涉及語義問題,因此可能出現一些大花生吃花生這種神奇的句子。

語法樹:用樹形描述一個句子的語法結構:

 

 

2.3 文法和語言的形式定義

2.3.1 文法的定義

定義:文法G=(Vn,Vt,P,Z)(grammar)

Vn:非終結符號集(nonterminal vocabulary)

Vt:終結符號集(V=Vn∪Vt,稱為文法的字匯表)(terminal)

P:產生式或規則的集合(principle)

Z開始符號(識別符號)Z∈Vn

規則:一個有序對(U,x),通常寫為U::=x或U→x(::=就等於→),其中U的長度為1,x的長度大於等於0。U∈Vn,x屬於V的閉包。

例如一個無符號整數的文法:

G[<無符號整數>]=(Vn,Vt,P,Z)

Vn={<無符號整數>,<數字串>,<數字>}(規則左側出現的,可以繼續拆分的符號集)

Vt={0,1,2,3,...9}(剩余的,不能再繼續拆分的符號集)

P={<無符號整數>→<數字串>

<數字串>→<數字串><數字>

<數字串>→<數字>

<數字>→0

...

<數字>→9}(可拆分的符號集的變化規則)

Z=<無符號整數>(開始進行拆分的符號)

通常用尖括號把非終結符號括起來,以便和終結符號進行區分,其實非終結符號也不必有尖括號。

 

產生式(P內的元素)左邊的符號會構成集合Vn,且Z∈Vn

當產生式有相同的左部時可以合在一起,用或符號|划分開

如上既是文法的BNF表示(巴克斯范式)

 

給定一個文法,實際只需給出一個產生式的集合,並指定最開始的識別符號即可(一般約定為第一條規則的左側符號)

文法:

 

::=、|、<和>稱為元符號(未擴展的元符號,在2.7節中會介紹擴展的元符號),由元符號構成的語言稱為元語言,即可以用於描述其他語言的語言。

 

2.3.2 推導的形式定義

定義:直接推導:文法G:v=xUy,w=xuy(零步推導)

其中x、y∈V*(x、y是非終結符或者終結符或者空),U屬於Vn(非終結符),u屬於V*

若(U::=u)∈P,則v可根據文法G推導出w,v可推導出w,w直接歸約到v(::=等於→)

若x=y=空符號串,有U::=u,則U可根據文法G推導出u或者簡寫為U可推導出u(G可以省略)

例:

 

 

定義:間接推導1:存在文法G,有U0,U1,...,Un屬於V的正閉包

如果v=U0可以根據文法G中的兩次或以上次推導出U1,然后根據G依次推導出到Un=w。(加號一定要有,是間接推導的象征)

則表示v可以根據文法G正推導出w:這個序列稱為n次推導

例:

 

定義:間接推導2:存在文法G,有v,w屬於V的正閉包

如果v可以根據文法G正推導出w,或者v::=w,即在v可以根據G正推導出w時或v由w組成時:(直接推導加上n次推導)

 

定義:規范推導:有xUy可推導出xuy,如果y屬於Vt的閉包,則此推導是規范的,記為:(最右側需要有不變的,且不變的符號串要么只包含終結符號,要么為空)。

每個句子都有一個規范推導,並非每個句型都有規范推導,可由規范推導導出的句型稱為規范句型。

結合多種推導符號:

 

 

最右推導:若符號串中有兩個以上的非終結符時先推導右邊的(規范推導);最左即是先推導左邊的。

 

2.3.3 語言的形式定義

定義:文法G[Z]

(1)句型:x是句型<=>Z可以閉包推導出x,且x屬於V*(可以有非終結符,可以有終結符)

(2)句子:x是句子<=>Z可正閉包推導出x,且x屬於Vt*(式語言的最小單位,是由終結符號所組成的符號串)

(3)語言:L(G[Z])={x|x∈Vt*,Z多步推導出x},語言由所有的句子組成。

 

已知文法可以通過推導求出語言

已知語言構造文法時沒有形式化的方法,文法和語言是多對一

例:

 

 

定義:這種兩種不同文法對應的語言相同的文法,他們是等價文法

 

編譯時關心的其實就是根據符號串和文法,判斷符號串是否符合文法對應語言的規定。

 

2.3.4 遞歸文法

無窮種可能

1.遞歸規則:規則右部有與左部相同的符號

對U::=xUy,如果x是空符號串,即U::=Uy,既是左遞歸,左部未變;y是空符號串時U::=xU,右遞歸;當xy都不空,U::=xUy稱為自嵌入。

若文法中至少包含有一條遞歸規則,則稱該文法是直接遞歸的。

間接遞歸:有如下規則時:U::=Vx,V::=Uy|x,U也會得到自己。

 

2.遞歸文法:文法G,存在U∈Vn

如果U可正推導出...U...,則G是遞歸文法(自嵌入遞歸),如果可以正推導出U...,則G是左遞歸文法,如果...U,是右遞歸文法。

左的缺點:不能用自頂向下的方法進行語法分析,會造成死循環;

遞歸文法的優點:可用有窮條規則,定義無窮語言。(無符號整數的文法就是右遞歸文法,用13條規則便可定義所有的無符號整數)

 

2.3.5 句型的短語、簡單短語和句柄

定義:短語和簡單短語

一個文法G[Z],w是該文法的句型:w=xuy(xy可為空,u不可為空)

如果文法可推導出xUy,(U是一個非終結符),U可多步推導出u,則u是句型w相對於U的短語(句型中能被其所在位置的非終結符推出的符號串)

(u屬於V的正閉包,可以非終結符,可以終結符,不可以空,即使一個符號也可以是短語)

若U可直接推導出u,則u是句型w相對於U的簡單短語(又稱直接短語)。

 

定義:任一句型的最左簡單短語稱為該句型的句柄,句柄在自底向上的語法分析中很重要。

 

再次解釋:

短語:將某句型轉化為抽象語法樹后,每一個有后繼結點的結點的葉子結點組成的符號串,有意義的最小單位(可由識別符號推出的非終結符號推出);

簡單短語:轉化為抽象樹后,子結點中不能再推出其他式子的結點的葉節點組成的符號串;

句柄:最左的簡單短語。

短語、簡單短語都是相對於句型而言的,一個矩形可能有多個短語、簡單短語,但句柄只能有一個。

 

2.4 語法樹和二義性文法

樹:除了根節點以外,每個葉節點只能有一個直接前驅;n個直接后繼

語法樹:句子結構的圖示表示法,是一種有向圖,由結點和有向邊組成。

一個結點就是一個符號,根節點是識別符號(最開始的),中間結點是非終結符,葉節點可以是終結符或非終結符,有向邊便是這結點間的派生關系,一般有向邊默認從根節點指向子節點。

 

子樹:以語法樹中的某個結點為根節點到底生成的子語法樹。

子樹和短語:某子樹的末端結點按自左向右順序為句型中的符號串,則該符號串為該句型的相對於該子樹根的短語(因為是由這子樹根推出的)。

 

句型的推導和語法樹的生成

給定一個G[Z],句型w。可建立推導序列:Z可根據語法G推導出w時,便可建立語法樹:以Z為樹根結點,每步推導生成語法樹的一枝。

注:文法能產生的句子,可以用不同的推導原則推導。語法樹的生成規律不同,但最終生成的語法樹形狀相同,不是所有文法都有此性質。

語法樹的推導有三種,一般推導:按深度進行推導;最左推導:首先推導最左側的結點到終結符號;最右推導:先最右。

 

1.由推導構造語法樹:

從識別符號開始,自右向左建立推導序列→由根結點開始,自上而下建立語法樹。

 

 

2.由語法樹構造推導

首先自下而上的修剪子樹的末端節點,直到把整棵樹剪掉,每剪一次對應一次規約:從句型開始,自左向右的逐步進行規約,便可建立推導序列,每一步都是歸約當前句型的句柄。

 

定義:對句型中的句柄進行的規約稱為規范規約(最左歸約)。

定義:通過規范推導或規范規約所得到的句型稱為規范句型

 

2.4.2 文法的二義性

定義:若對於一個文法的某一句子存在兩顆不同的語法樹,則該文法是二義性文法,否則是無二義性文法。

例:

 

 

 

他們的語法樹也不同:

 

定義:若一個文法的某句子存在兩個不同的規范推導,則該文法是二義性的。

除了以上的自頂向下判斷文法二義性,還可以自底向上來看。例如在上例中:E+E*i是i+i*i通過兩步規范規約得到的,但對於同一個句型E+E*i,他有兩個不同的句柄(對應兩棵不同的語法樹:i和E+E)。因此語法的二義性意味着句型的句柄不唯一。

 

定義:若一個文法的某規范句型的句柄不唯一(有兩個不用的規范歸約),則該文法是二義性的。

編譯時二義性會產生不確定性,而文法的二義性是不可判定的,所以無法在一個規定步數內判斷一個文法是否有二義性。解決方法是提出限制條件,稱為無二義性的充分條件,滿足時便可判斷某文法是無二義性的。

根據這個原則便可用兩種方法解決:

1.根據條件修改編譯算法:例如規定運算符的優先級來避免文法的二義性,不同優先級先看高的,同樣優先級規定方向,這樣在推導時就統一了。

2.根據條件直接修改文法:修改文法的規則后,直接限制歸約的順序。

 

2.5 句子的分析

當給定一個符號串S屬於Vt的閉包,所要做的分析就是判斷符號串S是否屬於語法對應的語言。

 

2.6 有關文法的實用限制

在一個文法中,不能出現一些不應有的規則。

有害規則:例如有害規則:U::=U,這會引起二義性。

多余規則:

(1)推導文法的句子中,用不到的規則(該規則的左部非終結符不會出現在任何句型中)

(2)在推導句子的過程中,一旦使用了該規則,將推不出任何終結符號串的規則(該規則中含有推不出任何終結符號串的非終結符)。例如:當關於U的規則有且僅有U::=xUy,那就是多余的,因為無法推出終結符號串。

壓縮文法:文法中沒有有害規則或多余規則。

檢查是否存在多余規則:需要檢查文法中每一條規則左部的每個非終結符號U是否滿足下述兩個條件:

1.對所有的識別符號之外的非終結符號,這個非終結符號必須出現在某個句型中(右側)

2.對所有的非終結符號,他必須能推導出終結符號串(終結符號組成的)

 

2.7 文法的其他表示法

1.擴充的BNF表示(Backus Normal Form)

BNF的元符號:<,>,::=,|

擴充的:<,>,::=,|,{,},[,],(,)

{}:右側上m,下n,其中包含一個t,表示這個符號串t可以重復n到m次,mn都可省略,都省略后表示重復0到任意多次。內部也可以用|表示或

[]:表示內部的符號串可有可無,等於花括號包裹着符號串m是1,n是0

():提取因子的符號,例如xy|xm|xn,可以寫成x(y|m|n)

 

2.語法圖(圖形化)

 

 

 

2.8 文法和語言分類

形式語言:用文法和自動機所描述的沒有語義的語言

語言定義:

文法定義:所有文法都可定義為一個四元組,即Vn,Vt,P,Z。

 

文法和語言分類:0型、1型、2型、3型,他們的去唄在於對產生式施加不同的限制。

0型:

規則P:u::=v,u屬於V+需要有非終結符,v屬於V*

L0,被稱為短語結構文法,左部和右部都是符號串,左側是至少包含一個Vn的符號串,右部為符號串(可為空),可以用圖靈機接受。

 

1型:

規則P:xUy::=xuy,其中U屬於Vn,x、y、u都屬於V*

L1,這種語法規則被稱為上下文敏感或上下文有關,也即只有在x、y這樣的上下文中才能把U改寫為u,可由一種線性界限的圖靈自動機接受。

 

2型:

規則P:U::=u,其中U屬於Vn,u屬於V*

L2,稱為上下文無關文法,即把U改寫為u時不必考慮上下文,和BNF表示等價,可以由下推自動機接受。

 

3型:

規則P:U::=T或wT;U、w屬於Vn,T是Vt。

L3,稱為正則文法、正則語言、正則集合,注意左右線性不能同時出現,可以由有窮自動機接受。

 

根據描述:L3屬於L2屬於L1屬於L0,范圍更大的文法可以產生子文法,;例如2型文法可以產生L2型文法,L3型文法,不能產生L1型文法。

 

四種文法類型的關系及判斷方法:

主要區別在於規定產生式的左邊和右邊的字符的組成規則不同。明確四種文法從0型到3型,其規則和約定越來越多,限制條件也越來越多,所以判斷時應該先從最復雜的3型開始。

3型:(多的限制:右邊最多兩個字符,且只能有一種線性)

左邊只有一個非終結符

右邊最多有兩個字符,兩個時左非終結右終結,一個時必須終結(左非終結右終結是左線性的,左終結右非終結是右線性)

左右線性不能同時出現。

 

2型:(多的限制:左邊需要只有一個非終結符)

左邊只有一個非終結符

右邊有若干個終結符和非終結符

 

1型:(多的限制:左邊需要有非終結符)

左邊至少需要含有一個非終結符

右邊有若干個終結符和非終結符

左邊推導右邊時變化的部分左右兩邊內容不能變,變化后不能為空

 

0型:

左側的符號串至少有一個非終結符

右側隨意

即只要能描述出來,就屬於0型文法

 

習題內知識

語言的語法是用來形成一個合法程序的一組規則,這些規則的一部分是詞法規則,另一部分是語法規則(又稱產生規則)。

名字和標識符:名字都是由標識符組成的,標識符在不同語言中的規范不一樣。他們在形式上難以區分,標識符是一個沒有意義的字符串,名字則是有明確的意義和屬性,且名字可看成是代表一個抽象的存儲單元。

一個語言可由多個文法推導出

而一個文法僅可推導出一個語言。語言對文法:一對多

對於不同類型的文法,他們的規則是對所有的產生式起作用的,所以只需要找出一個不符合規則的,那么他就不屬於這個類型的文法

當問一個文法的語言是什么時,如果是人類可以理解的,例如無符號整數,一個0-5數字組成的字符串。如果無法如此表述,則需要用一個集合來表示,集合的元素就是根據文法的規則得出的所有句子。

非終結符號的<>只是為了區分所用,不是必要加的,可以用其他形式來區分,例如非終結符用大寫字母,終結符號用小寫。

一些比較容易出現的題型有:根據語言得出對應的文法,根據文法描述出語言,判斷文法類型,后續更新后會給出一些技巧的展示

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM