自己的理解——編譯原理中的四種文法


轉載請注明來源http://www.cnblogs.com/qjkobe/p/5332612.html,謝謝。

編譯原理學文法類型的時候,會出現喬姆斯基給出的四種文法類型,然而,這些概念太過於抽象了,對於初學者實在很難理解,所以,在這里,我給出一些我自己的理解,希望能對大家有所幫助。

 

在這之前,你必須對終結符和非終結符有所了解,簡單來說,非終結符就是這個東西還能→別的東西(→的標准叫法是定義為),但是終結符就不能了,比如說,分子→原子,原子→誇克。誇克就不能再分了,所以不能由其他粒子定義。(隨便舉個例子,基於2016年,免得以后萬一誇克不是最小的了呢,機智如我)

ps:終結符里包含ε,也就是空。

然后,必須明確是概念是文法類型之間的包含關系。

先有0型,然后后面的文法都是對前者添加更多的限制,來縮小它的范圍。

 

那么,什么是0型文法,其實就是,→的左邊,是非終結符和終結符的組合,由於終結符是有ε這個空存在的,所以,這就相當於只要有一個非終結符,其他怎么樣都行。向右的右邊,沒有任何限制。舉個例子:

終結符:A,B,C,S(注:S作為開始符,是非終結符,至少在一條規則中作為左部出現,規則就是什么→什么)

非終結符:a,b,c(注:ε也在里面,不過一般不會寫出來,因為在規則里加上S→ε沒有意義。)

→左邊可以是:S,SA,A,aA,aAb,aAa,AB,aAB.....等等

→右邊可以是:a,ab,b,abc,ε,A,AB....等等,反正,什么都可以,只要在終結符和非終結符的集合里。

 

那好,0型的限制這么少,1型又是怎樣的呢,其實,1型加的限制就是,對任一產生式α→β,都有|β|>=|α|, 僅僅 S→ε除外,這個說法有點讓人摸不着頭腦,讓我們換一種說法

表達式的形式應該為:α1Aα2→α1βα2,A在終結符集合中,剩下的符號都是任意的(終結符和非終結符的集合),這意味着什么,我舉個例子來說明:

A→aB

S→abc

bB→bc

aB→bB

我們在上述例子的第一個規則中A→aB中,想把B給替換掉,但是我們發現,沒有B→這樣的規則,然而,聰明的我們又發現,有aB→這樣的式子,所以我們就把aB替換成了bB,然后bB又可以替換成bc。

這其實就表達了這樣一個意思,我要換這個B啊,必須得和他周圍的東西一起換掉,就好像超市,B單獨一個東西賣不出去,只有打包才行,所以,1型文法又稱為上下文有關文法。

 

注:這里有人會覺得,1型不就是0型嗎?這個答案是肯定的,因為是包含關系嘛。但是0型就不一定是1型了。舉個例子,比如以下規則;

S→ab

bB→c

aB→cB

上面的規則中,最后二條違背了1型的定義,所以,上述例子是0型不是1型。

 

搞懂了1型,那么,2型文法又加了什么限制呢,其實就是,→的左邊,都只能存在一個非終結符,那種AA,aB,aBc之類的就不能存在了,左邊必須單身狗,向右的右邊依舊很自由,什么都可以(終結符和非終結符的集合)。

比如:

A→aB

S→bAA

B→a

C→abA

大家會發現,當我要在A→aB中,把B替換掉的時候,由於存在B→a,所以直接就可以替換掉B,而不用在乎A→aB這個式子的B的旁邊有沒有別的東西,所以,2型文法又叫做上下文無關文法。

 

最后一種,3型文法,又稱為正規文法,它的限制可就十分之死板了,它只允許兩種形式的產生式存在,一個是A→aB,一個是A向右a,A和B都是非終結符,a則是終結符。舉個例子:

S→aA

S→a

A→bB

A→b

反正就是只有兩種格式的式子允許存在,所以正規文法其實是很少的。

 

PS:終結符和非終結符的集合可以是,ab,AB,aBc這樣的組合,但是上述文字中我如果沒說集合,那就只能有一個,比如,A,b,C,d


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM