青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

歲月流轉(zhuǎn),往昔空明

C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
  118 Posts :: 3 Stories :: 413 Comments :: 0 Trackbacks

4.從語法樹到OP CODE

知道咱們的虛擬機能夠執(zhí)行OP CODE之后,下一步就要考慮,怎么從語法樹里面生成咱們需要的OP CODE了。簡單來講,語法樹就是將程序的邏輯按照樹狀組織并保存在內(nèi)存中的一種形式。有關(guān)于更詳細的信息,搜“Syntax Tree”,到處都是解釋。

一時不明白也沒關(guān)系,我們來看一個直觀的例子。考慮a+b這樣一個基本形式的表達式。這個表達式既可以按照我們所寫的這樣,分為a,+,b三個部分串行表示,也可以表示成下圖的樣子



可能一個表達式你還看不出來樹形的優(yōu)勢。要是表達式級聯(lián)起來,就顯示出這種表示的威力了:


 
這樣一個語法樹,可以不借助任何別的手段,保存了表達式的優(yōu)先級關(guān)系。這里的語法樹表示的就是(A+B)*C的表達式。同時,在語法樹上求值也很方便,后根遍歷語法樹就可以了。即先算出左右節(jié)點的值,再根據(jù)當(dāng)前節(jié)點符號求出當(dāng)前節(jié)點值。

王陽明說,知行合一。知道了語法樹是什么東西,我們就要開始考慮怎么用了。“怎么用”這個問題可以分成兩個部分,第一,語法樹怎么實現(xiàn)。第二,語法樹怎么生成op code。啊,先不要把語法樹想象的這么復(fù)雜。在這里,我們的運算符只有加號,一個加號也只能帶兩個int的值節(jié)點,而不能遞歸的帶上一個符號節(jié)點。也就是說,這棵樹只可能有一種形式而已。

首先來解決語法樹怎么實現(xiàn)的問題。在這個問題上,我們只需要把握一點,語法樹是一個天然的composite模式。我們用一個UML來看看這個只有加法算符的語法樹定義:
 
唔,很簡潔,不是么。Node_type是一個syntax_node_types類型的枚舉,這個枚舉告訴以后的代碼生成器這個抽象的node究竟是個什么類型,然后代碼生成器再還原它原本的類型并生成適當(dāng)?shù)拇a。op是一個operators類型的枚舉,表示一個二元運算的操作符。對于本例,只有operators::add可用。
在有了基本實現(xiàn)之后,再考慮一下其它需求,例如語法樹節(jié)點類型之間的可能存在的循環(huán)依賴問題,語法樹的深淺拷貝問題,等等,最終SASL的語法樹節(jié)點接口是這樣的:

 1 struct node{
 2     syntax_node_types type;
 3     template <typename NodeT> NodeT* clone() const;
 4     template <typename NodeT> NodeT* deepcopy() const;
 5 protected:
 6     virtual node* clone_impl() const = 0;
 7     virtual node* deepcopy_impl() const = 0;
 8 };
 9 
10 struct binary_expression: public node{
11     operators op;
12     boost::shared_ptr<constant> left_expr;
13     boost::shared_ptr<constant> right_expr;
14 };
15 
16 struct constant: public node{
17     int val;
18 };

道理復(fù)雜,不過實際上,并沒有那么復(fù)雜吧?
下面來解決第二個問題:怎么用表達式樹產(chǎn)生代碼?我不多解釋,直接上代碼,相信你一定會看明白的:

1 vm_codegen& vm_codegen::emit_expression( const binary_expression& expr ){
2     if ( expr.op != operators::add ){ return *this; }
3     int c0 = expr.left_expr->val;
4     int c1 = expr.right_expr->val;
5     ins_.push_back( instruction( op_loadrc, r0, c0 ) );
6     ins_.push_back( instruction( op_loadrc, r1, c1 ) );
7     ins_.push_back( instruction( op_add, r0, r1 ) );
8     return *this;
9 }


然后我們將生成語法樹,生成code,運行code的代碼補上,運行,OK~
你一定會說,啊,硬性綁定寄存器!太可怕了!如果表達式復(fù)雜了該怎么辦呢?呵呵。這些都是以后的問題了。以后的問題,就由以后的我們?nèi)ソ鉀Q好了。今日事,今日畢,時間不早,咱們還是洗洗睡了。

posted on 2009-12-11 10:04 空明流轉(zhuǎn) 閱讀(1965) 評論(3)  編輯 收藏 引用

評論

# re: 實用編譯器構(gòu)建指南(二) 2009-12-11 11:09 正心
你為什么非要把代碼里帶上boost  回復(fù)  更多評論
  

# re: 實用編譯器構(gòu)建指南(二) 2009-12-11 11:34 空明流轉(zhuǎn)
@正心
沒明白你什么意思。。。  回復(fù)  更多評論
  

# re: 實用編譯器構(gòu)建指南(二) 2009-12-12 02:01 陳梓瀚(vczh)
@空明流轉(zhuǎn)
就是說為什么不using namespace boost;

話說,syntax_node_type type;是evil  回復(fù)  更多評論
  


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美在线短视频| 国产手机视频精品| 亚洲午夜精品一区二区| 亚洲乱码精品一二三四区日韩在线 | 国产欧美日本一区视频| 久久久久久久久蜜桃| 亚洲午夜一级| 亚洲理伦在线| 欧美日韩综合一区| 久久精品亚洲精品| 妖精视频成人观看www| 久久久久久久一区二区三区| 亚洲国产日韩在线| 亚洲承认在线| 激情欧美丁香| 黑人巨大精品欧美黑白配亚洲| 性久久久久久久久| 亚洲免费视频网站| 一区二区免费看| 亚洲视频二区| 亚洲校园激情| 亚洲欧美日韩成人| 亚洲性感激情| 可以看av的网站久久看| 欧美在线1区| 嫩模写真一区二区三区三州| 麻豆精品传媒视频| 欧美日韩国产成人在线| 欧美日韩国产不卡| 国产精品尤物| 红桃av永久久久| 欧美激情在线狂野欧美精品| 蜜桃精品一区二区三区| 久久久久久久综合狠狠综合| 欧美激情二区三区| 亚洲一区二区三区欧美| 蜜桃av一区| 国产精品一区亚洲| 亚洲国产欧美一区| 亚洲女人av| 9久re热视频在线精品| 久久网站热最新地址| 国产精品色午夜在线观看| 亚洲第一区在线观看| 亚欧成人精品| 一区二区三区四区国产精品| 巨胸喷奶水www久久久免费动漫| 欧美性理论片在线观看片免费| 国产精品一卡| 亚洲一区二区成人在线观看| 欧美电影资源| 久久久久成人精品| 国产伦精品一区二区三区| 一本色道久久综合亚洲精品婷婷| 久久久精品国产99久久精品芒果| 亚洲男女自偷自拍| 欧美日韩1区2区| 一区二区欧美日韩| 亚洲国产精品久久精品怡红院| 亚洲一区精品在线| 国产丝袜一区二区三区| 欧美在线日韩精品| 欧美影院午夜播放| 亚洲成人中文| 亚洲国产精品一区在线观看不卡| 香蕉成人伊视频在线观看| 亚洲精品国产日韩| 裸体一区二区| 亚洲综合999| 久久久综合香蕉尹人综合网| 亚洲福利视频一区| 亚洲欧洲一区二区天堂久久| 欧美天天影院| 美国三级日本三级久久99| 欧美日本韩国一区| 久久中文在线| 欧美午夜精品久久久久免费视 | 欧美成人黄色小视频| 亚洲九九爱视频| 一区二区三区精品视频在线观看| 免播放器亚洲一区| 性做久久久久久久免费看| 久久只精品国产| 久久成人国产| 欧美日韩成人激情| 欧美大片网址| 国产视频一区欧美| 一区二区三区欧美亚洲| 日韩一二三区视频| 欧美成人69av| 亚洲福利一区| 精品福利电影| 乱中年女人伦av一区二区| 欧美一区二区三区久久精品| 欧美日韩国产综合视频在线| 亚洲国产一区二区三区在线播| 激情一区二区三区| 亚洲一区二区视频在线观看| 久久国内精品视频| 可以免费看不卡的av网站| 国产精品无人区| 一二美女精品欧洲| 亚洲无限乱码一二三四麻| 欧美日韩视频免费播放| 夜夜嗨av一区二区三区网页| 亚洲国产精品一区二区第四页av| 麻豆国产va免费精品高清在线| 看欧美日韩国产| 亚洲色图在线视频| 国产精品一区二区三区观看| 欧美在线你懂的| 欧美国产第一页| 亚洲资源在线观看| 在线观看成人网| 欧美午夜无遮挡| 噜噜噜在线观看免费视频日韩| 亚洲国产综合在线看不卡| 亚洲免费视频成人| 国产综合久久| 国产精品一区二区男女羞羞无遮挡 | 亚洲黄色有码视频| 亚洲欧美国产毛片在线| 国产一区二区| 国产精品亚洲精品| 欧美激情第五页| 久久久亚洲人| 亚洲一区尤物| 亚洲午夜在线视频| 亚洲人成毛片在线播放| 欧美11—12娇小xxxx| 欧美在线视频一区| 久久精品国产精品亚洲精品| 老司机免费视频一区二区| 亚洲男人的天堂在线| 亚洲视频精品| 亚洲少妇自拍| 性欧美大战久久久久久久久| 亚洲欧美成人综合| 久久国产精品一区二区三区四区| 亚洲欧美国产制服动漫| 久久久91精品国产一区二区精品| 欧美在线网址| 美女精品国产| 亚洲伦理一区| 欧美在线播放| 欧美成年人在线观看| 欧美精品福利视频| 国产精品露脸自拍| 亚洲国产日韩一区二区| 亚洲欧美国产日韩天堂区| 牛人盗摄一区二区三区视频| 亚洲美女视频网| 欧美在线观看一区二区三区| 欧美大片免费看| 国产一区视频观看| 一区二区三区精品视频在线观看| 久久国产精品黑丝| 亚洲娇小video精品| 欧美综合77777色婷婷| 欧美激情区在线播放| 激情综合电影网| 亚洲欧美视频在线观看| 亚洲高清免费| 久久久久久久久久看片| 欧美色精品天天在线观看视频 | 国产视频在线观看一区二区三区| 亚洲高清不卡一区| 午夜一区二区三区在线观看| 亚洲国产精品高清久久久| 久久免费精品视频| 欧美在线你懂的| 久久久www成人免费毛片麻豆| 欧美一区二区成人| 99国产欧美久久久精品| 久久在线免费| 亚洲精品一区中文| 欧美高清视频在线| 欧美二区乱c少妇| 亚洲日本成人| 欧美激情免费观看| 欧美黄色片免费观看| 一本色道**综合亚洲精品蜜桃冫 | 欧美三级第一页| 日韩性生活视频| 亚洲一区二区成人在线观看| 国产女优一区| 欧美韩日视频| 国产精品qvod| 免费在线看一区| 欧美日韩一区成人| 亚洲免费影视| 老**午夜毛片一区二区三区| 在线综合视频| 欧美一区二区高清在线观看| 亚洲欧洲精品一区| 亚洲免费在线精品一区| 在线观看欧美日韩国产| 亚洲天堂成人在线视频| 在线观看国产一区二区| 亚洲午夜未删减在线观看|