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

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

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

 

陳梓瀚

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

vczh@163.com

http://www.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>
            久久只有精品| 亚洲欧美日韩在线不卡| 欧美mv日韩mv国产网站app| 亚洲国产成人不卡| 亚洲激精日韩激精欧美精品| 欧美岛国激情| 亚洲综合999| 欧美一区二区三区久久精品茉莉花 | 欧美一区1区三区3区公司| 午夜精品一区二区三区在线视 | 国产一区二区精品久久99| 亚洲性感激情| 国产精品中文字幕欧美| 久久女同互慰一区二区三区| 久久亚洲国产成人| 99re6这里只有精品| 亚洲日本欧美天堂| 国产视频一区在线观看一区免费| 久久夜色精品国产亚洲aⅴ | 久久免费精品日本久久中文字幕| 日韩午夜精品视频| 亚洲视频精选在线| 亚洲电影一级黄| 99视频精品全部免费在线| 国产午夜久久久久| 亚洲精品国精品久久99热一| 国产私拍一区| 亚洲日本激情| 在线一区日本视频| 午夜精品一区二区三区在线视| 亚洲综合清纯丝袜自拍| 亚洲欧洲精品一区二区精品久久久| 亚洲免费成人av电影| 国外成人在线视频| 亚洲性线免费观看视频成熟| 亚洲韩日在线| 欧美一区二区私人影院日本 | 国产精品伦一区| 欧美成人在线影院| 国产亚洲综合性久久久影院| 亚洲理论电影网| 亚洲国产一区在线观看| 亚洲欧美日本国产有色| av成人免费在线| 老牛嫩草一区二区三区日本| 最近看过的日韩成人| 亚洲日本中文字幕免费在线不卡| 99re热精品| 亚洲伦理在线观看| 久久综合九九| 久久在线视频在线| 国产欧美一区二区色老头| 日韩午夜电影av| 亚洲乱码久久| 免费影视亚洲| 亚洲电影免费观看高清| 红桃视频成人| 欧美在线高清视频| 欧美一级日韩一级| 国产麻豆视频精品| 亚洲一区精品视频| 欧美一区二区成人6969| 国产精品裸体一区二区三区| 亚洲少妇在线| 一区二区欧美激情| 久热精品视频在线| 欧美jizzhd精品欧美巨大免费| 国产日本亚洲高清| 亚洲欧美激情四射在线日| 国产精品一区二区男女羞羞无遮挡| 亚洲精品1区2区| 在线视频亚洲欧美| 国产精品a久久久久| 亚洲一二三四区| 午夜亚洲福利在线老司机| 国产精品久久久久久久久借妻| 一区电影在线观看| 欧美影院视频| 国模精品娜娜一二三区| 久久精品中文字幕一区| 欧美福利视频在线| 一区二区日韩欧美| 国产精品一区视频网站| 久久久.com| 亚洲国产精品久久久久秋霞蜜臀 | 欧美一区二区视频免费观看| 久久男人资源视频| 亚洲福利精品| 欧美丝袜第一区| 欧美中文日韩| 亚洲国产精品视频一区| 亚洲无线视频| 国产一区二区精品久久| 你懂的视频一区二区| 99视频日韩| 老牛影视一区二区三区| 一区二区av| 国精产品99永久一区一区| 欧美国产综合| 欧美一区二区在线看| 亚洲福利视频专区| 午夜日本精品| 亚洲精品欧美日韩专区| 国产日韩欧美自拍| 欧美日韩精品久久久| 欧美一区国产二区| 日韩视频三区| 亚洲成色999久久网站| 午夜精品久久久久久久久久久久| 激情小说另类小说亚洲欧美| 欧美日韩亚洲在线| 男女av一区三区二区色多| 亚洲女同精品视频| 亚洲欧洲精品成人久久奇米网| 欧美在线国产精品| 在线视频精品| 亚洲人体影院| 在线观看成人一级片| 国产九九视频一区二区三区| 欧美精品色一区二区三区| 久久天天躁狠狠躁夜夜爽蜜月| 一区二区三区精品| 91久久线看在观草草青青| 久久综合久久久久88| 篠田优中文在线播放第一区| 在线亚洲成人| 一区二区欧美国产| 日韩小视频在线观看| 亚洲黄一区二区| 亚洲电影欧美电影有声小说| 国产尤物精品| 国产有码在线一区二区视频| 国产日韩欧美精品| 国产视频一区二区三区在线观看| 国产精品jvid在线观看蜜臀| 欧美日韩成人综合天天影院| 欧美激情一区二区三区全黄| 蜜臀a∨国产成人精品| 国产日韩欧美黄色| 国产精品日本一区二区| 欧美性大战xxxxx久久久| 欧美日韩成人综合在线一区二区| 免费在线观看一区二区| 久久综合中文色婷婷| 麻豆freexxxx性91精品| 久久免费视频网| 蜜桃伊人久久| 欧美精品午夜| 欧美日韩国产在线看| 欧美午夜a级限制福利片| 国产精品久久久久91| 国产精品人人爽人人做我的可爱 | 欧美一区二区日韩| 久久久亚洲国产美女国产盗摄| 久久精品日产第一区二区| 久久久人成影片一区二区三区| 久久伊伊香蕉| 欧美剧在线观看| 国产精品日韩精品| 狠狠久久亚洲欧美专区| 18成人免费观看视频| 亚洲最新视频在线| 欧美在线视屏| 亚洲成人在线网| 亚洲最新合集| 欧美一区二区三区免费观看| 蜜桃av综合| 欧美先锋影音| 狠狠色狠狠色综合日日91app| 亚洲国产成人不卡| 亚洲一区二区四区| 老司机午夜免费精品视频| 91久久夜色精品国产九色| 亚洲综合导航| 欧美不卡高清| 国产乱码精品一区二区三| 亚洲国产精品久久久久秋霞影院| 亚洲天堂av高清| 久久综合网络一区二区| 日韩午夜中文字幕| 久久gogo国模裸体人体| 欧美日韩情趣电影| 精品不卡一区二区三区| 亚洲视频日本| 农村妇女精品| 午夜精品久久久久久久男人的天堂| 久久综合久久综合久久综合| 国产精品男gay被猛男狂揉视频| 在线电影国产精品| 欧美专区亚洲专区| 亚洲精品在线电影| 麻豆成人综合网| 国产一区二区三区在线观看精品| 99精品免费视频| 免费中文日韩| 欧美在线一二三四区| 国产精品久久久久国产精品日日| 亚洲精品国产品国语在线app| 久久久久一区二区| 午夜精品视频在线观看一区二区|