第二章 高級語言及其語法描述
一、程序語言的定義
1、程序語言主要是由語法和語義兩個方面定義。
2、任何語言程序都可以看作是一定字符集(稱爲字母表)上的一字符串(有限序列)。
3、單詞符號是語言中具有獨立意義的最基本結構。一般包括:各類型的常數,標識符,記本子,算符和界符等。
4、詞法規則是指單詞符號的形成規則。
5、語言的語法規則規定了如何從單詞符號形成更大的結構(語法單位),換言之,語法規則是語法單位的形成規則。語法單位一般包括:表達式,語句,分程序,函數,過程和程序。
6、語言的語法規則和詞法規則定義了程序的形式結構。
7、語言的語義是指這樣的一組規則:使用它可以定義一個程序的意義。
8、大多數編譯程序採用的基於屬性文法的語義制導翻譯方法。
9、程序設計語言:建立在有限字母集上的一個符號系統。
10、一個程序語言的基本功能是描述數據和對數據的運算。程序從本質上來說是描述一定數據的處理過程。
二、高級語言的一般特性
1、高級語言的分類
(1)、語言範疇:強制式語言(FORTRAN、C)、應用式語言(LISP、ML)、基於規則的語言(Prolog)、面嚮對象語言(Java)
(2)、編譯時是否需要類型檢查:靜態類型語言(C/C++、Java)、動態類型語言(Python、PHP)
(3)、類型檢查強弱:弱類型、強類型
(4)、是否支持過程的嵌套定義:支持(Pascal)、不支持(C/C++、Java)
2、數據類型
基本數據類型(int,double...)
構造數據類型(數組、指針...)
自定義數據類型(棧、隊列、字符串...)
三、程序語言的語法描述
1、設∑是一個有窮字母表,它的每個元素稱爲一個符號。∑上的一個符號串是指由∑中的符號所構成的一個有窮序列。不包含任何符號的序列稱爲空字,記爲ε。用∑*表示∑上的所有符號串的全體,包括ε。φ表示不含任何元素的空集。
2、集合V自身的n次(連接)積記爲:Vⁿ=VV...V;規定Vº={ε}。令V*=Vº∪V¹∪V²...Vⁿ,稱爲V的閉包。
記V﹢=VV*,稱爲V的正則閉包。
3、上下文無關文法G
(1)、G定義:它所定義的語法範疇(語法單位)是完全獨立於這種範疇可能出現的環境的。
(2)、G包括四個組成部分:一組終結符號(VT),一組非終結符號(VN),一個開始符號(S),一組產生式(P)。
VT:一般用小寫字母或阿拉伯數字表示,非空有限集
VN:一般用大寫字母表示,非空有限集 VN∩VT=φ
S:非終結符號
P:產生式集合(有限),形式:P—>a,P∈VN,a∈(VT∪VN)*。S必須在某個產生式的左部出現一次。
(3)、假定G是一個文法,S是它的開始符號。如果S=>a,則稱a是一個句型。僅含終結符的句型是一個句子。文法G所產生的句子的全體是一個語言,將它記爲L(G)。
L(G)={ a | S=+>a&a∈VT* }。
4、文法例子
(1)、考慮一個文法G1:S->bA A->aA|a 它定義了一個什麼語言?
S=>bA=>ba
S=>bA=>baA=>baa……a 所以:L(G1) = { baⁿ | n>=1}
(2)、構造一個文法G使 L(G) = { aⁿⁿbⁿ | m,n>=1 }
a的個數和b相同,所以會同時產生。
S->aSb | ab。
5、最左推導:任何一步a=>b都是對a中的最左邊非終結符進行替換。
6、如果文法G的一個句子存在兩棵不同的最左語法分析樹,則這個文法是二義的。
7、如果文法G的一個句子存在兩棵不同的最右語法分析樹,則這個文法是二義的。
8、喬姆斯基(Chomsky)將文法分爲四類,即0型文法(強於1)、1型文法(強於2)、2型文法(強於3)、3型文法。
9、0型文法是短語文法,1型文法是上下文有關文法,上下文無關文法是2型文法,2型文法的描述能力最強,3型文法又稱爲正規文法。
四、知識應用
1、令文法G爲: N->D | ND
D->0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
(1)G的語言L(G)是什麼?
L ( G ) 1 是0~9 組成的數字串
(2)寫出句子0127的最左和最右推導
最左推導: N =>ND =>NDD =>NDDD =>DDDD =>0DDD =>01DD=>012D=>0127
最右推導: N =>ND =>N7=>ND7=> N27=> ND27=> N127=> D127=>0127
2、寫出一個文法使其語言爲奇數集,且每個奇數不以0開頭
G( S ) (判斷一位奇數、兩位奇數及多位奇數的組成)
S->J | AJ
J->1 |3| 5| 7| 9
O->2 |4 |6 |8 | J
T->0 | O
A->AT | O
3、令文法爲: E->T | E + T | E - T
T->F | T * F | T / F
F->( E ) | i
給出 i + i + i、i + i * i 的語法樹
i + i + i i + i * i
4、把下面文法改成無二義的
S-> SS | ( S ) | ( )
改正後: S->TS | T
T->( S ) | ( )
5、給出下列語言的相應文法
(1) L1 = { aⁿ bⁿ ci | n>=0 ,i >=1}
G( S ) S->AC
A->aAb | ab
C->cC | ε
(2)L2 = { aⁿ bⁿ aⁿⁿ bⁿⁿ | n,m>=0 }
G( S ) S->AB
A->aAb | ε
B->aBb | ε
五、總結
本章主要學習了什麼是程序語言、高級語言的分類以及用語法來描述語言(主要是2型文法,上下文無關文法)。知識主要可以運用到給出一種語言來如何用文法描述,給定一種文法,它定義了一個什麼語言?利用文法寫出句子的語法樹等。知識不是特別難,但是是後續學習的基礎,應當重視。