搜尋結果
一、簡介. 相信每個 programmer 都跟西杰一樣想過設計一種自己的編程語言,最近西杰就有機會要寫一個編譯器了。. 雖然在大學時已經讀過如何編寫一個編譯器,但要認真寫起上來還真的不容易,而且網上教寫編譯器的教材不多(尤其中文的),所以就把這次經驗 ...
2024年8月26日 · 西傑在開發過程中經常參考 Actionscript 編譯器的 source code(用Java 寫的),大家有興趣可以看看這裡(在 /trunk/modules/asc 裡), 是 open source 的 在這個教程中,西傑將會使用 Javascript 來開發,原因有二。
現在要開始實現功能了,首先要有 register 以記下數據,這個西傑會用一個 array 來做,$0 指向 array 第 0 個元素,$1 指向第 1 個元素,如此類推。 然後我們要寫兩個 method 來 get set register 的數據,如果那個 register 未被使用過的話,它的數據就會是 0。
其他人也問了
什麼是本地編譯器?
編譯器和直譯器有什麼差別?
第一個編譯器是誰發明的?
為什麼編譯器越來越複雜?
翻譯筆和翻譯機哪個好?
什麼是編譯?
- 不可重複定義變數
- 自動初始化變數
- 變數要先定義後使用
- 變數類型檢查
- 總結
開始吧,第一步要做的事是要修改一下 Parser ,因為我們做 semantic analysis 是會把一整棵 Parse tree 讀進來,所以我們需要在建立 Parse tree 時記下那些 node 是哪一行建立出來的,那樣我們匯報錯誤時才可以告訴開發人員哪一行出錯,因此就有了以下的修改: 在 base class “Node”添加一個 method 來記錄行數。之後在每次建立新 node 時都要加上一句 現在可以開始寫 Analyser 了,先看代碼後解說。 Analyser 暫時有三個 method,第一個是 evaluateExpressionBlockNode ,它要做的工作很簡單,只是純綷把它其下的所有 expression 都遍歷一次,並執行 evaluateExpres...
下一步是自動初始化變數,這一步應該放在 Parser 中做還是在 semantic analysis 才做,其實都可以,不過西傑認為這應該屬於 Wescript 的特性之一,所以就放在 semantic analysis 才做。 其實就是改寫了一下最底的那一小段,如果有 initExpressionNode的話就 evaluate 一下,否則我們就要自行建立相應的預設數值 node 了(當然,這些是 compiler 建立的就不用再 evaluate 了)。
接下來我們就要檢查一下是不是所有變數都先被定義過然後才被使用。 技巧照舊,同樣是使用 hash map 來檢查就可以了,沒有難度吧。看看運行結果: 注意,有數個 method 上面沒有解說的,因為它們的做法都很普通,跟之前沒有太大分別,所以就不在此著墨了。
最後是檢查變數類型,這個比較複雜,我們一步一步來吧。首先要定義兩個常數用來分辨變數的類型: 然後我們就要在 evaluate 時為某些 node 賦予類型了,首先是 IntNode 和 BoolNode ,很明顯地它們分別是 integer 和 boolean類型了。 另外是 compound node,現在先做一個較簡單的版本,並未處理有運算符的情況: 這裡假設 compound node 裡沒有運算符,並只有一個數值,我們就可以得出以上代碼。 還有 identifier node ,我們也要為它們賦予類型,所以要改寫一下原本的 evaluateIdentifierNode。 最後我們要改寫 evaluateVariableNode,加入變數類型檢查。 在 initialise 時,我們會...
語意分析( Semantic analysis )到此算是完了,大家學到了什麼呢?其實這一章的編寫風格跟上一章寫 Parser 真的差不多,都是一堆 mutual recursion 湊合起來,組合成一個強大的分析器。現在大家可算是過了最艱難的時刻了,接下來的幾章都應該比較簡單(或者可能是因為大家都認識了這種編寫方法了吧),大家請緊記熟讀這前幾章,打好基礎,咱們下禮拜再來。
編譯語言(英語:Compiled language)是一種程式語言類型,通過編譯器來實作。. 它不像直譯語言一樣,由直譯器將程式碼一句一句執行,而是以編譯器,先將程式碼編譯為機器碼,再加以執行。. —維基百科〈編譯語言〉. C++ 是一種編譯語言。. 也就是說,一份 ...
編譯器將原始程序(source program)作為輸入,翻譯產生使用目標語言(target language)的等價程序。. 源代碼 一般為高階語言(High-level language),如Pascal、C、C++、C# 、Java等,而目標語言則是匯編語言或目標機器的目標代碼(Object code),有時也稱作 機器代碼 ...
製作某種語言的第一個能編譯器,要麼需要用其它語言來編寫,要麼就像Hart和Levin製作Lisp編譯器那樣,用直譯器來執行編譯器。 教學用的編譯器 [ 編輯 ]