以鶸ice為例,手擼乙個直譯器(一)明確目標

2022-03-10 21:52:48 字數 2075 閱讀 1922

**位址

# helloworld.ice

print("hello, world")

其實從開始學習編譯原理到現在已經有快半年的時間了,但是其間常常不能堅持看下去龍書(經常三天打魚兩天曬網,更何況每次打魚不到半小時就累得不行又會放下書(笑)),截至到現在只勉強看完了前六章的部分,半年間其它事也沒有做,其實想想上大學已經快兩年了還是一事無成,知識也沒有學到,不免覺得很羞愧。

暑假也要到了,這個學期馬上也要結束了,臨近大二結束之際,還是嘗試著寫一下以前想寫的玩具吧,而本系列就是對這段過程的記錄,也算是對龍書前六部分的乙個小實踐&總結(後面的部分可能看完了我也寫不出什麼東西來)。

其實再寫這個直譯器之前,我是拿lex + yacc + llvm照著tutorial試著拼過乙個編譯器,但是llvm對我來說可能有些太難了(苦笑)。殘破不堪的**在lyli分支上。

這個系列的教程(如果可以算作教程的話),其實主要還是實現了前端部分(一樣有很多bug),而parser早就被研究透了,所以本教程基本上沒有什麼價值,可能唯一具有優勢的地方就是我跟願意看這幾篇文章的讀者大概是相同的入門(或者還未入門)的水平。

本教程分為四章

明確目標 & 設計語言

實現詞法分析器

實現語法分析器

實現基礎資料型別

且希望能達到在讀者閱讀完本系列後,能完成乙個支援以下幾項的直譯器語言

整型、浮點型以及字串型別

常見雙目運算子

變數定義

函式定義及呼叫

基本控制流語句

lambda表示式

對編譯原理感興趣,但是還尚未正式的開始學習

嘗試完成乙個玩具直譯器但不知道如何下手

在正式手擼之前,我們要先確立我們要擼的是個什麼玩意兒(你這不是廢話嗎摔)。畢竟在後期想要增加一些新的騷操作(新特性)的時候,若沒有在一開始進行設計,難免會出現各種重構上令人煩躁的問題(雖然如果你按照本教程擼出來的直譯器必然會帶來重構上各種糟糕的問題,但是重構本身就是一件會帶來各種糟糕的問題的事情(所以就不要介意了)),但是在正式寫**之前進行設計,總是一件應該做的事。

從直譯器角度來說,我們解釋的是字串,在驗證字串滿足規則後進行解釋,在解釋完之後將其按照語義正確執行,而這個規則就是我們ice的語法規則。

從詞法分析器的角度來說,我們解釋是字串,只需要輸入的字串滿足我們為詞素指定的規則,然後根據輸入的字串返回token給語法分析器就可以了。

從語法分析的角度來說,我們解釋的是token序列,且通過**分析法依據token序列選擇正確的產生式並返回抽象語法樹(abstract syntax tree)。

只考慮互動式輸入(即一行一行的輸入)

本專案中主要包含以下幾個類:

好了,基本上結構就是這樣,下面可以著手考慮ice具備怎麼樣的語法了。

整形、浮點型以及字串型別

1

1.0"hello, world"

常見雙目運算子
1 + 1

(100 + 20) * 6 / 3

10 = 10

5 <= 3

變數定義
@a: 1
函式定義及呼叫
@add(a, b): a + b

@mul(a, b)

mul(mul(2, 3), add(2, 3))

基本控制流語句
@fib(n)

else

}fib(10) # 89

@a: 3

while a

@a: 0

do print(a)

} while a < 5

for 1 to 5

print(a)

}

lambda表示式
@add(a, b): a + b

@mul: @(a, b)

@(a, b)(9, 3)

@quadraticsum: @(a, b)

return @(a, b)(sqrt(a), sqrt(b))

}

基本上就是這樣,那麼如果你還繼續打算看的話,下一章將會開始手擼ice的詞法分析器。

純手擼乙個rnn

原文 import copy,numpy as np np.random.seed 0 sigmoid函式 def sigmoid x output 1 1 np.exp x return output sigmoid導數 def sigmoid output to derivative outpu...

手擼乙個簡陋直播系統

目錄2.nginx rtmp module 3.安裝第乙個直播系統 2.修改配置 3.推流 4.拉流 4.rtm高階 5.ffmpeg 1.nginx概述和作用 2.安裝nginx 安裝 3.nginx 配置 4.配置變數 語法 set var name value set a hello worl...

發布乙個npm包 以angular為例

做前端的同學和npm打交道的次數可不算少,npm上有許多好用的庫可以幫我們節省很多時間,那麼今天我們就嘗試發布乙個angular元件到npm上。首先,我們來建立乙個angular專案,不同於平時我們使用 來建立專案,我們本次使用 ng g library npm klx lib prefix myp...