編譯原理筆記第二部分,內容參考:北航軟院教師邵兵課堂課件及內容、張莉著《編譯原理及編譯程序構造》、國防工業出版社的《編譯原理——學習指導與典型題解析》、AlvinZH的學習筆記以及我的理解算法
目前是包含了所有內容的版本,後續會推出精簡版和複習知識點版閉包
若有建議或錯誤錯誤歡迎在評論中指出或聯繫我:QQ:847590417學習
本章內容spa
2.2 文法的非形式討論orm
2.3 文法和語言的形式定義blog
重點:符號串、符號串集合的計算、文法、語言、遞歸、短語、句柄、語法樹、文法的二義性、文法的使用限制、BNF表示文法、語法圖、文法的分類。
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
文法:對語言結構的定義與描述,從形式上用於描述和規定語言結構,也稱爲語法。
語法規則:經過創建一組規則,來描述句子的語法結構,通常規定用「::=」的符號代替「由...組成」,一些基本的語法結構以下:
利用規則推導句子:有了規則後即可按照必定的方式用他們來推導或產生句子,方法以下:從一個要識別的符號開始推導,即用相應規則的右部來替代規則的左部,從左向右推導,每次使用一條規則進行推導。
例子:
推導直到全部的非終結符號被終結符號代替爲止。
這種推導稱爲最左推導,除了這種還有最右推導
觀感上就沒有最左推導好了。
從一個<句子>推導出一個完整的句子的推導能夠寫成:
根據上述的介紹可知,文法只是在形式上對句子結構的定義與描述,而未涉及語義問題,所以可能出現一些大花生吃花生這種神奇的句子。
語法樹:用樹形描述一個句子的語法結構:
定義:文法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節中會介紹擴展的元符號),由元符號構成的語言稱爲元語言,便可以用於描述其餘語言的語言。
定義:直接推導:文法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的閉包,則此推導是規範的,記爲:(最右側須要有不變的,且不變的符號串要麼只包含終結符號,要麼爲空)。
每一個句子都有一個規範推導,並不是每一個句型都有規範推導,可由規範推導導出的句型稱爲規範句型。
結合多種推導符號:
最右推導:若符號串中有兩個以上的非終結符時先推導右邊的(規範推導);最左便是先推導左邊的。
定義:文法G[Z]
(1)句型:x是句型<=>Z能夠閉包推導出x,且x屬於V*(能夠有非終結符,能夠有終結符)
(2)句子:x是句子<=>Z可正閉包推導出x,且x屬於Vt*(式語言的最小單位,是由終結符號所組成的符號串)
(3)語言:L(G[Z])={x|x∈Vt*,Z多步推導出x},語言由全部的句子組成。
已知文法能夠經過推導求出語言
已知語言構造文法時沒有形式化的方法,文法和語言是多對一
例:
定義:這種兩種不一樣文法對應的語言相同的文法,他們是等價文法
編譯時關心的其實就是根據符號串和文法,判斷符號串是否符合文法對應語言的規定。
無窮種可能
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條規則即可定義全部的無符號整數)
定義:短語和簡單短語
一個文法G[Z],w是該文法的句型:w=xuy(xy可爲空,u不可爲空)
若是文法可推導出xUy,(U是一個非終結符),U可多步推導出u,則u是句型w相對於U的短語(句型中能被其所在位置的非終結符推出的符號串)
(u屬於V的正閉包,能夠非終結符,能夠終結符,不能夠空,即便一個符號也能夠是短語)
若U可直接推導出u,則u是句型w相對於U的簡單短語(又稱直接短語)。
定義:任一句型的最左簡單短語稱爲該句型的句柄,句柄在自底向上的語法分析中很重要。
再次解釋:
短語:將某句型轉化爲抽象語法樹後,每個有後繼結點的結點的葉子結點組成的符號串,有意義的最小單位(可由識別符號推出的非終結符號推出);
簡單短語:轉化爲抽象樹後,子結點中不能再推出其餘式子的結點的葉節點組成的符號串;
句柄:最左的簡單短語。
短語、簡單短語都是相對於句型而言的,一個矩形可能有多個短語、簡單短語,但句柄只能有一個。
樹:除了根節點之外,每一個葉節點只能有一個直接前驅;n個直接後繼
語法樹:句子結構的圖示表示法,是一種有向圖,由結點和有向邊組成。
一個結點就是一個符號,根節點是識別符號(最開始的),中間結點是非終結符,葉節點能夠是終結符或非終結符,有向邊即是這結點間的派生關係,通常有向邊默認從根節點指向子節點。
子樹:以語法樹中的某個結點爲根節點到底生成的子語法樹。
子樹和短語:某子樹的末端結點按自左向右順序爲句型中的符號串,則該符號串爲該句型的相對於該子樹根的短語(由於是由這子樹根推出的)。
句型的推導和語法樹的生成
給定一個G[Z],句型w。可創建推導序列:Z可根據語法G推導出w時,即可創建語法樹:以Z爲樹根結點,每步推導生成語法樹的一枝。
注:文法能產生的句子,能夠用不一樣的推導原則推導。語法樹的生成規律不一樣,但最終生成的語法樹形狀相同,不是全部文法都有此性質。
語法樹的推導有三種,通常推導:按深度進行推導;最左推導:首先推導最左側的結點到終結符號;最右推導:先最右。
1.由推導構造語法樹:
從識別符號開始,自右向左創建推導序列→由根結點開始,自上而下創建語法樹。
2.由語法樹構造推導
首先自下而上的修剪子樹的末端節點,直到把整棵樹剪掉,每剪一次對應一次規約:從句型開始,自左向右的逐步進行規約,即可創建推導序列,每一步都是歸約當前句型的句柄。
定義:對句型中的句柄進行的規約稱爲規範規約(最左歸約)。
定義:經過規範推導或規範規約所獲得的句型稱爲規範句型
定義:若對於一個文法的某一句子存在兩顆不一樣的語法樹,則該文法是二義性文法,不然是無二義性文法。
例:
他們的語法樹也不一樣:
定義:若一個文法的某句子存在兩個不一樣的規範推導,則該文法是二義性的。
除了以上的自頂向下判斷文法二義性,還能夠自底向上來看。例如在上例中:E+E*i是i+i*i經過兩步規範規約獲得的,但對於同一個句型E+E*i,他有兩個不一樣的句柄(對應兩棵不一樣的語法樹:i和E+E)。所以語法的二義性意味着句型的句柄不惟一。
定義:若一個文法的某規範句型的句柄不惟一(有兩個不用的規範歸約),則該文法是二義性的。
編譯時二義性會產生不肯定性,而文法的二義性是不可斷定的,因此沒法在一個規定步數內判斷一個文法是否有二義性。解決方法是提出限制條件,稱爲無二義性的充分條件,知足時即可判斷某文法是無二義性的。
根據這個原則即可用兩種方法解決:
1.根據條件修改編譯算法:例如規定運算符的優先級來避免文法的二義性,不一樣優先級先看高的,一樣優先級規定方向,這樣在推導時就統一了。
2.根據條件直接修改文法:修改文法的規則後,直接限制歸約的順序。
當給定一個符號串S屬於Vt的閉包,所要作的分析就是判斷符號串S是否屬於語法對應的語言。
在一個文法中,不能出現一些不該有的規則。
有害規則:例若有害規則:U::=U,這會引發二義性。
多餘規則:
(1)推導文法的句子中,用不到的規則(該規則的左部非終結符不會出如今任何句型中)
(2)在推導句子的過程當中,一旦使用了該規則,將推不出任何終結符號串的規則(該規則中含有推不出任何終結符號串的非終結符)。例如:當關於U的規則有且僅有U::=xUy,那就是多餘的,由於沒法推出終結符號串。
壓縮文法:文法中沒有有害規則或多餘規則。
檢查是否存在多餘規則:須要檢查文法中每一條規則左部的每一個非終結符號U是否知足下述兩個條件:
1.對全部的識別符號以外的非終結符號,這個非終結符號必須出如今某個句型中(右側)
2.對全部的非終結符號,他必須能推導出終結符號串(終結符號組成的)
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.語法圖(圖形化)
形式語言:用文法和自動機所描述的沒有語義的語言
語言定義:
文法定義:全部文法均可定義爲一個四元組,即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數字組成的字符串。若是沒法如此表述,則須要用一個集合來表示,集合的元素就是根據文法的規則得出的全部句子。
非終結符號的<>只是爲了區分所用,不是必要加的,能夠用其餘形式來區分,例如非終結符用大寫字母,終結符號用小寫。
一些比較容易出現的題型有:根據語言得出對應的文法,根據文法描述出語言,判斷文法類型,後續更新後會給出一些技巧的展現