在指令碼裡有很多語句組成的,那麼對於語句又是怎麼進行語法分析的呢?下面就來分析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 設定當前正在設定的語...
第二人生的原始碼分析 二十 顯示人物名稱
在第二人生裡,每個人物顯示都有乙個名稱,那麼這個名稱又是怎麼樣顯示出來的呢?怎麼樣實現的呢?帶著這兩個問題,下面就去分析第二人生裡面的實現 它的人物名稱顯示如下 從上面的上,可以看到人物的頭上有乙個名稱顯示,用來標識人物角色。要顯示這個人物名稱,肯定是在二維的空間裡顯示的。每個人都有乙個名稱顯示,很...