原來編譯原理可以這麼學

2022-08-13 19:39:19 字數 2921 閱讀 6014

其實這部分內容在我上課的時候,是特別頭疼的,不知道老師講的什麼,但是經過自己分析琢磨,感覺還好,能分析的差不多,所以就跟大家分享一下:

其實這個特別簡單,我們來看個例子就懂了:

s->ap

s->bq

a->a

a->ca

b->b

b->db

這其中我們看到的,s為開始符,s,a,b為非終結符,在左邊,可以推導出乙個式子來。而p,q,a,b,c,d為終結符。其實咱們一點都不用記,應該太簡單了,你這樣想,s(start)也是乙個非終結符,然後大寫的為非終結符,小寫的為終結符,那麼這個概念就一點難度都沒有了

文法的型別:

主要是要求咱們判斷這幾個文法的型別。

0型文法:

0型文法是這幾個文法中,限制最少的乙個,所以見到的至少是0型文法。g=(vn,vt,p,s),其中我們得知道,vn是非終結符的集合,vt是終結符的集合,p是推導式的乙個集合,s是開始符。我們從圖來慢慢分析:

我們從圖中來闡述一下這些概念,s,a,b為vn,而p,q,a,b,c,d,為vt,s為開始符。整個集合為p。

我們每個式子裡邊的左邊必須要包含這些元素或者元素組合中的至少乙個非終結符,右邊可以是這些元素的任意組合。我想這樣可能好理解一些,這樣我們什麼公式都不需要記住了,左邊有非終結符,右邊有終結符,就ok。如:

a->ab。

1型文法:

也叫上下文有關文法;這個1型文法理解起來也沒有多大的難度;在0型文法的基礎上,我們再新增一點點的限制就行了,我們看新增了什麼限制:

右邊的長度》=左邊的長度,這個長度咱們可以這麼來理解,就是這些字元的數量,小的推出大的或者相等的。這樣就沒有難度了。比如:

a->b,a->bba  都符合要求,那麼反過來,bba->a就不符合要求了,因為左邊是3,右邊是1。看圖:

2型文法:

叫上下文無關文法。2型文法在1型文法的基礎上,我們規定2型文法中,左邊必須是非終結符,然而乙個終結符乙個非終結符的組合不是乙個非終結符,如ab不是乙個非終結符,但是兩個非終結符的組合就是乙個非終結符了,如ab就是行了。

那麼應該是這樣的:

ab->abc就不符合要求,但是ab->abc就符合要求了。

3型文法:

也叫正規文法,對應有限狀態自動機。在2型文法的基礎上再加限制。要求更加高。

要麼乙個非終結符推出乙個終結符,要麼乙個非終結符推出乙個終結符並且帶乙個非終結符。同時說這是乙個文法當中的。那麼這種屬於3型文法,

這右線性與左線性是相互獨立的,我們來看例子。

你不能一會寫一下右線性一會寫一下左線性,這樣拼湊在一起就構成不了3型文法了。要寫就只寫右線性,或者只寫左線性,不能一塊來,分開來就對了。

那麼這幾個文法的關係應該是:

接下來我們來實戰一下,鍛鍊一下我們的基礎。

我們來做乙個題目:

實戰:

1、我們分開來寫,應該是:a->e   a->ab   b->ab  b->a

2、我們先來判斷是否符合0型文法:0型文法規定左邊必須有非終結符,那麼這些都是符合的。

3、我們再來看是否符合1型文法:1型文法規定從小推到大。也符合。

4、我們再來看是否符合2型文法:2型文法規定左邊必須是非終結符,也滿足。

5、我們繼續看是否符合3型文法:規定只能符合右線性或者左線性,那麼前面乙個應該是符合右線性的,後面乙個是符合左線性的。所以綜合起來就不符合3型文法了。

得出結論:那麼這個題目屬於2型文法。

正規式:

正規式與正規文法之間的轉換:

我們要掌握的三個規則,咱們看一張表就能明確了

:我們來分析一下這些規則;

規則1:文法產生式(a—>xb,b->y ),正規式(a=xy)。對於這個文法產生式轉換成正規式,我覺得就是乙個代入的過程,把b=y代入a->xb即可得出正規式。反過來,正規式轉換成文法產生式,則新增乙個變數就搞定了。

規則2:這個式子裡邊有乙個遞迴,a—>xa,這樣就產生遞迴了,應該是這樣的:a->xa,a->xa……這樣的無窮下去,最終a還是要等於y的,所以x就有無窮多個,從0個到無窮多個,所以這個推導出來的正規式就是a=x*y,表明x有無窮多個。

規則3:a—>x,a->y。那麼a=x|y。這個就很簡單了。a退出x或者y。

我們接下來來看看有限自動機:

nfa與dfa的定義:

dfa:確定的有限自動機

m=(s,e,f,so,z),我們來分析分析這個五元組:

s是乙個有限狀態集合;

e就是乙個輸入字元;

f是乙個sxe至s的對映;

so:初態;

z:終態。

我們來看看具體的例子,光是理論和概念的東西最不好理解,來看看例子吧:

dfa=(,,f,s,),

我們對照上面式子就能看的出來各個元素代表的意義,我們再來分析一遍:

是乙個狀態集合;是輸入字元;f是乙個對映,s是初態,是乙個終態。

那麼我們接下來看這些對映:

k(s,0)=b,k(s,1)=a,k(a,0)=f,k(a,1)=c,k(b,0)=c,k(b,1)=f,k(c,1)=f;

我們根據這個流程,就有了這麼一張圖:

然後再看看nfa的定義:

m=(s,e,f,so,z) 這個五元組跟dfa的定義一樣。

編譯原理還有這兩個的轉換,我們在後面的部落格中慢慢完善吧~

編譯原理這部分咱們先講這麼多,如講的有不對的地方,還請您指出,將感激不盡~

原來EXECL可以這麼玩

前幾天產品經理拿一堆execl的資料,問我能否按照特定的格式匯入到資料庫中,我當時不太確定。因為我是乙個c 程式設計師,問了一下旁邊的同時,告訴我說可以去寫乙個程式,呼叫execl的元件,我當時就愣了,就這麼乙個小東西,還要去寫那個玩意兒,而且寫起來還是挺麻煩的。之後偶然臨機一動發現原來mysql可...

ARMS 原來實時計算可以這麼簡單!

摘要 業務實時監控服務 arms 是一款阿里雲應用效能管理 apm 類監控產品。借助本產品,您可以基於前端 應用 業務自定義等服務,迅速便捷地為企業構建秒級響應的業務監控能力。以乙個sql查詢為例 select count col1 sum col2 as sum from data table w...

原來web前端薪資還可以這麼高!

其實在國外的前端開發人員和後端開發人員比例約為1 1的,但是到了國內比例卻成了1 3以下。web前端開發職位的人才缺口達到將近50萬左右。然後根據中國人力資源部網上統計資料,上海在2018年web前端開發工程師這一崗位的月平均收入為1.5萬元,工作經驗達到3年的web前端工程師甚至達到3萬元。一 市...