摘要: 國慶7天容易無聊,于是我打算實(shí)現(xiàn)一下以前失敗過的一種語言的特性:類型推導(dǎo)。于是順便做一做惰性計(jì)算吧。于是我嘗試設(shè)計(jì)了一門特性盡可能少的語言,并且強(qiáng)制讓一個函數(shù)的返回值僅跟輸入的參數(shù)有關(guān)。雖然這個特性不適合用來做IO,但是是有辦法解決的,而且不需要修改語言就可以直接支持。
這門語言的定義及其簡單,需要預(yù)先定義的部分也是很少的,于是我嘗試實(shí)現(xiàn)了if、邏輯運(yùn)算符以及itoa和atoi兩個函數(shù)
閱讀全文
posted @
2008-09-28 07:14 陳梓瀚(vczh) 閱讀(2150) |
評論 (4) |
編輯 收藏
摘要: 經(jīng)過三個小時的努力,一個供調(diào)試用的模擬器終于做出來了。對于一份語法說明來講,我們需要提供調(diào)試器,一直到調(diào)試完了才生成代碼,這樣比較容易找到問題。同時為了驗(yàn)證自己的那個設(shè)計(jì),于是做了一個調(diào)試器出來。這個調(diào)試器使用了這篇文章里的數(shù)據(jù)結(jié)構(gòu)文件以及文法文件,以及使用了這篇文章里開發(fā)的一個樹到圖的轉(zhuǎn)換程序,成功得到結(jié)果!
閱讀全文
posted @
2008-09-14 07:22 陳梓瀚(vczh) 閱讀(1838) |
評論 (1) |
編輯 收藏
摘要: 除了錯誤處理文件還沒有定義好以外,現(xiàn)在語法定義跟語法樹的數(shù)據(jù)結(jié)構(gòu)定義以及分析器都完成了!有了這兩個文件,我的工具就可以替你生成一個函數(shù)和一堆類,讓你使用這個函數(shù)就可以將一份代碼轉(zhuǎn)換為一顆語法樹啦。娃哈哈……
現(xiàn)在讓我們來看一個例子
閱讀全文
posted @
2008-09-14 00:53 陳梓瀚(vczh) 閱讀(1424) |
評論 (3) |
編輯 收藏
為了生成編譯器的代碼,對語法樹的數(shù)據(jù)結(jié)構(gòu)進(jìn)行定義是必不可少的一項(xiàng)工作。在這里我設(shè)計(jì)了一套用于生成C++代碼的數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)定義文件的格式。
這份定義支持enum、class和typedef三種命名方法,支持基本類型、C++類型、列表、映射、指針以及智能指針等。因?yàn)榻Y(jié)構(gòu)簡單,所以我直接貼一份示例出來。這份示例用于代表
這篇文章里的科學(xué)計(jì)算器表達(dá)式文法對應(yīng)的語法樹的結(jié)構(gòu)。Expression本應(yīng)是空的,為了對上述的例子進(jìn)行說明,所以那些沒用上的功能就全部加在Expression里面了。
1 enum BinopType
2 {
3 Plus
4 Minus
5 Mul
6 Div
7 }
8 enum SinopType
9 {
10 Negative
11 }
12
13 class Expression
14 {
15 list<int> IntList
16 map<string,int> IntMap
17 Expression^ Autoptr
18 Expression* Pointer
19 "CustomType" Custom
20 }
21 typedef Expression^ ExpPtr
22 class Number
23 {
24 double Number
25 }
26 class Binop
27 {
28 BinopType Operator
29 ExpPtr LeftOp
30 ExpPtr RightOp
31 }
32 class Sinop
33 {
34 SinopType Operator
35 ExpPtr Operand
36 }
列表、映射和智能指針在Vczh Library++ 2.0里都有對應(yīng)的工具來表達(dá),將來生成的編譯器的代碼數(shù)據(jù)結(jié)構(gòu)將依賴于Vczh Library++ 2.0,而語法分析部分則直接使用庫中的Syngram。
posted @
2008-09-12 05:49 陳梓瀚(vczh) 閱讀(1228) |
評論 (0) |
編輯 收藏
摘要: 『啊,蔥爆羊肉真是香啊。』一邊回憶著這個令人感動的美食,一邊心不在焉地寫了個程序。這個小程序?qū)崿F(xiàn)了一個很簡單的功能,將一棵樹轉(zhuǎn)換成bmp圖片并自動排版。
閱讀全文
posted @
2008-09-07 04:18 陳梓瀚(vczh) 閱讀(2878) |
評論 (3) |
編輯 收藏
摘要: 我們知道Yacc和Bison都是產(chǎn)生C++的代碼作為編譯器的前端的。但是有時候我們需要動態(tài)地產(chǎn)生一個編譯器前端,極端一點(diǎn)講,譬如“文法調(diào)試器”。調(diào)試器總不能動態(tài)生成.y文件,讓yacc編譯,讓gcc再度編譯,然后execute,最后將程序的輸出結(jié)果讀進(jìn)來。這樣就太麻煩了,于是我們需要重新寫一個生成編譯器前端的程序。
閱讀全文
posted @
2008-09-06 02:45 陳梓瀚(vczh) 閱讀(2297) |
評論 (3) |
編輯 收藏
摘要: 現(xiàn)在的OOP都提倡將操作與數(shù)據(jù)結(jié)構(gòu)結(jié)合在一起。為什么這里要提出將算法與數(shù)據(jù)結(jié)構(gòu)分開呢?第一個原因是一個算法可能是用來處理一組數(shù)據(jù)結(jié)構(gòu)的。第二個原因是算法并不屬于操作。我們可以借鑒訪問者模式來實(shí)現(xiàn)這個分離,但是這里有一個特別之處:我們要將訪問者模式帶給我們的那個接口實(shí)現(xiàn)得讓我們用起來很漂亮。
閱讀全文
posted @
2008-09-02 04:43 陳梓瀚(vczh) 閱讀(2614) |
評論 (10) |
編輯 收藏
摘要: 大概一年前曾經(jīng)用C++開發(fā)了一個可以在C++中直接寫上下文無關(guān)文法的上下文無關(guān)文法分析器。這玩意兒叫Syngram。Syngram曾經(jīng)做了兩次,第一次做成了用一個類去讀文法文件,后來不爽就改成了直接在C++里面寫的。我弄了一個叫Term的類,重載了一些操作符,于是你可以搞分支、可選、錯誤處理等復(fù)雜的文法推導(dǎo)式。現(xiàn)在打算做一個周邊工具。
閱讀全文
posted @
2008-08-27 05:11 陳梓瀚(vczh) 閱讀(1861) |
評論 (5) |
編輯 收藏
摘要: GUI Preview Demo完成!代碼結(jié)構(gòu)、下載以及注意事項(xiàng)內(nèi)詳。
閱讀全文
posted @
2008-08-25 04:17 陳梓瀚(vczh) 閱讀(20302) |
評論 (18) |
編輯 收藏
摘要: 為了展示Vczh Library++2.0中GUI Framework的強(qiáng)大威力,我制作了一個Regular Expression Debugger。這個軟件可以用來調(diào)試正則表達(dá)式,主要用于檢查正則表達(dá)式語法、觀察表達(dá)式的語法樹以及各種狀態(tài)機(jī)、還有匹配測試等。這個Demo已經(jīng)接近完成。GUI Framework和Demo的代碼將在Demo徹底完成的時候放上來。下面貼圖和創(chuàng)建界面的代碼:
閱讀全文
posted @
2008-08-23 23:18 陳梓瀚(vczh) 閱讀(2096) |
評論 (6) |
編輯 收藏