文法和內容
編譯原理筆記第二部分,內容參考:北航軟院教師邵兵課堂課件及內容、張莉著《編譯原理及編譯程序構造》、國防工業出版社的《編譯原理——學習指導與典型題解析》、AlvinZH的學習筆記以及個人理解
目前是包含了全部內容的版本,后續會推出精簡版和復習知識點版
如有建議或錯誤錯誤歡迎在評論中指出或聯系我:QQ:847590417
閱讀目錄
本章內容
重點:符號串、符號串集合的計算、文法、語言、遞歸、短語、句柄、語法樹、文法的二義性、文法的使用限制、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數字組成的字符串。如果無法如此表述,則需要用一個集合來表示,集合的元素就是根據文法的規則得出的所有句子。
非終結符號的<>只是為了區分所用,不是必要加的,可以用其他形式來區分,例如非終結符用大寫字母,終結符號用小寫。
一些比較容易出現的題型有:根據語言得出對應的文法,根據文法描述出語言,判斷文法類型,后續更新后會給出一些技巧的展示