寫在開始:工具
上篇咱們介紹了編譯 「工廠」 的流程,本篇介紹,工廠裏的 「工具」。學習
開始教程:.net
語言和文法?語言咱們知道,計算機語言,人類的語言,動物的語言,不一樣國家的語言,不一樣種族的語言等等。那神馬是文法呢?所謂文法,文,文字,法,規則,法則,法律。組合起來就是,文字的規則。每種語言都有本身的文法,不一樣的語言有不一樣的文法。例如咱們的中文的文法,用一種規則來定義句子的組成,還拿 「我是中國人」 爲例。3d
咱們的箇中文句子構造規則:< 主語 >< 謂語 >< 賓語 >< 補語 >< 狀語 >。 而英語的句子構造:S十 V 主謂結構 S 十 V 十 F 主系表結構 S 十 V 十 O 主謂賓結構 S 十 V 十 O1 十 O2 主謂雙賓結構 S 十 V十 O 十 C 主謂賓補結構說明:S=主語;V=謂語;P=表語;O=賓語;O1=間接賓語;O2=直接賓語;C=賓語補足語。咱們能夠看出漢語和英語有不一樣的編排,不一樣的規則,這就是文法。 blog
咱們這裏要說的是編譯程序的文法。教程
書中的文法定義:使用文法做爲工具,不只爲了嚴格地定義句子的結構,也是爲了適當條數的規則把語言的所有句子描述出來,能夠說文法是以有窮集合刻畫無窮集合的工具。 get
接下來了解一些關於表示文法的一些基本定義:數學
一些基本定義編譯
符號和符號串:
正如咱們學習的 English 是由單詞和標點符號構成的,單詞又是有字母構成的,計算機語言也是如此,也是由字母和數字等一些基本符號構成的,一個源程序就是一個 「基本符號串」,因此咱們開始瞭解符號和符號串相關的定義。
字母表:
元素的非空有窮集合。不一樣的語言有他本身不一樣的字母表,咱們的計算機語言字母表就是數字,字母,標點等若干符號了。中文的字母表就是漢字了。
符號串:
字母表的符號組成任何又窮序列的符號串。例如字母表 A={a,b,c} 則由這個字母表組成的符號串包括: {ab,ac,bc,abc,a,b,c}。
有了這些就至關於有了 123456,接下來就是一些運算了,符號串的一些運算了。
鏈接運算:
eg:x=bay=nanaxy=banana(很簡單,鏈接在一塊兒)
方冪運算:x^0= e ; x^1 = x;.....;(和小學數學的方冪一致)
兩個字母表乘積:∑1={0,1},∑2={a,b},∑1∑2 ={0a,0b,1a,1b};(小學數學結合運算)
∑的正閉包:
∑+=∑∪∑2∪∑3∪∑4∪……
∑的克林閉包(kleene Closure):
∑*=∑0∪∑+(與正閉包區別哦,這算是新概念)
例如:{0,1}+ = {0,1,00,01,11,000,001,010,011,100,……}
{0,1}* = {ε,0,1,00,01,11,000,001,010,011,100,…}
咱們用這些規則將咱們的語言形式化:
「我是中國人」:名詞:: = 中國人;代詞::= 我;動詞::= 是;
編譯程序的文法把計算機語言形式化的定義:A->b ; 讀做:A 定義爲 b;或把他說成是一條關於 A的規則(產生式);
更加規範的定義:
文法 G 的定義:四元組 (Vn,Vt,P,S)
Vn:是非終結符集;
Vt:終結符集;
P:表示一種規則(a->b)ab 表示終結符和非終結符的集合,但 a 中至少包括一個非終結符。Vn,Vt,P 是非空有窮集合。
S:表示開始符,他是一個非終結符,至少要有一條規則在左側。
那什麼是終結符和非終結符呢?規則又是怎樣?開始符?
下面來看一個英文句子,以英文句子爲例,說說這個過程,幻燈片上的這個例子很適合初學者。
分析句子:The grey wolf will eat the goat .
句子的組成規則:
咱們如何用文法符號來描述這個概括的過程呢?這個英文句子怎麼形式化的表現出來呢?
這就是爲何咱們上述的文法 G 要用那四個符號來表示了:
由於前人發現重複的地方,想用有窮的地方表達無窮的東西,用這四個方式來表示剛好能將全部的句子概括。
這是對一個句子的分析,固然若是有一個句子,咱們也能夠根據這種規則判斷是個句子是否符合英文的文法。
文法描述的語言是該文法一切句子的集合。
給出幾個詞,咱們能根據文法組成一個句子,能夠根據規則產生語言。
給出一個句子,咱們把句子的詞進行歸類,能夠判斷這個句子是否可被識別。
例如:the grey will eat the goat
the grey wolf will eat wolf
the grey goat will eat the wolf
the grey goat will eat the grey
符合語法語義的句子僅是:
the grey wolf will eat goat
因此文法 G 的形式定義如上所述
Vt:終結符,咱們通常用除了大寫字母表示。
Vn:非終結符,咱們通常用大寫字母表示。
S:通常是開始符號。
P:就表示一種規則啦。
a->b 被稱爲產生式(定義式)
仙人(前人)給定義的一些說法:
文法 G、、上述定義,cd 是 Vn 和 Vt 中任意字符,符號串 V 和 W V=caW=db (規則 a->b) 則 V能直接產生 W,則說 W 是 V 的直接推導。或說 W 直接規約到 V。
1 若是 V->W0->W1->W2...->Wn=W (n>0) 則稱 W 規約到 V 記做:V ---+- >W (箭頭上帶一個加號,寫的時候不方便。。)
若 1 或 V=W 則記做 V ---*->W (箭頭上帶一個星號)
句子句型:
設 G[S] 是以文法,若是符號 x 是從識別符號推到出來的,即有 S---*--->x , 則稱 x 是文法 G[S] 的句型。
若 x 僅由終結符號組成,則稱 x 爲該文法 G[S] 的句子。