梳理文法和語言的內容,理解與總結。
我們都知道,一種語言必定他的文法去描述,它的完整定義包括語法和語義兩個方面。語言和語法是指一組規則,用它可以形成和產生一個合適的程序。目前廣泛使用的是上下文無關文法,也就是用上下文無關文法作為程序設計的描述工具,比如用A:=B+C表示是一個合法的賦值語句,則A:=B+就不是合法的賦值語句。
什么是文法?文法相當於語言學(人類語言)中的語義分析,即分析一個句所表示的含義。它是產生中間代碼或目標代碼的依據。
用EBNF(EBNF是一種稱為擴展巴克斯范式的形式描述)表示就是:<句子> ::= <主語><謂語>
<主語> ::= <代詞>< 名詞>
<代詞>::= 我 | 你 | 他
<名詞>::= 王明 | 大學生 | 工人 | 英語
<謂語> ::= <動詞><直接賓語>
<動詞> ::= 是 | 學習
<直接賓語> ::=<代詞> |<名詞>
(1)文法的形式化定義:
- G=(VT , VN , P , S)
- VT:終結符集合,終結符是文法所定義的語言的基本符號,有時也稱為token。
- VN:非終結符集合,非終結符是用來表示語法成分的符號,有時也稱為"語法變量",可以推出其它的語法成分
- P:產生式集合
- S:開始符號
(2)符號串運算:
- 符號串的連接:εx=xε=x;
- 集合的乘積:AB={xy|x∈A,y∈B};{ε}A=A{ε}=A;
- 符號串的冪運算:x=abc,x^2=abcabc;
- 集合的冪運算
正閉包A+與閉包A*:A*={ε}∪A+
(3)文法分類:
(4)語言的定義與運算
語言:在某一確定字母表上的特定符號串的集合。 空集ε,集合{ ε }也是符合此定義的語言。
語言運算舉例:
- L∪D 全部字母和數字的集合
- LD 由一個字母后跟一個數字組成的所有符號串的集合
- L4 由4個字母組成的所有符號串的集合
- L* 由字母組成的所有符號串(包括)的集合
- L(L∪D)* 以字母開頭,后跟字母、數字組成的所有符號串的集合
- D+ 由一個或若干個數字組成的所有符號串的集合
(5)句型、句子和語言:
- 句型:S=*>x, x∈(Vn∪Vt)*,其中S=*>x為廣義推導。
- 句子:S=*>x, x∈Vt*,其中S=*>x為廣義推導,x必須是終結符的閉包(可為ε)。
- 語言:L(G[S])={x|S=+>x且x屬於Vt*},其中S=+>x為推導,至少使用一次規則。
(6)語法樹求短語、簡單短語和句柄:
- 短語:子樹的末端結點形成的符號串。
- 簡單子樹:只有一層分支的子樹。
- 直接短語(簡單短語):簡單子樹的末端結點形成的符號串。
- 句柄:子樹中最左邊的那棵只有父子兩代的子樹的所有葉結點自左至右排列起來,就是該句型的句柄。
(7)語義的二義性
如果文法G中的某個句子存在不只一棵語法樹,則稱該句子是二義性的。如果文法含有二義性的句子,則稱該文法是二義性的。
嘗試寫出PL/0 語言的文法。
EBNF 表示的符號說明。
- ‘< >’用左右尖括號括起來的中文字表示語法構造成分,或稱語法單位,為非終結符。
- ‘::=’該符號的左部由右部定義,可讀作“定義為” 。
- ‘|’表示“或”,為左部可由多個右部定義。
- ‘{ } ’表示花括號內的語法成分可以重復。在不加上下界時可重復 0 到任意次數,有上下界
- 時為可重復次數的限制。
- ‘[ ]’表示方括號內的成分為任選項。
- ‘( )’表示圓括號內的成分優先。
- 上述符號稱“元符號” ,定義文法用到上述符號作為文法符號時需要引號 ‘’括起。
PL/0 語言文法的 EBNF 表示:
- <程序 >::=< 分程序 >.
- <分程序 >::=[< 常量說明部分 >][< 變量說明部分 >][< 過程說明部分 >]< 語句 >
- <常量說明部分 >::=CONST< 常量定義 >{,< 常量定義 >};
- <常量定義 >::=<標識符 >=< 無符號整數 >
- <無符號整數 >::=< 數字 >{< 數字 >}
- <變量說明部分 >::=VAR< 標識符 >{,< 標識符 >};
- <標識符 >::=< 字母 >{< 字母 >|<數字 >}
- <過程說明部分 >::=< 過程首部 ><分程序 >{;< 過程說明部分 >};
- <過程首部 >::=PROCEDURE< 標識符 >;
- <語句 >::=< 賦值語句 >|<條件語句 >|<當型循環語句 >|<過程調用語句 >|<讀語句 >|<寫語句 >|<復合語句 >|<空 >
- <賦值語句 >::=<標識符 >:=< 表達式 >
- <復合語句 >::=BEGIN< 語句 >{;< 語句 >}END
- <條件 >::=< 表達式 ><關系運算符 ><表達式 >|ODD< 表達式 >
- <表達式 >::=[+|-]< 項>{< 加法運算符 ><項>}
- <項>::=< 因子 >{< 乘法運算符 ><因子 >}
- <因子 >::=< 標識符 >|<無符號整數 >| ‘(’<表達式 > ‘)’
- <加法運算符 >::=+|-
- <乘法運算符 >::=*|/
- <關系運算法 >:===|#|<|<=|>|>=
- <條件語句 >:=IF< 條件 >THEN< 語句 >
- <過程調用語句 >::=CALL< 標識符 >
- <當型循環語句 >::=WHILE< 條件 >DO< 語句 >
- <讀語句 >::=READ ‘(’<標識符 >{,< 標識符 >} ‘)’
- <寫語句 >::=WRITE ‘(’<表達式 >{,< 表達式 >} ‘)’
- <字母 >::=a|b|,, |X|Y|Z
- <數字 >::=0|1|2|,, |8|9