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

要爲 tao 語言設計詞法分析器,首先得知道 tao 語言是一種什麼樣的語言。不過呢,我腦海裏尚未 tao 語言具體形象。我仍是先貼一段 tao 語言的代碼,大概展現下這是怎麼回事吧。程序員

def say_hello_world(who) 
    print 「hello world 」 + who 
end 
var name = 「tao」 
say_hello_world name 
#我是註釋,註釋是這樣寫的

看起來多是這個樣子。這個系列中的 tao 語言我會採起一邊寫編譯器,一邊設計的形式。細節在以後的章節會逐步補充完整。本章只是些詞法分析器,所以沒必要了解太多細節(也沒必要設計出來)。所以,tao語言的概念也暫時止步於此不做細節上的討論。正則表達式

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

  • 關鍵字(Keyword)
  • 符號(Sign)
  • 標示符(Identifier)
  • 其中關鍵字和符號很好理解,標示符,則具體而言,就是用戶定義的變量、函數定義中的函數名和參數名、被調用函數的函數名等等這些東西。

嚴格來講,僅由數字、英語字母、下劃線的字符串(能夠以'?'、'!'爲結尾,但不能以數字爲開頭),若是沒有被關鍵字佔用,則通通稱之爲標示符。其正則表達式形如:編碼

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

固然,關鍵字的形式和標示符是同樣的(至少要知足標示符的正則表達式定義)。code

而後,數據類型也要有:字符串

  • 數字類型(Number)
  • 字符串(String)
  • 正則表達式(RegEx)

其中數字類型的形式和標示符的形式極爲相似,不一樣點在於,數字類型要求必須以數字開頭(固然結尾不能夠接'?'和'!')這兩個符號啦。其正則表達式形如:編譯器

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

如此以來數字類型就和傳統意義上的數字不同了。形如"110police"也會被當作數字。此外,像3.14這種實數卻不會被看成數字。嗯,這的確是問題,可是我不想在如今就解決這個問題,暫時無論啦,請先無視~~~。編譯

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

再而後,這些對編譯器意義不大,但仍是有點用處的類型:

  • 註釋(Annotation)
  • 空格(Space)
  • 回車(NewLine)
  • 其中註釋以 # 開始,單行註釋。

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

  • 終止符(EndSymbol)

這個類型不對應任何程序員可輸入的形式,實際上,詞法分析器會在解析完全部源代碼以後,自動以一個該類型的單詞結尾。這個類型是專門給語法分析器(Parser)使用的。

相關文章
相關標籤/搜索