国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

從零開始寫個編譯器吧 - LL(1)

Tony / 638人閱讀

摘要:希臘字母表示空,這個產(chǎn)生式表明非終結(jié)符可以產(chǎn)生一個空。此外,對于一個文法之中的非終結(jié)符,還有集集的概念。對于一個非終結(jié)符而言,它的集指可能展開的各種形式中,位于第一的所有終結(jié)符所組成的集合。

上一章中,我說 Parser 的工作就是依據(jù)文法定義,找到一個與源代碼匹配的展開方案就可以了。聽起來我們只要先給出一個 tao 語言的文法定義,然后寫一個找匹配方案的的程序就可以了。
然而事情情況并非如此簡單。因?yàn)榧偃缥覀儾粚ξ姆ǘx的形式加諸任何限制的話,讓 Parser 找到匹配方案并非很輕易的事情。

因此,我規(guī)定,tao 語言的將用 LL(1) 文法來定義

在簡單介紹 LL(1) 文法之前,我還要說明一種比較特別的產(chǎn)生式。

  

A → ε

希臘字母 ε 表示“空”,這個產(chǎn)生式表明非終結(jié)符 A 可以產(chǎn)生一個空。具體來說,如果有如下文法。

  

S → αAβ

A → ε

那么:

  

S → αβ

非終結(jié)符可以產(chǎn)生空這一特性,令文法的形式更加復(fù)雜,但是卻是必不可少的。少了這一特征,就很難描述 tao 語言的語法細(xì)節(jié)了。

此外,對于一個文法之中的非終結(jié)符,還有 FIRST 集、FOLLOW 集的概念。

對于一個非終結(jié)符 A 而言,它的 FIRST 集指 A 可能展開的各種形式中,位于第一的所有終結(jié)符所組成的集合。記為 FIRST(A)。

而 FOLLOW 集,指在整個文法中,非終結(jié)符 A 后面可能接的所有終結(jié)符組成的集合。記為 FOLLOW(A)。

這么描述可能有點(diǎn)繞,細(xì)節(jié)先不管,但有一點(diǎn)很重要,即無論是 FIRST 集還是 FOLLOW 集,它們都只能包含終結(jié)符

那么,LL(1) 又是怎樣一種文法呢?

對于一個文法而言,如果它的每一個非終結(jié)符的產(chǎn)生式

  

A → α | β | γ ……

都滿足如下三個條件,則將這個文法稱之為 LL(1) 文法。

對于所有不能導(dǎo)出 ε 的表達(dá)式 α、β、γ……,都有,F(xiàn)IRST(α)、FIRST(β)、FIRST(γ)……兩兩互不相交。

最多只有一個表達(dá)式可以導(dǎo)出 ε。

如果有一個表達(dá)式可以導(dǎo)出 ε,那么對于其他不可以導(dǎo)出 ε 的表達(dá)式 ξ,有,F(xiàn)IRST(ξ) ∩ FOLLOW(A) = Φ。

最后一條有加粗,當(dāng)然并非因?yàn)樗鼘?LL(1) 本身很重要,而是因?yàn)槲以趯?shí)現(xiàn) Parser 的時候并沒有完全遵守這一條。某種意義上說,tao 語言的 Parser 并非嚴(yán)格遵守 LL(1) 文法,因此在此加粗這條,以便與后面的章節(jié)呼應(yīng)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64261.html

相關(guān)文章

  • 從零開始寫個譯器系列

    摘要:是的,這個系列將呈現(xiàn)一個完整的編譯器從無到有的過程。但在寫這個編譯器的過程中,我可不會偷工減料,該有的一定會寫上的。該語言的虛擬機(jī)將運(yùn)行于之上,同時編譯器將使用實(shí)現(xiàn)。我早有寫編譯器的想法之前沒寫過,故希望一邊寫編譯器一邊完成這個系列。 是的,這個系列將呈現(xiàn)一個完整的編譯器從無到有的過程。當(dāng)然,為了保證該系列內(nèi)容的簡潔(也為了降低難度),僅僅保證編譯器的最低要求,即僅能用。但在寫這個編譯...

    genedna 評論0 收藏0
  • 從零開始寫個譯器 - 分析非終結(jié)符

    摘要:基于這個結(jié)論,對某個非終結(jié)符展開形式的判定就變得明了起來。但嚴(yán)格的要求一個非終結(jié)符最多只能有一個產(chǎn)生式可以導(dǎo)出。這意味著我們必須明確知道每一個非終結(jié)符能不能導(dǎo)出。如果集包含這個終結(jié)符,則表明該非終結(jié)符需要導(dǎo)出。 tao 語言的 Parser 的語法分析是不帶回溯的,自頂向下的。文法選用 LL(1),這種文法雖然略顯薄弱,但還尚可用。 回顧上一章提到的 LL(1) 的定義,可以得出如下結(jié)...

    snifes 評論0 收藏0
  • 從零開始寫個譯器 - 開始寫詞法分析器(3)

    摘要:在之前的章節(jié)第章從零開始寫個編譯器吧開始寫詞法分析器中我有說,我將函數(shù)設(shè)計成主動調(diào)用的形式,而則是被動調(diào)用的形式。接下來本系列將進(jìn)入編寫語法分析器的階段,不過在此之前,我將抽出一點(diǎn)時間介紹一下語言本身。 上周周末旅游去了,就沒更新了,雖然回到海拔0m的地區(qū),不過目前似乎還在缺氧,所以本次就少更點(diǎn)吧。 這章將結(jié)束詞法分析的部分。 在之前的章節(jié)(第7章從零開始寫個編譯器吧 - 開始寫詞...

    Barrior 評論0 收藏0
  • 從零開始寫個譯器系列——將在 GitBook 上以在線電子書的形式繼續(xù)連載

    摘要:各位抱歉了,這個系列在多個平臺的專欄上連載。所以,我把從零開始寫個編譯器吧弄到了上。以后更新也是先從上開始。從零開始寫歌編譯器吧更及時的信息可以從我的公眾號上獲得雖然不怎么寫公眾號,但是還是掛一下吧 各位抱歉了,這個系列在多個平臺的專欄上連載。每發(fā)一個新章節(jié),都要同步到各個專欄上,于是可能漏掉 Segmentfault 的博客。汗,其實(shí) Segmentfault 這邊已經(jīng)落后很久了。 ...

    justCoding 評論0 收藏0
  • 從零開始寫個譯器 - 譯器的結(jié)構(gòu)

    摘要:自然,我們還是先從語言的編譯器下手吧。在動手寫編譯器之前,得容我將編譯器的結(jié)構(gòu)進(jìn)行進(jìn)一步的劃分。這些將被語法分析器接收并進(jìn)行進(jìn)一步處理。由于本系列將著重于寫出編譯器,必要的理論和概念還是會交代的。從零開始寫個編譯器吧編譯器的結(jié)構(gòu)的博客 自然,我們還是先從 tao 語言的編譯器下手吧。在動手寫編譯器之前,得容我將編譯器的結(jié)構(gòu)進(jìn)行進(jìn)一步的劃分。編譯器可視為一個黑盒,從其一端輸入源代碼,另一...

    wudengzan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<