編譯原理 結合例題徹底理解文法四元式與正則文法

2021-10-09 13:32:02 字數 1365 閱讀 8332

這篇部落格起源於一道很有趣的正則文法的題目。題目描述如下:

已知l=+,且x中含有1011子串}。

構造接收語言l的正則文法。

什麼是正則文法呢?首先需要了解什麼是文法。我們知道,編譯原理中的文法g是乙個四元式:

g =

vt是乙個非空有限集,它的每個元素為終結符號。也就是說vt是由文法中的終結符構成的集合

vn是乙個非空有限集,它的每個元素稱為非終結符號。也就是說vn是由文法中的非終結符構成的集合。由於乙個符號要麼是終結符、要麼是非終結符,因此vt和vn的交集為空。

s是乙個非終結符號,稱為開始符號。s必須在某個產生式的左部出現一次。

p是有限個產生式的集合,每個產生式形如:p->a。

在題目中,l=+,且x中含有1011子串},也就是指由0與1組成、包括1011子串的串。乙個可行的文法如下:

g=

vt=vn=

p=

也就是令子串1011前與後均為任意個0與1即可。比如01101111。

那麼什麼是正則文法呢?正則文法相當於在文法的基礎上進行了進一步的限制,本質上還是文法,只是它規定了文法的書寫格式。正則文法,又稱為3型文法,它規定:**乙個產生式的結果要麼是乙個終結符,要麼是乙個終結符加上乙個非終結符。**也就是說產生式的形式必須是:

si→ωsj 或 si→ω

其中ω代表任意乙個非終結符號,s代表任意乙個終結符號。因為ε也是非終結符,所以自然也可以出現si->ε這種形式。

可以看出,正則文法實質上是要求在設計文法時,

乙個乙個字元、乙個乙個狀態地去考慮。什麼意思呢?我們先寫出l的正則文法:

g=

vt=vn=

p=

我們需要得到包含1011的串,所以我們乙個乙個字元地去匹配。首先需要匹配乙個1,然後需要是乙個0,然後再乙個1,最後再乙個1。如果中途有一步匹配失敗,那麼需要返回到前面的狀態再繼續匹配。所以我們可以抽象出這樣幾個狀態:

s4:匹配到了1011中的1011

所以說正則文法其實是從狀態的角度去考慮問題。比如s1期待得到乙個0,從而轉換為s2,那麼如果得到乙個1,就會回到狀態s1。s3已經匹配了101,期待得到乙個1,從而轉換為s4,那麼如果得到乙個0,其實就會得到1010,所以10是成功匹配的,因此回到狀態s2。

感興趣的讀者可以自行畫一下上述文法的dfa。

編譯原理(整體理解)

編譯原理實際上是傳統編譯器的工作原理。它可以分為六個部分 詞法分析 語法分析 語義分析 中間 生成 優化 目標 生成。整個過程其實就像把一篇英語文章翻譯成中文,讓只懂中文的人看懂。詞法分析是乙個程式,輸入的是字元流 源 輸出的是token。這就好比英語中看到幾個字母組在一起,不能說它是乙個單詞,乙個...

編譯原理的理解

我認為這門課是一門真正與 做鬥爭的課程,而且編譯原理可以說是乙個電腦科學的縮影。你學習它更多的是去追尋程式語言的本質,學完這門課程,我相信,你對你所寫的程式 程式語言都會有更深的本質認識,這樣的認識也會讓你站的高度完全不同,如果你真的學的好,我想別人看到的是語法,你看到的是背後的實現,在歐洲教會還不...

編譯原理01 文法

文法編譯就是高階語言翻譯成低階語言的過程,翻譯完全部 後執行。解釋也是翻譯的過程,但和編譯不同,解釋時逐句翻譯,一邊解釋一邊執行。程式語言是乙個記號系統。可以看作是一定字符集 字母表 上的字串,包括語法和語義兩部分。文法是描述語言的語法結構的形式規則。young men like pop music...