梳理文法和語言的內容,理解與總結,
我們都知道,一種語言必定他的文法去描述,它的完整定義包括語法和語意兩個方面,語言和語法是指一組規則,用它可以形成和產生一個合適的程式,目前廣泛使用的是背景關系無關文法,也就是用背景關系無關文法作為程式設計的描述工具,比如用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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/115699.html
標籤:其他
