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

文法和內容

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

目前是包含了所有內容的版本,後續會推出精簡版和複習知識點版閉包

若有建議或錯誤錯誤歡迎在評論中指出或聯繫我:QQ:847590417學習

閱讀目錄

本章內容spa

2.1 形式語言基礎3d

2.2 文法的非形式討論orm

2.3 文法和語言的形式定義blog

2.4 語法樹和二義性文法遞歸

2.5 句子的分析ip

2.6 有關文法的實用限制ci

2.7 文法的其餘表示法

2.8 文法和語言分類

習題內知識

 

本章內容

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

 

2.1 形式語言基礎

1、字母表和符號串

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

符號:字母表中的元素

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

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

 

符號串的形式定義:

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

 

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數字組成的字符串。若是沒法如此表述,則須要用一個集合來表示,集合的元素就是根據文法的規則得出的全部句子。

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

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

相關文章
相關標籤/搜索