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