程序語言的語法描述
文法
描述語言的語法結構的形式規則
(箭頭表示定義)
語法描述的幾個概念
字母表:一個有情字符集,記為∑
字母表中每個元素稱為字符
∑上的字(也叫字符串)是指由∑中的字符所構成的一個有窮序列
不包含任何字符的序列稱為空字,記為ε
用∑*表示∑上的所有字的全體,包含空字ε
例如:設∑={a , b},則∑*={ε,a,b,aa,ab,ba,bb,aaa……}
∑*的子集U和V的連接(積)定義為
UV={αβ|α∈U & β∈V}
示例:設U={a,aa} V={b,bb}
UV={ab,abb,aab,aabb}
V自身的n次積為Vn=VV……V(n個)
V0={ε}
V*是V的閉包:V*=V0∪V1∪V2∪V3……
V+是V的正規閉包:V+=VV*
上下文無關文法
上下文無關文法G是一個四元組G=(VT,VN,S,P),其中
◆VT︰終結符(Terminal)集合(非空)
◆V∶非終結符(Nonterminal)集合(非空),且V∩VN=Ø
◆S∶文法的開始符號,S∈VN
◆P∶產生式集合(有限),每個產生式形式為
P→α , P∈VN , α∈(VT∪VN)*
◆開始符S至少必須在某個產生式的左部出現一次
文法生成語言
推導
定義∶稱αAβ直接推出αγβ,即 αAβ⇨αγβ 僅當A→γ是一個產生式,且α , β (V∪VN)*。
如果α1⇨α2⇨...⇨αn,則我們稱這個序列是從α1到αn,的一個推導。若存在一個從α到αn的推導,則稱α1可以推導出αn。
句型、句子和語言
假定G是一個文法,S是它的開始符號。如果S⇨*α則稱*α是一個句型。
僅含終結符號的句型是一個句子。
文法G所產生的句子的全體是一個語言,記為L(G)。
L(G)={α|S⇨+α,α∈V*T}
推導與語法樹
最左推導和最右推導
從一個句型到另一個句型的推導往往不唯一
E+E⇨i+E⇨i+i
E+E⇨E+i⇨i+i
最左推導∶任何一步α ⇨β都是對α中的最左非終結符進行替換
最右推導∶任何一步α ⇨β都是對α中的最右非終結符進行替換
語法樹
用一張圖表示一個句型的推導,稱為語法樹
—棵語法樹是不同推導過程的共性抽象
語法樹與二義性(ambiguity)
文法的二義性∶如果一個文法存在某個句子對應兩棵不同的語法樹,則說這個文法是二義的
語言的二義性:一個語言是二義的,如果對它不存在無二義的文法
對於語言L,可能存在G和G',使得L(G)=L(G')=L,有可能其中一個文法為二義的,另一個為無二義的
自然語言的二義性:John saw Mary in a boat
John在船上看到Mary John看到Mary在船上
表達式→項│表達式+項
項→因子│項*因子
因子→(表達式)| i
二義性問題是不可判定問題,即不存在一個算套杏熊傳有限步驟內,確切地判定一個文法
可以找到一組無二義文法的充分條件
形式語言鳥瞰
喬姆斯基於1956年建立形式語言體系,他把文法分成四種類型∶0,1,2,3型
與上下文無關文法一樣,它們都由四部分組成但對產生式的限制有所不同
G=(VT,VN,S,P)
◆VT︰終結符(Terminal)集合(非空)
◆V∶非終結符(Nonterminal)集合(非空),且V∩VN=Ø
◆S∶文法的開始符號,S∈VN
◆P∶產生式集合(有限)
0型(短語文法,圖靈機)
產生式形如∶α→β
其中 : α∈ (VT∪VN)*且至少含有一個非終結符;
β∈ (V∪VN)*
1型(上下文有關文法,線性界限自動機)
產生式形如︰α→β
其中:|α|≤|β|,僅S→ε例外
2型(上下文無關文法,非確定下推自動機)
產生式形如:α→β
其中:A∈ VN ; β∈(VT ∪VN)*
3型(正規文法,有限自動機)
產生式形如∶A→αB或A→α
其中: α∈VT* ; A,B∈VN
(右線性文法)
產生式形如∶A→Bα或A→α
其中:α∈VT* ; A,B∈VN~
(左線性文法)
四種類型文法描述能力比較
上下文無關文法與上下文有關文法
L={anbn|n>1}不能由正規文法產生,但可由上下文無關文法產生
G(S):S>aSb] ab
L={anbncn|n>1}不能由上下文無關文法產生,但可由上下文有關文法產生
G(S):
S→ aSBC| aBC
CB → BC
aB → ab
bB → bb
bC → bc
cC →> cc
程序設計語言不是上下文無關語言,甚至不是上下文有關語言
L={ α⊂α|α∈{a,b}*}不能由上下無關文法產生,甚至連上下有關文法也不能產生,只能由0型文法產生
◆標識符引用
◆過程調用過程中,“形-實參數的對應性"(如個數,順序和類型二致性)
對於現今程序設計語言,在編譯程序中,仍然采用上下文無關文法來描述其語言結構