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

資訊專欄INFORMATION COLUMN

從零開始寫個編譯器吧 - tao語言的詞法分析器(Tokenizer)的類型定義

qpal / 1152人閱讀

摘要:要為語言設(shè)計(jì)詞法分析器,首先得知道語言是一種什么樣的語言。,不過首先我們得把詞法分析器能生成的單詞類型定義好了。

要為 tao 語言設(shè)計(jì)詞法分析器,首先得知道 tao 語言是一種什么樣的語言。不過呢,我腦海里還沒有 tao 語言具體形象。我還是先貼一段 tao 語言的代碼,大概展示下這是怎么回事吧。

def say_hello_world(who) 
    print “hello world ” + who 
end 
var name = “tao” 
say_hello_world name 
#我是注釋,注釋是這樣寫的

看起來可能是這個樣子。這個系列中的 tao 語言我會采取一邊寫編譯器,一邊設(shè)計(jì)的形式。細(xì)節(jié)在之后的章節(jié)會逐步補(bǔ)充完整。本章只是些詞法分析器,因此不必了解太多細(xì)節(jié)(也不必設(shè)計(jì)出來)。因此,tao語言的概念也暫時止步于此不作細(xì)節(jié)上的討論。

OK,不過首先我們得把詞法分析器能生成的單詞類型定義好了。嗯,我想想,顯然一個語言至少要這么幾種類型嘛。

關(guān)鍵字(Keyword)

符號(Sign)

標(biāo)示符(Identifier)

其中關(guān)鍵字和符號很好理解,標(biāo)示符,則具體而言,就是用戶定義的變量、函數(shù)定義中的函數(shù)名和參數(shù)名、被調(diào)用函數(shù)的函數(shù)名等等這些東西。

嚴(yán)格來說,僅由數(shù)字、英語字母、下劃線的字符串(可以以"?"、"!"為結(jié)尾,但不能以數(shù)字為開頭),如果沒有被關(guān)鍵字占用,則統(tǒng)統(tǒng)稱之為標(biāo)示符。其正則表達(dá)式形如:

  

^[a-zA-Z_][0-9a-zA-Z_]*[!?]?$

當(dāng)然,關(guān)鍵字的形式和標(biāo)示符是一樣的(至少要滿足標(biāo)示符的正則表達(dá)式定義)。

然后,數(shù)據(jù)類型也要有:

數(shù)字類型(Number)

字符串(String)

正則表達(dá)式(RegEx)

其中數(shù)字類型的形式和標(biāo)示符的形式極為類似,不同點(diǎn)在于,數(shù)字類型要求必須以數(shù)字開頭(當(dāng)然結(jié)尾不可以接"?"和"!")這兩個符號啦。其正則表達(dá)式形如:

  

^[0-9][0-9a-zA-Z_]*$

如此以來數(shù)字類型就和傳統(tǒng)意義上的數(shù)字不一樣了。形如"110police"也會被當(dāng)做數(shù)字。此外,像3.14這種實(shí)數(shù)卻不會被當(dāng)作數(shù)字。嗯,這的確是問題,但是我不想在現(xiàn)在就解決這個問題,暫時不管啦,請先無視~~~。

另一個是正則表達(dá)式的定義,tao 語言中將 ` 符號置于兩端來表示正則表達(dá)式。(什么,找不到這個符號,嗯,這個符號在“1”的左邊,直接按下即可打出。)為什么用這個符號而不用 / 分開呢,猜一猜為什么呢?嗯,真正開始編碼的時候揭示答案吧。

再然后,這些對編譯器意義不大,但還是有點(diǎn)用處的類型:

注釋(Annotation)

空格(Space)

回車(NewLine)

其中注釋以 # 開始,單行注釋。

最后的最后,還有一個類型是必須:

終止符(EndSymbol)

這個類型不對應(yīng)任何程序員可輸入的形式,實(shí)際上,詞法分析器會在解析完所有源代碼之后,自動以一個該類型的單詞結(jié)尾。這個類型是專門給語法分析器(Parser)使用的。

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

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

相關(guān)文章

  • 從零開始寫個譯器 - Token.java 文件編寫

    摘要:現(xiàn)在,讓我們來動手寫編譯器的第一個個文件吧。如其名字所示,這個類實(shí)例化的對象用于表示詞法分析器的產(chǎn)物。我希望詞法分析器從源代碼中提取出語素,并根據(jù)上下文推測出單詞類型,從而構(gòu)造出對象。只需要構(gòu)造出類型即可,進(jìn)一步細(xì)分將在的構(gòu)造函數(shù)中進(jìn)行。 現(xiàn)在,讓我們來動手寫編譯器的第一個個java文件吧。本章要寫的類,是Token類。如其名字所示,這個類實(shí)例化的對象用于表示詞法分析器 Tokeniz...

    Eirunye 評論0 收藏0
  • 從零開始寫個譯器 - Parser 語法析器

    摘要:這樣的程序或稱工具有很多現(xiàn)成的可供選擇包括在平臺上可用的,但既然我這個系列叫做從零開始寫個編譯器吧,那顯然如果我用現(xiàn)成的工具,那是犯規(guī)行為。 Parser(語法分析器)的編寫相對于 Tokenizer (詞法分析器)要復(fù)雜得多,因此,在編寫之前可能也會鋪墊得更多一些。當(dāng)然,本系列旨在寫出一個編譯器,所以理論方面只會簡單介紹 tao 語言所涉及的部分。 之前的幾章中,我純手寫了tao 語...

    fai1017 評論0 收藏0
  • 從零開始寫個譯器系列

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

    genedna 評論0 收藏0
  • 從零開始寫個譯器 - 詞法析器是一個狀態(tài)機(jī)

    摘要:詞法分析器本身就是一個狀態(tài)機(jī),生成這個狀態(tài)機(jī)有很多種方法,而我打算采取手寫的方式。狀態(tài)機(jī)不斷從源代碼即一個字符串中讀入一個一個字符,讀到不同的字符將使?fàn)顟B(tài)機(jī)的狀態(tài)從一個狀態(tài)變化到另外一個狀態(tài)。 詞法分析器 Tokenizer 本身就是一個狀態(tài)機(jī),生成這個狀態(tài)機(jī)有很多種方法,而我打算采取手寫的方式。因?yàn)?tao 語言的詞法還是相對比較簡單的,手寫不成問題。 先新建一個LexicalAna...

    calx 評論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條評論

qpal

|高級講師

TA的文章

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