我的第乙個直譯器 scheme

2021-06-10 21:02:06 字數 1467 閱讀 7170

scheme是這個暑假弄的,實現了一下它的基本框架

我的實現比較學術,畢竟是看了編譯原理的前5章,之後弄的,所以思路簡潔清晰!

q:scheme是什麼?

a:scheme是mit人工智慧實驗室開發的一種lisp方言,一種用括號包圍的語言

q:為什麼是scheme?

q:我的直譯器用的是怎樣的分段開發?

a:lexer(詞法分析) -> parser(語法分析,建樹) -> interpret(解釋部分)

q: lexer和parser是用工具還是手工?

a:手工,還是覺得要手寫**,才好掌握些,當然有手寫**滿足的意圖

q:期間有什麼困難?

a:困難還是在如何建樹!! 

0.正常情況=>   (+ 1 2) 

/    \

1       2

1."非正常"情況  =>  (define (funcchooser n)

(if (= n 0) +

-))這裡定義了乙個funcchooser定義到底選擇哪種方法,是的,方法可以被當做資料傳遞,那麼我們使用選擇器來使用運算方法時,即

( (funcchooser 0) 1 2)

這時候建樹該如何建?一般建樹方法是不能滿足!

特別鳴謝我的好**marine,他拯救了我,給了我乙個好的建樹方法!

新增兄弟節點的辦法!!!(下樹中  "o"代表空節點)o l

o  --> 1  --> 2

| funcchooser --> n

這樣既優美,又能遞迴地求值! 先求出操作符,再應用於運算元,返回上節點!

q:如何儲存資料?

a:環境!每個運算都基於環境,環境中擁有操作符的資訊,擁有值等等,但是它們的本質都是名字-資料,所以用符號表實現環境!

q:那麼初始的環境中有什麼資訊?

a:初始環境中存在基礎資料運算子,和邏輯符號

q:scheme的資料名字有什麼限制?

a:恩....它的名字的限制很小,不過不能是全數字,還有一些你都看不過去的方式。我的實現裡初始環境中的+,-等符號,其實也和使用者自己定義的級別一樣,即你可以通過

(define + -)  將+重定義到-,因為運算的本質就是環境!+,-,*只是名字,你可以(define + 加)  只要你覺得爽!

q:運算的本質是環境是什麼意思?

我的實現裡並不因為現在的操作影響到以前的意圖,不過這畢竟是仁者見仁,智者見智的,不能說優劣

>> (define (add) (+ 1 2))

>> (add)

3    (當add是使用正常的+時)

>> (define + -)

>> (add)

3   (因為add繫結著+符號最初的意義,所以即使現在我修改+,當年的add依然不會受到影響)

********************===2012.11.11(亞馬遜滿300減150,我擦!!)******************************===

我的第乙個程式

我的第乙個vc程式終於寫完了,花了2周,之前從沒有用vc寫過程式,也沒讀過什麼程式,只是在看書,看了幾百頁 mfc windows程式設計 正好有個機會,老師讓寫個vc程式,就試著寫了。程式的功能是不同地方的access的更新的記錄整合到一台機子上的access中,支援斷網自動連線,用的是socke...

我的第乙個部落格

我是乙個有點脫離時代的年輕人,沒有iphone,不玩微博,沒有崇拜的明星,不是任何人的粉絲。前幾天我的乙個領導告訴我,應該多總結,可以開個微博,把記錄的東西時不時拿出來複習一下,慢慢就會積累出很多財富。所以我開了第乙個部落格,當然遠不如微博那麼新潮。我想感謝我的這位領導,在我的職業生涯中,他是我的領...

我的第乙個c

上機內容 c 程式的編寫和執行 上機目的 掌握簡單c 程式的編輯 編譯 連線和執行的一般過程 我的程式 cpp view plain copy print?程式的版權和版本宣告部分 檔名稱 test.cpp 作 者 徐威楊 完成日期 2014 年 10 月 28 日 版 本 號 v1.0 對任務及求...