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

資訊專欄INFORMATION COLUMN

從零開始寫個編譯器吧 - 文法簡介

stormzhang / 1888人閱讀

摘要:而,稱之為非終結符。而這個展開方案中對各個非終結符產生式的選擇過程,即是對源代碼中每一個部分的定性過程。這個過程讓能夠理解源代碼各個部分表示的含義,并以此生成對應的語法樹。

我需要定義出 tao 語言的細節,在此,需要引出文法這一概念。所謂文法,即是用于描述語言的一種工具。
例如,一個賦值語句可能寫成如下形式:

  

variable = 1 + 3

如何充分定義這個賦值語句的形式呢?若用自然語言描述,我可以說,賦值語句最左邊是一個標示符,然后緊接一個“=”符號,然后再接一個表達式。滿足這個條件的,即是賦值語句啦。

  

S → abE

用符號來描述的話,就是如上形式,這種形式稱之為 S 的產生式。其中 S 表示賦值語句,a 表示一個標示符,b 是“=”符號,E 表示表達式。這里用到了S、a、b、E 四個不同的字母。

等等,似乎還有什么沒說完,因為標示符(字母a表示)與“=”符號(字母b表示)都與 Tokenizer 生成的 Token 對應,但是表達式(字母E表示)卻沒有對應的 Token 呀。

于是,我還要進一步描述表達式。這里為了不讓問題變得過于繁瑣,我先假定表達式只出現加減號和數字。那么表達式的定義如下。

  

E → d | E+d | E-d

這里出現的“|”表示“或”,這表明表達式(字母E)可以展開成三種不同的式子。同時,E 展開后的式子中可能再次出現 E 本身,這種遞歸形式足以涵蓋任意長度的表達式形式。

于是,我們又得到字母 d,d 表示一個數字(也與某種 Token 對應)。

至此,我們一共得到了 S、a、b、E、d 五個不同的字母,其中 a、b、d 都與 Token 對應。然而,雖然 S、E 卻沒有對應的 Token,但它們都有至少有一個屬于自己的產生式。

對于 a、b、d,稱之為終結符。即它們不會再有自己的產生式了。而 S、E,稱之為非終結符

當我們為式子中某個非終結符挑選一個特定的產生式,并用產生式的右邊部分代替這個非終結符在式子中的位置,那么我們將這個過程稱之為非終結符的展開

考慮下面這行代碼:

  

index = 15 + 7 - 3

其形如 abd+d-d(a 為 "index"、b 為"="、d 為"15", "7", "3")

對于 S 有如下展開方式:

  

S → abE

→ abE-d(展開 E → E-d)

→ abE+d-d(展開 E → E+d)

→ abd+d-d(展開 E → d)

其中 S 表示一個賦值語句。既然 S 存在某種展開方式,其形式與這行代碼完全相同,我們說,這行代碼與 S 是匹配的。對于 Parser 而言,即可斷定這行語句是一個賦值語句。

因此,Parser 讀取語言的文法定義。然后,通過找到一個展開方案以匹配源代碼。而這個展開方案中對各個非終結符產生式的選擇過程,即是對源代碼中每一個部分的定性過程。這個過程讓 Parser 能夠理解源代碼各個部分表示的含義,并以此生成對應的語法樹(Syntax Tree)。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64262.html

相關文章

  • 從零開始寫個譯器系列

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

    genedna 評論0 收藏0
  • 從零開始寫個譯器 - LL(1)

    摘要:希臘字母表示空,這個產生式表明非終結符可以產生一個空。此外,對于一個文法之中的非終結符,還有集集的概念。對于一個非終結符而言,它的集指可能展開的各種形式中,位于第一的所有終結符所組成的集合。 上一章中,我說 Parser 的工作就是依據文法定義,找到一個與源代碼匹配的展開方案就可以了。聽起來我們只要先給出一個 tao 語言的文法定義,然后寫一個找匹配方案的的程序就可以了。 然而事情情況...

    Tony 評論0 收藏0
  • 從零開始寫個譯器 - tao 語言的文法定義(下)

    摘要:目前為止我們創建的文件列表新上一章中我們提到了個方法它們可以用來描述非終結符和展開式的形式,那么它們又是如何工作的呢文件中定義了一些方法。特別的,注意如下代碼這個方法可以紀錄被掉的一組非終結符,紀錄這些東西有什么用,將在隨后的章節介紹。 目前為止我們創建的文件列表: |- com.taozeyu.taolan.analysis |- FirstSetConstructor ...

    Michael_Lin 評論0 收藏0
  • 從零開始寫個譯器 - tao 語言的文法定義(上)

    摘要:一個非終結符可以被展開稱為一個串,如上定義便是將這個非終結符展開稱為一個又終結符和非終結符混合而成的串。特別注意我定義的方法僅僅用于修飾非終結符,而非展開式,雖然這個例子中我的方法更靠近方法,但并意味著用于修飾展開式。 各位久等了,本系列在新一年的連載中,形式會加入少許變化。首先,我會將 tao 語言編譯器(以及運行環境)的全部內容貼在 GitHub 上,在閱讀本系列的時候,需要對照 ...

    wuyangchun 評論0 收藏0
  • 從零開始寫個譯器 - 程序流控制

    摘要:從展開式中,可以看出,除了這個非終結符,還有其他一些非終結符。是可能展開的形式之一,在語言中,如下代碼就是一行典型的從表達式來看,它是由一個級表達式和一個類型的非終結符組成。但特別注意結尾的數量詞表明,整個非終結符都是可選的。 目前為止我們創建的文件列表: |- com.taozeyu.taolan.analysis |- FirstSetConstructor |- ...

    huangjinnan 評論0 收藏0

發表評論

0條評論

stormzhang

|高級講師

TA的文章

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