梳理文法和語言的內容,理解與總結。
咱們都知道,一種語言一定他的文法去描述,它的完整定義包括語法和語義兩個方面。語言和語法是指一組規則,用它能夠造成和產生一個合適的程序。目前普遍使用的是上下文無關文法,也就是用上下文無關文法做爲程序設計的描述工具,好比用A:=B+C表示是一個合法的賦值語句,則A:=B+就不是合法的賦值語句。算法
什麼是文法?文法至關於語言學(人類語言)中的語義分析,即分析一個句所表示的含義。它是產生中間代碼或目標代碼的依據。閉包
用EBNF(EBNF是一種稱爲擴展巴克斯範式的形式描述)表示就是:<句子> ::= <主語><謂語>工具
<主語> ::= <代詞>< 名詞>學習
<代詞>::= 我 | 你 | 他
spa
<名詞>::= 王明 | 大學生 | 工人 | 英語
設計
<謂語> ::= <動詞><直接賓語>blog
<動詞> ::= 是 | 學習token
<直接賓語> ::=<代詞> |<名詞>程序設計
(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)文法分類:
![](http://static.javashuo.com/static/loading.gif)
(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