第二人生的原始碼分析 110 指令碼的語法分析(5)

2021-08-22 17:45:30 字數 4752 閱讀 9225

在指令碼裡有很多語句組成的,那麼對於語句又是怎麼進行語法分析的呢?下面就來分析for語句的分析過程,它的宣告**如下:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

#001 class llscriptfor : public llscriptstatement

#002

#009

析建構函式。

#010 ~llscriptfor()

#011

#013

遞迴處理函式。

#014 void recurse(file *fp, s32 tabs, s32 tabsize, lscriptcompilepass pass, lscriptprunetype ptype, bool &prunearg, llscriptscope *scope, lscripttype &type,

#015 lscripttype basetype, u64 &count, llscriptbytecodechunk *chunk, llscriptbytecodechunk *heap, s32 stacksize, llscriptscopeentry *entry, s32 entrycount, llscriptlibdata **ldata);

獲取語句生成**的大小。

#016 s32 getsize();

#017

初始化表示式。

#018 llscriptexpression *msequence;

條件判斷表示式。

#019 llscriptexpression *mexpression;

最後執行的表示式列表。

#020 llscriptexpression *mexpressionlist;

迴圈體的語句塊。

#021 llscriptstatement *mstatement;

指令碼的型別。

#022 lscripttype mtype;

#023 };

下面來分析它的遞迴呼叫函式的處理:

#001 void llscriptfor::recurse(file *fp, s32 tabs, s32 tabsize, lscriptcompilepass pass, lscriptprunetype ptype, bool &prunearg, llscriptscope *scope, lscripttype &type,

#002 lscripttype basetype, u64 &count, llscriptbytecodechunk *chunk, llscriptbytecodechunk *heap, s32 stacksize, llscriptscopeentry *entry, s32 entrycount, llscriptlibdata **ldata)

#003

下面根據不同的遍來處理。

#008 switch(pass)

#009

#047 break;

下面優化**,如果**不用執行,就可以刪除。

#048 case lscp_prune:

#049 if (ptype == lsprune_dead_code)

#050 prunearg = true;

#051 else

#052 prunearg = false;

#053 break;

下面進行for語句的型別檢查。

#054 case lscp_type:

#055 if(msequence)

#056 msequence->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount,

#057 null);

#058 mexpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, null);

#059 mtype = type;

#060 if(mexpressionlist)

#061 mexpressionlist->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry,

#062 entrycount, null);

#063 if(mstatement)

#064 mstatement->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount,

#065 null);

#066 break;

下面生成for語句的目標**。

#067 case lscp_emit_byte_code:

#068

#095 break;

下面生成cil的彙編**。

#096 case lscp_emit_cil_assembly:

#097

#116 break;

下面進行遞迴處理for裡出現的表示式。

#117 default:

#118 if(msequence)

#119 msequence->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount,

#120 null);

#121 mexpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, null);

#122 if(mexpressionlist)

#123 mexpressionlist->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry,

#124 entrycount, null);

#125 if(mstatement)

#126 mstatement->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount,

#127 null);

#128 break;

#129 }

#130 gonext(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, null);

#131 }

在語法分析裡,把所有合法的語句都生成乙個合適的類物件,然後通過遍歷所有類物件進行型別檢查,或者生成**。所有其它語句都是這樣進行的,比如語句if就是使用類llscriptif來儲存和分析的。當檢查所有指令碼都是合法的語法後,就生成了語法樹,後面通過遍歷語法樹來生成**。

第二人生開發包提供,**198元/套(含郵費)。

包括內容如下:

1.

《第二人生的原始碼分析》pdf文件。

2.

第二人生客戶端源程式。

3.

<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2gu盤乙個,主要用來拷貝源程式以及相關開發工具。

提供三個月的技術服務,

提供快速編譯指導,比如通過qq遠端編譯操作。

提供完整的書參考。

****:

msn: [email protected]

email: [email protected]

第二人生的原始碼分析 2 第二人生的基本功能

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!第二人生的基功能可以定義為網路遊戲 社交網路和 web2.0 作為網路遊戲,它可以讓人扮演角色,也就是第二人生裡的居民。居民只要買到地,或者租到地後就可以建造各種各樣的自己想得到的東西。比如建造遊樂園,或者建造電影院,又或者建造過山車。同時,還可以...

第二人生的原始碼分析 八十 介面語言的選擇

隨著全球化的發展,地球變得平坦了。我有乙個同事現在還在美國 oracle進行學習,說明軟體是真正的無國界產品。那麼在第二人生裡,到底是怎麼樣實現多語言的支援呢?帶著這個問題來分析下面一段 如下 001void lluictrlfactory setuppaths 002 025 設定當前正在設定的語...

第二人生的原始碼分析 二十 顯示人物名稱

在第二人生裡,每個人物顯示都有乙個名稱,那麼這個名稱又是怎麼樣顯示出來的呢?怎麼樣實現的呢?帶著這兩個問題,下面就去分析第二人生裡面的實現 它的人物名稱顯示如下 從上面的上,可以看到人物的頭上有乙個名稱顯示,用來標識人物角色。要顯示這個人物名稱,肯定是在二維的空間裡顯示的。每個人都有乙個名稱顯示,很...