編譯原理——第二章

第二章   高級語言及其語法描述

一、程序語言的定義

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型文法,上下文無關文法)。知識主要可以運用到給出一種語言來如何用文法描述,給定一種文法,它定義了一個什麼語言?利用文法寫出句子的語法樹等。知識不是特別難,但是是後續學習的基礎,應當重視

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章