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

隨筆-341  評(píng)論-2670  文章-0  trackbacks-0

手把手教你寫(xiě)腳本引擎(五)——簡(jiǎn)單的高級(jí)語(yǔ)言(3,符號(hào)表)

 

陳梓瀚

華南理工大學(xué)軟件本科05級(jí)

vczh@163.com

http://m.shnenglu.com/vczh/

 

符號(hào)表的結(jié)構(gòu)的復(fù)雜度跟語(yǔ)言的語(yǔ)義規(guī)則的復(fù)雜度有關(guān)。對(duì)于C#來(lái)說(shuō),每一個(gè)符號(hào)都附帶了一大堆信息,譬如位置啦,所在的namespace啦,類(lèi)型啦什么的。對(duì)于JavaScript來(lái)說(shuō),符號(hào)表幾乎是不需要的,因?yàn)闁|西都動(dòng)態(tài)了,編譯時(shí)幾乎不檢查內(nèi)容。語(yǔ)義分析的輸出是符號(hào)表,代碼生成的輸入是符號(hào)表和語(yǔ)法樹(shù)。因此語(yǔ)法樹(shù)除了放語(yǔ)法相關(guān)的內(nèi)容,語(yǔ)義相關(guān)的內(nèi)容最好放到符號(hào)表里面(譬如說(shuō)表達(dá)式的類(lèi)型啦,語(yǔ)句的scope結(jié)果啦)。關(guān)于一個(gè)現(xiàn)實(shí)中的符號(hào)表組織可以看CMinus的語(yǔ)義分析結(jié)果

 

首先我們要解決類(lèi)型的表達(dá)問(wèn)題。一門(mén)復(fù)雜的語(yǔ)言的類(lèi)型有很多種。這里的種類(lèi)指的不是intstring的區(qū)別,而是函數(shù)類(lèi)型、結(jié)構(gòu)類(lèi)型這種區(qū)別。每一種類(lèi)型還有很多附帶的屬性。在語(yǔ)義分析的過(guò)程中,我們經(jīng)常要比較兩個(gè)類(lèi)型是否一致。于是符號(hào)表的類(lèi)型表達(dá)要設(shè)計(jì)成易于讀取、修改和比較。

 

我們通常由兩種解決方法。第一種方法是用一個(gè)繼承結(jié)構(gòu)來(lái)表達(dá)。定義一個(gè)基類(lèi)TypeBase,然后底下一堆繼承。乍一看很OOP,實(shí)際不然。語(yǔ)義分析的時(shí)候我們對(duì)每一種特殊的類(lèi)型都有一些特殊的操作,我們還是舉那個(gè)判斷類(lèi)型是否相等的操作來(lái)說(shuō)明一下。我們知道OOP里面的虛函數(shù)解決了一維的分派問(wèn)題。我們拿到一個(gè)Base,對(duì)Base->Method求值,總是可以根據(jù)Base的實(shí)際類(lèi)型來(lái)求值。如果我們需要對(duì)兩個(gè)類(lèi)型同時(shí)進(jìn)行分派呢?譬如說(shuō)Equal(Base1,Base2),這種操作當(dāng)且僅當(dāng)Base1Base2的實(shí)際種類(lèi)相同才有比較的意義。這個(gè)時(shí)候我們改造成Base1->Equal(Base2)的話(huà),也是免不了對(duì)Base2進(jìn)行一下dynamic_cast還是什么類(lèi)似的操作的。

 

所以我個(gè)人比較偏向于第二種做法。我們?yōu)槊恳粋€(gè)類(lèi)型創(chuàng)建一個(gè)唯一ID。譬如說(shuō)int 0啦,int(int,int)1啦,int*2什么的。比較兩個(gè)類(lèi)型是否相等就直接拿ID去比較,ID相等則類(lèi)型相等,ID不相等則類(lèi)型不相等。在實(shí)際操作上怎么做呢?我們知道語(yǔ)義分析的過(guò)程中會(huì)產(chǎn)生出一堆(理論上可以為無(wú)窮多的)新類(lèi)型。每一種類(lèi)型都有一些屬性。譬如說(shuō)基本類(lèi)型是有限的,可以用enum來(lái)表達(dá)。而函數(shù)類(lèi)型需要返回值和參數(shù)類(lèi)型表。于是我們拿屬性去要一個(gè)ID的時(shí)候,符號(hào)表首先檢查這個(gè)類(lèi)型是否已經(jīng)存在,存在則返回對(duì)應(yīng)的ID,不存在則創(chuàng)建一條新的記錄,然后綁定一個(gè)新的ID。譬如CMinus的類(lèi)型表采用如下接口分配ID

 

class VL_CMinusTypeTable : public VL_Base

{

public:

VInt GetPrimitiveType(VLE_CMinusPrimitiveType Type);

VInt GetPointer(VInt Type);

VInt GetArray(VInt Type , VInt Count);

VInt GetFunction(VInt ReturnType , VL_List<VInt , true>& ParameterTypes);

VInt CreateStruct();

VL_CMinusTypeSlot* GetType(VInt Type);

};

 

如果我們已知一個(gè)類(lèi)型的ID,求其指針類(lèi)型的ID,就調(diào)用GetPointer(TypeID)。經(jīng)過(guò)這一套函數(shù)的處理,我們總是可以不用擔(dān)心是否在什么地方讓兩個(gè)ID指向了相同的類(lèi)型,或者一個(gè)類(lèi)型不小心擁有了多個(gè)ID,十分好管理。

 

第二個(gè)問(wèn)題就是要保存每一個(gè)表達(dá)式的類(lèi)型和語(yǔ)句的Scope了。我不建議將這些信息保存在語(yǔ)法樹(shù)里面。原因比較復(fù)雜,因?yàn)橐环荽a在不同的上下文中可能有不同的意思,然后我們有一天突然有需要將這些環(huán)境中的這份代碼的語(yǔ)義分析結(jié)果保留下來(lái)的話(huà),如果東西原本是存在語(yǔ)法樹(shù)里面的,那就完蛋了,只能去復(fù)制語(yǔ)法樹(shù)了。于是我建議將語(yǔ)法分析得不到的信息通通存進(jìn)符號(hào)表。因?yàn)楸磉_(dá)式和語(yǔ)句都是指針,我們只需要一些map就可以將表達(dá)式和語(yǔ)句的附加信息存起來(lái)了。

 

第三個(gè)問(wèn)題是scope。一個(gè)變量或參數(shù)的作用范圍是有限的,于是我們只好創(chuàng)建一個(gè)scope樹(shù),其中每一個(gè)節(jié)點(diǎn)都看得到父節(jié)點(diǎn),至于能不能看到子節(jié)點(diǎn)我覺(jué)得是無(wú)所謂的。于是對(duì)于一個(gè)具體的scope來(lái)說(shuō),一個(gè)scope就變成了一個(gè)鏈表,保存了當(dāng)前scope的所有符號(hào)名,然后還能知道直接或間接的父scope。下面舉個(gè)直觀的例子。假設(shè)我們有代碼:

 

int A=0;

int B(int C,int D)

{

  int E=0;

}

 

為了處理這份代碼,我們建立了三個(gè)scope。第一個(gè)是全局scope,記錄了AB。第二個(gè)是函數(shù)scope,記錄了CD。第三個(gè)是屬于語(yǔ)句的一個(gè)scope,記錄了E。于是我們用一個(gè)鏈表把他們串起來(lái):語(yǔ)句scope -> 函數(shù)scope -> 全局scope

 

這樣做的好處是我們查找scope會(huì)變得很方便。譬如現(xiàn)在的上下文是語(yǔ)句scope,那么它理應(yīng)可以看見(jiàn)變量、參數(shù)、全局函數(shù)和全局變量。添加一個(gè)符號(hào)也很方便,只要當(dāng)前的scope沒(méi)有這個(gè)名字,不管上面的scope有沒(méi)有我們都可以添加,添加完就把上面的scope的同名符號(hào)給覆蓋了。

 

一個(gè)scope其實(shí)還可以記錄其他的東西的,譬如距離最近的循環(huán)表達(dá)式啦(用來(lái)判斷break是否應(yīng)該存在),所屬的函數(shù)啦(return后面要不要接表達(dá)式),還有其他的很多雜七雜八的東西。

 

第四個(gè)問(wèn)題是如何創(chuàng)建符號(hào)表。之前的文章我們把語(yǔ)句和表達(dá)式都建立成了兩個(gè)大型的繼承結(jié)構(gòu)。表達(dá)式添加一個(gè)函數(shù)叫GetType,返回一個(gè)ID。語(yǔ)句建立一個(gè)函數(shù)叫Validate,用來(lái)驗(yàn)證語(yǔ)句是否合法。他們的參數(shù)都是符號(hào)表和當(dāng)前的scope,這樣的話(huà),表達(dá)式為了創(chuàng)建類(lèi)型就會(huì)產(chǎn)生出一堆ID,語(yǔ)句為了讓表達(dá)式可以知道每一個(gè)變量的類(lèi)型就要?jiǎng)?chuàng)建scope。這么一遞歸下去,符號(hào)表也有了,類(lèi)型也檢查完了。所以上文才會(huì)說(shuō)語(yǔ)義分析產(chǎn)生符號(hào)表。

 

符號(hào)表就介紹到這里了。一個(gè)高級(jí)語(yǔ)言所遇到的基本的問(wèn)題其實(shí)都講得差不多了。接下來(lái)的文章就針對(duì)具體的問(wèn)題進(jìn)行講解了,譬如繼承、反射、垃圾收集等等的跟具體語(yǔ)言相關(guān)的問(wèn)題。

posted on 2009-05-10 18:48 陳梓瀚(vczh) 閱讀(7278) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): 腳本技術(shù)

評(píng)論:
# re: 手把手教你寫(xiě)腳本引擎(五)——簡(jiǎn)單的高級(jí)語(yǔ)言(3,符號(hào)表) 2010-08-12 05:29 | aaa
博主講得非常精彩。能夠繼續(xù)講一下繼承,反射,垃圾回收的問(wèn)題么?  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            极品日韩av| 欧美二区视频| 欧美国产视频在线观看| 欧美成年人网站| 欧美国产日韩xxxxx| 亚洲电影免费在线观看| 免费人成精品欧美精品| 免费在线成人av| 欧美国产日本高清在线| 亚洲大胆人体在线| 亚洲精品久久久久久下一站 | 亚洲午夜日本在线观看| 亚洲欧美日韩在线不卡| 久久国产欧美精品| 欧美成人在线网站| 99国产精品久久| 久久精品一级爱片| 欧美视频日韩| 亚洲国产精品嫩草影院| 亚洲欧美日韩一区在线观看| 久久综合一区二区| 最新成人在线| 欧美一区二区在线| 欧美日韩美女在线| 亚洲成人在线观看视频| 亚洲女性裸体视频| 亚洲福利小视频| 欧美一区国产二区| 欧美日韩国产大片| 91久久久久久久久久久久久| 亚洲一区国产精品| 免费成人黄色| 欧美一区二区女人| 欧美午夜宅男影院| 亚洲日本在线观看| 农村妇女精品| 欧美在线观看你懂的| 欧美三级网页| 日韩视频在线免费观看| 老**午夜毛片一区二区三区| 亚洲自拍另类| 欧美婷婷久久| 亚洲视频第一页| 亚洲国产日韩在线| 久久婷婷丁香| 影音先锋另类| 麻豆精品在线观看| 久久精品国产亚洲高清剧情介绍| 国产精品久久7| 亚洲淫片在线视频| 正在播放亚洲一区| 国产精品免费看片| 亚洲综合视频一区| 亚洲午夜成aⅴ人片| 欧美午夜片在线观看| 一本久道综合久久精品| 91久久久亚洲精品| 欧美日韩美女在线| 亚洲一区二区三区中文字幕在线 | 一区一区视频| 国产精品综合色区在线观看| 欧美日韩国产丝袜另类| 亚洲欧洲日本在线| 欧美激情精品久久久久久久变态 | 国产精品日韩久久久| 亚洲一级特黄| 99re6这里只有精品视频在线观看| 欧美激情精品久久久久| 9色国产精品| aa亚洲婷婷| 国产麻豆午夜三级精品| 久久久久久国产精品一区| 欧美一区二区在线免费播放| 国产日韩在线视频| 另类亚洲自拍| 欧美激情第4页| 亚洲欧美成人| 久久九九99视频| 最新热久久免费视频| 亚洲欧洲在线免费| 国产精品久久9| 另类尿喷潮videofree| 欧美国产日韩亚洲一区| 亚洲视频在线观看三级| 欧美一级免费视频| 91久久久久久久久久久久久| 99精品国产在热久久下载| 国产精品美腿一区在线看| 久久亚洲影院| 欧美三级在线视频| 久久五月激情| 欧美午夜精品伦理| 欧美成人精品不卡视频在线观看 | 国产精品成人午夜| 久久久水蜜桃| 欧美三级视频在线| 欧美a级大片| 国产精品影视天天线| 亚洲大胆女人| 国内外成人免费激情在线视频网站| 亚洲黄色在线观看| 国产一区二区三区视频在线观看| 亚洲国产午夜| 在线播放一区| 午夜精品一区二区三区电影天堂| 日韩视频免费观看高清完整版| 欧美亚洲色图校园春色| 一区二区三区鲁丝不卡| 久久久亚洲人| 久久成人免费电影| 欧美日韩国产综合视频在线观看| 久久综合久久综合这里只有精品 | 韩国一区二区在线观看| av72成人在线| 亚洲免费观看高清在线观看| 亚洲精品久久嫩草网站秘色 | 亚洲一级特黄| 亚洲欧洲一区| 久久综合五月| 老色鬼久久亚洲一区二区| 欧美日韩午夜在线视频| 欧美国产一区二区三区激情无套| 国产午夜精品美女视频明星a级 | 欧美va天堂在线| 久久亚洲高清| 国产午夜精品全部视频在线播放| 在线一区视频| 一区二区三区国产在线| 欧美二区在线看| 欧美激情综合| 亚洲欧洲日本在线| 免费一区二区三区| 欧美激情中文字幕一区二区| 亚洲大片精品永久免费| 久久久噜噜噜| 免费在线成人av| 亚洲狠狠丁香婷婷综合久久久| 久久久久久久久岛国免费| 久久亚洲精品伦理| 在线成人中文字幕| 嫩草国产精品入口| 亚洲精品婷婷| 亚洲综合不卡| 国产日韩精品视频一区| 欧美一级视频| 美女亚洲精品| 夜久久久久久| 国产精品无人区| 久久精品观看| 最新国产拍偷乱拍精品 | 亚洲一区中文| 国产精品夜夜夜| 久久精品人人| 亚洲国产高清视频| 亚洲香蕉视频| 国产一区999| 欧美激情一区二区三区高清视频| 日韩视频二区| 欧美综合国产| 最新国产乱人伦偷精品免费网站| 欧美激情精品久久久久久蜜臀| 日韩视频在线你懂得| 午夜日韩福利| 亚洲国产精品一区二区久| 欧美日韩调教| 久久久国产精彩视频美女艺术照福利| 欧美国产日韩xxxxx| 亚洲视频导航| 一区二区亚洲精品国产| 欧美日韩国产首页| 久久久99免费视频| 一区二区三区蜜桃网| 久久人人爽人人爽爽久久| 99在线精品观看| 国产亚洲制服色| 欧美日韩精品免费观看视频完整| 欧美一区二区三区在线免费观看 | 午夜伦欧美伦电影理论片| 免费成人网www| 亚洲综合另类| 亚洲精品免费在线播放| 欧美主播一区二区三区美女 久久精品人| 国产午夜亚洲精品理论片色戒| 久久综合伊人77777麻豆| 亚洲少妇在线| 亚洲欧洲综合另类在线| 欧美在线精品免播放器视频| 亚洲精品中文字幕女同| 国产一区二区三区在线观看免费视频 | 久久久亚洲成人| 亚洲视频第一页| 亚洲美女电影在线| 一区在线免费| 国产美女精品免费电影| 欧美日韩成人在线| 久久婷婷国产综合国色天香| 亚洲欧美日韩国产另类专区| 亚洲精选一区二区| 91久久久一线二线三线品牌| 欧美黄在线观看|