<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://flipcode.spaces.live.com/mmm2008-05-17_13.22/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fflipcode.spaces.live.com%2fcategory%2f%e8%84%9a%e6%9c%ac%e7%9b%b8%e5%85%b3%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>飘零风雨亭: 脚本相关</title><description /><link>http://flipcode.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=cat%25E8%2584%259A%25E6%259C%25AC%25E7%259B%25B8%25E5%2585%25B3</link><language>en-US</language><pubDate>Mon, 23 Jun 2008 08:31:31 GMT</pubDate><lastBuildDate>Mon, 23 Jun 2008 08:31:31 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://flipcode.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>-8189920746979949719</live:id><live:alias>flipcode</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>lua写文件(备忘)</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1104.entry</link><description>&lt;div&gt;lua写文件(备忘):&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;function save(n)&lt;br&gt; io.output(&amp;quot;save&amp;quot;..n)&lt;br&gt; serialize(contex)&lt;br&gt; io.close()&lt;br&gt;end&lt;br&gt;&lt;/div&gt;
&lt;div&gt;-- from the lua tutorials &lt;/div&gt;
&lt;div&gt;function serialize (o)&lt;br&gt;    if type(o) == &amp;quot;number&amp;quot; then&lt;br&gt;    io.write(o)&lt;br&gt;    elseif type(o) == &amp;quot;string&amp;quot; then&lt;br&gt;    io.write(string.format(&amp;quot;%q&amp;quot;, o))&lt;br&gt;    elseif type(o) == &amp;quot;table&amp;quot; then&lt;br&gt;    io.write(&amp;quot;{\n&amp;quot;)&lt;br&gt;    for k,v in pairs(o) do&lt;br&gt;        io.write(&amp;quot;  [&amp;quot;)&lt;br&gt;        serialize(k)&lt;br&gt;        io.write(&amp;quot;] = &amp;quot;)&lt;br&gt;        serialize(v)&lt;br&gt;        io.write(&amp;quot;,\n&amp;quot;)&lt;br&gt;    end&lt;br&gt;    io.write(&amp;quot;}\n&amp;quot;)&lt;br&gt;    else&lt;br&gt;    error(&amp;quot;cannot serialize a &amp;quot; .. type(o))&lt;br&gt;    end&lt;br&gt;end&lt;br&gt;--------------------------------------------&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+lua%e5%86%99%e6%96%87%e4%bb%b6(%e5%a4%87%e5%bf%98)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1104.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1104.entry</guid><pubDate>Mon, 14 Jan 2008 02:26:58 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!1104/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1104.entry#comment</wfw:comment><dcterms:modified>2008-01-14T02:26:58Z</dcterms:modified></item><item><title>面向对象的LUA编程(转)</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1027.entry</link><description>&lt;div&gt;&lt;br&gt;面向对象的LUA编程(转)&lt;br&gt;摘自: &lt;a href="http://www.ecodeproject.cn/gby/vbs/showthread.asp?threadid=772"&gt;http://www.ecodeproject.cn/gby/vbs/showthread.asp?threadid=772&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;面向对象的Lua编程(一) ---- 对象的表示方法&lt;/div&gt;
&lt;div&gt;1.前言&lt;br&gt;偶又看到有人问Lua了, 哇卡卡, 看来初级教程不够用了,&lt;br&gt;偶下定决心要把Lua的面向对象使用也写完.&lt;/div&gt;
&lt;div&gt;如果偶的游戏中要用到Lua了, 但是游戏中的数据都是以对象的形式组织的, &lt;br&gt;怎么办呢? 于是就需要让Lua也支持面向对象的编程方式.&lt;/div&gt;
&lt;div&gt;Lua本身并不是一个面向对象的语言, 当然你可以修改它的源代码全它支持&lt;br&gt;面向对象. 但偶这里讨论的是在不修改代码的前提下, 提供面向对象的支持,&lt;br&gt;由于它采用table作为数据格式, 使得它变得异常灵活, 偶们可以为它加入&lt;br&gt;对象的概念.&lt;/div&gt;
&lt;div&gt;2.相关库资料&lt;br&gt;现在有一些现成的库可以提供面向对象的支持, 比如LuaBind, toLua, 还有&lt;br&gt;第二人生的一名程序员也写过Lua的C++ Wrapper, 网址如下:&lt;br&gt;&lt;a href="http://www.d2-life.com/LBS/blogview.asp?logID=41"&gt;http://www.d2-life.com/LBS/blogview.asp?logID=41&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;用现成的库可以大大减少开发时间, 但是一旦出错了调试起来也挺麻烦的, &lt;br&gt;你需要对这些库有比较深入的了解. 偶将对Lua中面向对象的实现做个简单介绍.&lt;/div&gt;
&lt;div&gt;3.例子&lt;br&gt;这是一个Luawiki中metamethod实现string对象的例子, 偶就不把&amp;gt;去掉了, 还是自己打一遍&lt;br&gt;比较容易理解.&lt;/div&gt;
&lt;div&gt;&lt;br&gt;&amp;gt; String = {}&lt;br&gt;&amp;gt; mt = {}&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt; function String:new(s)&lt;br&gt;&amp;gt;&amp;gt;   return setmetatable({ value = s or '' }, mt)&lt;br&gt;&amp;gt;&amp;gt; end&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt; function String:print()&lt;br&gt;&amp;gt;&amp;gt;   print(self.value)&lt;br&gt;&amp;gt;&amp;gt; end&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt; mt.__add = function (a,b) return String:new(a.value..b.value) end&lt;br&gt;&amp;gt; mt.__mul = function (a,b) return String:new(string.rep(a.value, b)) end&lt;br&gt;&amp;gt; mt.__index = String -- redirect queries to the String table&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt; s = String:new('hello ')&lt;br&gt;&amp;gt; s:print()&lt;br&gt;hello&lt;br&gt;&amp;gt; a = ((String:new('hello ') + String:new('Lua user. '))*2)&lt;br&gt;&amp;gt; a:print()&lt;br&gt;hello Lua user. hello Lua user.&lt;br&gt; &lt;/div&gt;
&lt;div&gt;&lt;br&gt;4.程序说明&lt;/div&gt;
&lt;div&gt;首先来介绍下什么是metamethod. metamethod类似于C++中的运算符重载, 比如程序中&lt;br&gt;mt是偶们的metatable, mt.__add就是+运算符, mt.__mul就是*运算符, mt.__index是.运算符,&lt;br&gt;与C++不同的是偶们可以在运行时动态改变与object相关联的metatable, 用setmetatable这个方法.&lt;br&gt;关于具体的metatable说明请看&lt;a href="http://lua-users.org/wiki/MetamethodsTutorial"&gt;http://lua-users.org/wiki/MetamethodsTutorial&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;String是偶们定义的一个类, 它包括了new, print, +, *, . 五个方法, new和print是采用&lt;br&gt;的普通的定义方法, 而+ * . 采用的是metatable重载定义.&lt;/div&gt;
&lt;div&gt;new方法: 使value=s, 若s为NULL, 则value='', 同时把metatable与这个table挂钩.&lt;br&gt;print方法: 打印value值, self是指向自己的一个引用&lt;br&gt;__add方法(+): 把a.value与b.value连接起来, ..是连接两个字符串的操作&lt;br&gt;__mul方法(*): 把a.value重复N遍&lt;br&gt;__index方法(.): 使对.操作的请求与String类的相同&lt;/div&gt;
&lt;div&gt;下面是一个直接定义__index返回值的例子, 现在偶们的String类没有length属性,&lt;br&gt;于是使用s.length就会出错, 如果偶们在__index中定义了当key='length'的时候&lt;br&gt;返回什么值, 就不会出错了.&lt;br&gt;&amp;gt; print(s.length) -- no such key in the String table class&lt;br&gt;nil&lt;br&gt;&amp;gt; mt.__index = function (t,key)&lt;br&gt;&amp;gt;&amp;gt;   if key == 'length' then return string.len(t.value) end&lt;br&gt;&amp;gt;&amp;gt; end&lt;br&gt;&amp;gt; print(s.length) -- new __index event calls the above function&lt;br&gt;6&lt;/div&gt;
&lt;div&gt;5.心得体会&lt;br&gt;看, 在Lua里面加上对对象的支持并不十分复杂吧, 其实不用其他任何库, 偶们自己都&lt;br&gt;可以实现, 而且效率会比较高. 如果你对效率比较看中的话, 还是不要用库的好, 自己&lt;br&gt;写吧.&lt;/div&gt;
&lt;div&gt;面向对象的Lua编程(二) ---- 对象的继承&lt;/div&gt;
&lt;div&gt;参考网址:http://lua-users.org/wiki/InheritanceTutorial&lt;/div&gt;
&lt;div&gt;1.方法的调用&lt;/div&gt;
&lt;div&gt;首先说一下方法的调用, 上次用到却没有讲.&lt;br&gt;类的方法调用有两种形式，一是用:, 还有一种是用.&lt;br&gt;用：时隐含了方法的第一个参数，就是self&lt;br&gt;而用.时需要把所有的参数都写出来&lt;br&gt;例如&lt;br&gt;c.add(self, a, b);&lt;br&gt;c:add(a, b);&lt;br&gt;就是相同的.&lt;/div&gt;
&lt;div&gt;而定义时也是这样, 如下两种定义是一样的&lt;br&gt;function foo.add(self, x) self.value = self.value+x end&lt;br&gt;function foo:add(x) self.value = self.value+x end&lt;/div&gt;
&lt;div&gt;而_index运算符既包括了.又包括了:, 所以重载_index两个都会变&lt;/div&gt;
&lt;div&gt;2.基类&lt;br&gt;首先我们定义一个基类，这个类并无啥特别之处&lt;/div&gt;
&lt;div&gt;&lt;br&gt;SimpleClass = {}&lt;br&gt;SimpleClass_mt = { __index = SimpleClass }&lt;/div&gt;
&lt;div&gt;-- Create方法建立类的一个新的实例&lt;br&gt;-- 基本等同于New运算符&lt;br&gt;function SimpleClass:create()&lt;br&gt;  local new_inst = {}   -- 新的实例&lt;br&gt;  setmetatable( new_inst, SimpleClass_mt ) -- 所有实例共用一个metatable&lt;br&gt;  return new_inst&lt;br&gt;end&lt;/div&gt;
&lt;div&gt;-- 以下是SimpleClass中的一些方法&lt;/div&gt;
&lt;div&gt;function SimpleClass:className()&lt;br&gt;  print( &amp;quot;SimpleClass&amp;quot; )&lt;br&gt;end&lt;/div&gt;
&lt;div&gt;function SimpleClass:doSomething()&lt;br&gt;  print( &amp;quot;Doing something&amp;quot; )&lt;br&gt;end&lt;br&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;3.生成子类的方法&lt;br&gt;下面定义了一个全局函数，用于生成子类，该函数的参数是父类, 返回对象是生成的子类&lt;/div&gt;
&lt;div&gt;&lt;br&gt;-- Create a new class that inherits from a base class&lt;br&gt;--&lt;br&gt;function inheritsFrom( baseClass )&lt;/div&gt;
&lt;div&gt;  -- 以下这部分与SimpleClass相同&lt;/div&gt;
&lt;div&gt;  -- Create the table and metatable representing the class.&lt;br&gt;  local new_class = {}&lt;br&gt;  local class_mt = { __index = new_class }&lt;/div&gt;
&lt;div&gt;  -- Note that this function uses class_mt as an upvalue, so every instance&lt;br&gt;  -- of the class will share the same metatable.&lt;br&gt;  --&lt;br&gt;  function new_class:create()&lt;br&gt;    local newinst = {}&lt;br&gt;    setmetatable( newinst, class_mt )&lt;br&gt;    return newinst&lt;br&gt;  end&lt;/div&gt;
&lt;div&gt;  -- 以下这部分是实现继承的关键&lt;/div&gt;
&lt;div&gt;  -- 这里重载了__index运算符，使它指向了baseClass, 也就是父类&lt;br&gt;  -- 于是父类中的所有方法子类中都可以使用，同时，子类也可以重载&lt;br&gt;  -- 父类中的方法.&lt;br&gt;  --&lt;br&gt;  if baseClass then&lt;br&gt;    setmetatable( new_class, { __index = baseClass } )&lt;br&gt;  end&lt;/div&gt;
&lt;div&gt;  return new_class&lt;br&gt;end&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;br&gt;4.例子&lt;/div&gt;
&lt;div&gt;以下是从SimpleClass派生出SubClass的例子&lt;/div&gt;
&lt;div&gt;&lt;br&gt;&amp;gt; -- Create a new class that inherits from SimpleClass&lt;br&gt;&amp;gt; SubClass = inheritsFrom( SimpleClass )&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt; -- override className() function&lt;br&gt;&amp;gt; function SubClass:className() print( &amp;quot;SubClass&amp;quot; ) end&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt; -- Create an instance of SimpleClass&lt;br&gt;&amp;gt; simple = SimpleClass:create()&lt;br&gt;&amp;gt; &lt;br&gt;&amp;gt; simple:className()&lt;br&gt;SimpleClass&lt;br&gt;&amp;gt; &lt;br&gt;&amp;gt; simple:doSomething()&lt;br&gt;Doing something&lt;br&gt;&amp;gt; &lt;br&gt;&amp;gt; -- Create an instance of SubClass&lt;br&gt;&amp;gt; sub = SubClass:create()&lt;br&gt;&amp;gt; &lt;br&gt;&amp;gt; sub:className() -- Call overridden method&lt;br&gt;SubClass&lt;br&gt;&amp;gt; &lt;br&gt;&amp;gt; sub:doSomething() -- Call base class method&lt;br&gt;Doing something&lt;br&gt;&amp;gt;  &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;以上这个例子有几点需要注意的:&lt;br&gt;* 偶们的类与类的实例其实都是table, 但千万不要搞混&lt;br&gt;* inheritsFrom产生的类能重载父类的方法, 因为inheritsFrom产&lt;br&gt;生的子类的__index = baseClass&lt;br&gt;* 由SubClass:create()产生的sub的__index = new_class, 而new_class就是偶们的&lt;br&gt;SubClass. 而SubClass的__index = baseClass, 所以偶们的实例可以使用父类方法&lt;br&gt;* 重载了父类的方法, 只对子类有影响，父类对象仍然调用的是原方法, 这点与C++相同&lt;br&gt;但是光从lua看比较容易误解，以为重载的className把原来父类的className替换掉了，&lt;br&gt;其实只是子类className这个标识符指向的函数变了而已.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;龚辟愚 2006-4-17 10:55:31&lt;br&gt; &lt;/div&gt;
&lt;div&gt;&lt;br&gt;LCC-Win32 下载地址 &lt;br&gt;Turbo C For Windows 作者&lt;br&gt; &lt;br&gt; &lt;br&gt;            543210-1-2-3-4-5     1    &lt;br&gt; &lt;br&gt;龚辟愚&lt;/div&gt;
&lt;div&gt;站长&lt;/div&gt;
&lt;div&gt;发帖: 520&lt;br&gt;积分: 1000000385&lt;br&gt;注册: 2004-5&lt;br&gt;来自:湖南&lt;br&gt;性别: 美女&lt;br&gt;状态: offline &lt;br&gt;2006-4-17 10:57:07 &lt;br&gt;                        &lt;br&gt;--------------------------------------------------------------------------------&lt;/div&gt;
&lt;div&gt;Re:面向对象的LUA编程&lt;/div&gt;
&lt;div&gt;面向对象的Lua编程(三) ---- tolua++使用入门&lt;/div&gt;
&lt;div&gt;1.简介&lt;br&gt;前两篇文章说了Lua与面向对象的基础, 对于普通用户而言,&lt;br&gt;自己开发一套Lua的面向对象的脚本接口, 工作量不小, 而且也非必须,&lt;br&gt;因为现在有很多种第三方的软件包为Lua提供面向对象的特性,&lt;br&gt;比如tolua, luabind, lua++, luna, ...&lt;/div&gt;
&lt;div&gt;这次偶们来介绍一下tolua/tolua++,&lt;br&gt;tolua++是tolua的一个扩展包, 它的网址在&lt;a href="http://www.codenix.com/~tolua/"&gt;http://www.codenix.com/~tolua/&lt;/a&gt;,&lt;br&gt;它是用来结合C/C++与Lua的一个包. 对于提高开发效率是有帮助的.&lt;br&gt;它包括了tolua的所有功能. &lt;/div&gt;
&lt;div&gt;2.tolua与C/C++概览&lt;br&gt;首先看一看tolua与C的结合,&lt;br&gt;例如偶们把如下的C头文件导入了tolua&lt;/div&gt;
&lt;div&gt;&lt;br&gt;#define FALSE 0&lt;br&gt;#define TRUE 1&lt;/div&gt;
&lt;div&gt;enum { &lt;br&gt;POINT = 100, &lt;br&gt;LINE, &lt;br&gt;POLYGON&lt;br&gt;}&lt;br&gt;Object* createObejct (int type);&lt;br&gt;void drawObject (Object* obj, double red, double green, double blue);&lt;br&gt;int isSelected (Object* obj);&lt;br&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;下面是一个在Lua中使用的范例&lt;/div&gt;
&lt;div&gt;...&lt;br&gt;myLine = createObject(LINE)&lt;br&gt;...&lt;br&gt;if isSelected(myLine) == TRUE then&lt;br&gt;drawObject(myLine, 1.0, 0.0, 0.0);&lt;br&gt;else&lt;br&gt;drawObject(myLine, 1.0, 1.0, 1.0);&lt;br&gt;end&lt;br&gt;... &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;再看一下tolua与C++的结合, &lt;br&gt;例如有如下一个C++头文件&lt;/div&gt;
&lt;div&gt;#define FALSE 0&lt;br&gt;#define TRUE 1&lt;br&gt;class Shape&lt;br&gt;{&lt;br&gt;void draw (void);&lt;br&gt;void draw (double red, double green, double blue);&lt;br&gt;int isSelected (void);&lt;br&gt;};&lt;br&gt;class Line : public Shape&lt;br&gt;{&lt;br&gt;Line (double x1, double y1, double x2, double y2);&lt;br&gt;~Line (void);&lt;br&gt;}; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;那么在Lua中使用时会是什么情况呢?&lt;br&gt;是这样的:&lt;/div&gt;
&lt;div&gt;...&lt;br&gt;myLine = Line:new (0,0,1,1)&lt;br&gt;...&lt;br&gt;if myLine:isSelected() == TRUE then&lt;br&gt;myLine:draw(1.0,0.0,0.0)&lt;br&gt;else&lt;br&gt;myLine:draw()&lt;br&gt;end&lt;br&gt;...&lt;br&gt;myLine:delete()&lt;br&gt;... &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;怎么样, 是不是很方便啊, 心动不如行动, 下面偶就来说说怎么样使用tolua&lt;/div&gt;
&lt;div&gt;3.tolua的编译方法&lt;/div&gt;
&lt;div&gt;首先要下载tolua++, 地址在&lt;a href="http://www.codenix.com/~tolua/tolua++-1.0.3.tar.bz2"&gt;http://www.codenix.com/~tolua/tolua++-1.0.3.tar.bz2&lt;/a&gt;&lt;br&gt;目前的最新版本是1.0.3, 是2004年9月20日新发布的.&lt;/div&gt;
&lt;div&gt;tolua++的编译比较奇特, 你需要安装如下组件&lt;br&gt;python ( &lt;a href="http://www.python.org"&gt;http://www.python.org&lt;/a&gt; ;)&lt;br&gt;SCons ( &lt;a href="http://www.scons.org"&gt;http://www.scons.org&lt;/a&gt; ;)&lt;br&gt;Lua ( &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=32250&amp;amp;;package_id=115604"&gt;http://sourceforge.net/project/showfiles.php?group_id=32250&amp;amp;;package_id=115604&lt;/a&gt; )&lt;br&gt;偶想你们用的都是windows机器, 建议下载windows binary版本, 比较省事&lt;/div&gt;
&lt;div&gt;装好编译环境以后就可以正式编译了,&lt;br&gt;* 首先要编译Lua, 上面那个就是VC6-VC7.1都可以用的工程文件&lt;br&gt;* 在SConstruct中选择配置文件, VC选择config_msvc.py, linux选择config_linux.py,&lt;br&gt;cygwin或其他unix-like可选择config_posix.py, 偶们啥都不用改&lt;br&gt;* 把lua的库文件和头文件分别复制到lib目录和include目录&lt;br&gt;* 打scons all&lt;br&gt;会出现错误, 因为有库和标准库冲突, 不过没关系把link改成&lt;br&gt;link /nologo /OUT:bin\tolua++.exe /LIBPATH:lib /NODEFAULTLIB:LIBCMT tolua++.lib lua.lib lualib.lib src\bin\tolua.obj src\bin\toluabind.obj&lt;br&gt;然后再运行一遍就可以了.&lt;/div&gt;
&lt;div&gt;如果大家怕麻烦, 可以下载偶编译好的tolua++ 1.0.3&lt;/div&gt;
&lt;div&gt;4.tolua的使用方法&lt;/div&gt;
&lt;div&gt;tolua由两部分组成, 一个是tolua.exe用于产生binding文件, 另一个是库文件, 需要在编译时候与主程序链接.&lt;br&gt;tolua.exe常的用法是:&lt;br&gt;tolua -o myfile.c myfile.pkg &lt;br&gt;myfile.pkg是输入文件, 而myfile.c是输出的binding文件.&lt;br&gt;偶们只要把myfile.c加入偶们主程序的工程文件编译, 偶们主程序执行Lua脚本的时候,&lt;br&gt;就可以在Lua中使用pkg中定义的数据结构,函数,或者类了.&lt;/div&gt;
&lt;div&gt;src/tests目录下有tolua的一些例子, 可以先学习一下,&lt;br&gt;偶计划下次结合一些例子来说说pkg文件的定义.&lt;/div&gt;
&lt;div&gt;&lt;br&gt; &lt;br&gt; &lt;br&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+%e9%9d%a2%e5%90%91%e5%af%b9%e8%b1%a1%e7%9a%84LUA%e7%bc%96%e7%a8%8b(%e8%bd%ac)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1027.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1027.entry</guid><pubDate>Wed, 17 Oct 2007 09:38:09 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!1027/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1027.entry#comment</wfw:comment><dcterms:modified>2007-10-17T09:38:09Z</dcterms:modified></item><item><title>Tcl在程序中的使用方法</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!971.entry</link><description>&lt;div&gt;Tcl在程序中的使用方法:&lt;/div&gt;
&lt;div&gt;好久没用Tcl了（我们现在的工程用lua）, 最近下了个程序参考些内容，没想到跑到tcl时当机了，&lt;br&gt;于是想改一下，但是忘记语法了，到网上查了一下，很难找到所需。。。（大都是脚本用法，晕倒)&lt;br&gt;后来把以前工程拿来看了一下，顺便把Tcl的用法记下来放在这里供查询吧。&lt;/div&gt;
&lt;div&gt; &lt;br&gt;///////////////////////////////////////////////////////////////////////////////////&lt;br&gt;&lt;a href="mailto:flipcode@msn.com"&gt;flipcode@msn.com&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;#include &lt;br&gt;//#include &lt;br&gt; &lt;br&gt;// 1. 创建解释器:&lt;br&gt;Tcl_Interp *tcl_interp = Tcl_CreateInterp();&lt;/div&gt;
&lt;div&gt;// 2. 得到Tcl路径:&lt;br&gt;char buf[512];&lt;br&gt;strcpy(buf, &amp;quot;tcl8.4&amp;quot;);&lt;br&gt;Tcl_FindExecutable(buf);&lt;/div&gt;
&lt;div&gt;// 3. 关联到Tcl:&lt;br&gt;Tcl_SetVar(tcl_interp,&amp;quot;tcl_library&amp;quot;,(char*)buf, 0); // initialize tcl_library variable&lt;br&gt;Tcl_Init(tcl_interp);    &lt;/div&gt;
&lt;div&gt;// 4. Tcl扩展:&lt;br&gt;//Tcl_EvalEx(tcl_interp,&amp;quot;rename puts tcl_puts&amp;quot;,-1,TCL_EVAL_DIRECT);&lt;br&gt;//Tcl_CreateObjCommand(tcl_interp,&amp;quot;puts&amp;quot;,tclcmd_Puts,(ClientData)this,NULL);&lt;br&gt; &lt;br&gt;// 5. 然后就可用了, 如执行一个文件:&lt;br&gt;if ( Tcl_EvalFile( tcl_interp, config_file ) != TCL_OK ) {&lt;br&gt;   handle_error( 1, &amp;quot;error evalating %s: %s&amp;quot;, config_file,&lt;br&gt;     Tcl_GetStringResult( tcl_interp ) );&lt;br&gt;   &lt;br&gt;}&lt;br&gt;/////////////////////////////////////////////////////////////////////////////////// &lt;/div&gt;
&lt;div&gt;&lt;br&gt;更多参见nebula的nTclServer类，这个类还是非常简单的。&lt;br&gt;大概如下(注意这些都是我以前修改过的, 跟nebula中的有些少不一样):&lt;br&gt;// puts xxxxxxxxxxxxxxxxxxxxxxx&lt;br&gt;int tclcmd_Puts(ClientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST *objv)&lt;br&gt;{&lt;br&gt;    int retval     = TCL_OK;&lt;br&gt;    bool is_stdout = true;&lt;/div&gt;
&lt;div&gt;    // emulate puts behaviour but reroute output into Nebula kernel&lt;br&gt;    if (objc &amp;gt; 1) {&lt;br&gt;        bool newline = true;&lt;br&gt;        char *str = Tcl_GetString(objv[objc-1]);&lt;br&gt;        int i;&lt;br&gt;        for (i=1; i&amp;lt;(objc-1); i++) {&lt;br&gt;            char *s = Tcl_GetString(objv[i]);&lt;br&gt;            if (strcmp(s,&amp;quot;-nonewline&amp;quot;)==0) newline = false;&lt;br&gt;            else if (strcmp(s,&amp;quot;stdout&amp;quot;)!=0) is_stdout = false;&lt;br&gt;        }&lt;br&gt;        if (is_stdout) {&lt;br&gt;//++            nKernelServer::getSingleton().Print(str);&lt;br&gt;//            if (newline) nKernelServer::getSingleton().Print(&amp;quot;\n&amp;quot;);&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;    // hand control to original puts command&lt;br&gt;    if (!is_stdout) {&lt;br&gt;        retval = tcl_pipe_command(interp,&amp;quot;tcl_puts&amp;quot;,objc,objv);&lt;br&gt;    }&lt;br&gt;    return retval;&lt;br&gt;}&lt;/div&gt;
&lt;div&gt;//--------------------------------------------------------------------&lt;br&gt;bool nTclServer::runFunction(const char *cmd_str, const char*&amp;amp; result)&lt;br&gt;{&lt;br&gt;    result = 0;&lt;br&gt;    int errCode = Tcl_EvalEx(m_pInterp, (char *) cmd_str, -1, TCL_EVAL_DIRECT);&lt;br&gt;    Tcl_Obj *res = Tcl_GetObjResult(m_pInterp);&lt;br&gt;    result = Tcl_GetString(res);&lt;br&gt;    if (errCode == TCL_ERROR) {&lt;br&gt;//        n_printf(&amp;quot;*** Tcl error '%s'\n&amp;quot;, Tcl_GetString(res));&lt;br&gt;//        if (this-&amp;gt;GetFailOnError()) {&lt;br&gt;//            n_error(&amp;quot;Aborting.&amp;quot;);&lt;br&gt;//        }&lt;br&gt;  tcl_reportError(this-&amp;gt;print_error, result);&lt;br&gt;        return false;&lt;br&gt;    }&lt;br&gt;    return true;&lt;br&gt;}&lt;/div&gt;
&lt;div&gt;bool nTclServer::runScriptString(const char *szScript, const char*&amp;amp; result)&lt;br&gt;{&lt;br&gt;    result = 0;&lt;br&gt;    //int errCode = Tcl_EvalFile(this-&amp;gt;interp, buf);&lt;br&gt; int errCode = Tcl_EvalEx(m_pInterp, (char*)szScript, -1, TCL_EVAL_DIRECT);&lt;/div&gt;
&lt;div&gt;    Tcl_Obj *res = Tcl_GetObjResult(m_pInterp); &lt;br&gt;    result = Tcl_GetString(res);&lt;br&gt;    if (errCode == TCL_ERROR) &lt;br&gt;    {&lt;br&gt;//      n_printf(&amp;quot;*** Tcl error '%s' in file %s line %d.\n&amp;quot;, result, fname, this-&amp;gt;interp-&amp;gt;errorLine);&lt;br&gt;//      n_error(&amp;quot;Aborting.&amp;quot;);&lt;br&gt;  tcl_reportError(this-&amp;gt;print_error, result);&lt;br&gt;        return false;&lt;br&gt;    }             &lt;br&gt; return true;&lt;br&gt;}&lt;/div&gt;
&lt;div&gt;bool nTclServer::runScriptFile(const char *fname, const char*&amp;amp; result)&lt;br&gt;{&lt;br&gt;    char szFile[K_MAXPATH];&lt;br&gt;    result = 0;&lt;br&gt; nKernelServer::getSingleton().getFileServer()-&amp;gt;manglePath(fname,szFile,sizeof(szFile));&lt;/div&gt;
&lt;div&gt; // create and open file object&lt;br&gt; string strBuf = &amp;quot;&amp;quot;;&lt;br&gt; bool bSuccess = true;&lt;/div&gt;
&lt;div&gt;    kFile* file = nKernelServer::getSingleton().getFileServer()-&amp;gt;newFileObject();&lt;br&gt;    if ( file &amp;amp;&amp;amp; file-&amp;gt;open(szFile, &amp;quot;r&amp;quot;))&lt;br&gt;    {&lt;br&gt;  file-&amp;gt;seek(0, kFile::END);&lt;br&gt;  size_t len  = file-&amp;gt;tell(); &lt;br&gt;  if( 0 &amp;gt;= len ) &lt;br&gt;   return true;&lt;br&gt;  strBuf.reserve( len );&lt;br&gt;  size_t iPos = 0;&lt;br&gt;  file-&amp;gt;seek( 0, kFile::START );&lt;br&gt;  while (iPos &amp;lt; len) {&lt;br&gt;   char buf[1024];&lt;br&gt;   memset(buf, 0, sizeof(buf));&lt;br&gt;   size_t iBytesRead  = file-&amp;gt;read(buf, sizeof(buf)-1);&lt;br&gt;   strBuf += buf;&lt;br&gt;   iPos += iBytesRead;&lt;br&gt;   if (iBytesRead == 0) {&lt;br&gt;    bSuccess = false; &lt;br&gt;    break; &lt;br&gt;   }&lt;br&gt;  }&lt;br&gt;  delete file;&lt;br&gt;    }&lt;br&gt; else&lt;br&gt; {&lt;br&gt;//  n_printf(&amp;quot;can't open script file %s!\n&amp;quot;, fname);&lt;br&gt;  delete file;&lt;br&gt;  return false;&lt;br&gt; }&lt;br&gt;        &lt;br&gt; return runScriptString( strBuf.data(),result);&lt;br&gt;}&lt;/div&gt;
&lt;div&gt;bool nTclServer::runCommand(kCmd *c, const char*&amp;amp; result)&lt;br&gt;{&lt;br&gt;    c-&amp;gt;rewind();&lt;br&gt;    int len = c-&amp;gt;getNumInArgs();&lt;br&gt;    Tcl_Obj *tclCommand = Tcl_NewStringObj(c-&amp;gt;in()-&amp;gt;getS(), -1);&lt;br&gt;    for (int i = 0; i &amp;lt; len; i++) {&lt;br&gt;        Tcl_AppendToObj(tclCommand, &amp;quot; &amp;quot;, 1);&lt;br&gt;        Tcl_AppendObjToObj(tclCommand, KArg2TclObj(c-&amp;gt;in()));&lt;br&gt;    }&lt;br&gt;    int errCode = Tcl_EvalObjEx(m_pInterp, tclCommand,  TCL_EVAL_DIRECT);&lt;br&gt;    Tcl_Obj *res = Tcl_GetObjResult(m_pInterp);&lt;br&gt; result = Tcl_GetString(res);&lt;br&gt;    if (errCode == TCL_ERROR) {&lt;br&gt;//        n_printf(&amp;quot;*** Tcl error '%s'\n&amp;quot;, Tcl_GetString(res));&lt;br&gt;//        if (this-&amp;gt;GetFailOnError()) {&lt;br&gt;//            n_error(&amp;quot;Aborting.&amp;quot;);&lt;br&gt;//        }&lt;br&gt;  tcl_reportError(this-&amp;gt;print_error, result);&lt;br&gt;        return false;&lt;br&gt;    }&lt;br&gt;    return true;&lt;br&gt;}&lt;/div&gt;
&lt;div&gt;//--------------------------------------------------------------------&lt;br&gt;//--------------------------------------------------------------------&lt;br&gt;int tclcmd_Unknown(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST *objv)&lt;br&gt;{&lt;br&gt;    int retval = TCL_ERROR;&lt;br&gt;    ....&lt;br&gt;    这里主要分析一些扩展的语法：如&amp;quot;obj.fuction&amp;quot;, 调用自定义类函数。太多就不列了&lt;br&gt;}&lt;br&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+Tcl%e5%9c%a8%e7%a8%8b%e5%ba%8f%e4%b8%ad%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!971.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!971.entry</guid><pubDate>Sat, 28 Apr 2007 06:30:43 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!971/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!971.entry#comment</wfw:comment><dcterms:modified>2007-04-28T06:33:08Z</dcterms:modified></item><item><title>Lua文件处理</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!797.entry</link><description>&lt;div&gt;一。文件读存：&lt;/div&gt;
&lt;div&gt;-- 似乎不支持大文件(不能超过９k?):&lt;/div&gt;
&lt;div&gt;function opensavetest()&lt;br&gt;   local file = io.open(&amp;quot;c:\\in.lua&amp;quot;, &amp;quot;r&amp;quot;);&lt;br&gt;   if(file) then&lt;br&gt;   local data = file:read(&amp;quot;*a&amp;quot;); -- i've also tried &amp;quot;*all&amp;quot; as described in PIL&lt;br&gt;   file:close();&lt;br&gt;   file = io.open(&amp;quot;c:\\out.lua&amp;quot;, &amp;quot;w&amp;quot;);&lt;br&gt;   if(file) then&lt;br&gt;   file:write(data);&lt;br&gt;   file:close();&lt;br&gt;   end&lt;br&gt;   end&lt;br&gt;end&lt;br&gt;opensavetest();&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;二。非循环表格处理(见program in lua):&lt;/div&gt;
&lt;div&gt;HERO = 1  Monster = 2  Building = 3 SumUnit = 4 &lt;br&gt;cha = {}&lt;/div&gt;
&lt;div&gt;cha[1] = &lt;br&gt;{&lt;br&gt; basic = &lt;br&gt;  {&lt;br&gt;   Name = &amp;quot;农民&amp;quot; ,       --角色名称&lt;br&gt;   cha_type = HERO        --角色模型类型&lt;br&gt;  } , &lt;br&gt; Combat = &lt;br&gt;  {&lt;br&gt;     acquire = 600.00 ,       --主动攻击范围&lt;br&gt;     basic_def = 10        --基础防御&lt;br&gt;  }&lt;br&gt;}&lt;/div&gt;
&lt;div&gt;function serialize2( o)&lt;br&gt; if type(o) == &amp;quot;number&amp;quot; then&lt;br&gt;  g_file:write(o)&lt;br&gt; elseif type(o) == &amp;quot;string&amp;quot; then&lt;br&gt;  g_file:write(string.format(&amp;quot;%q&amp;quot;, o))&lt;br&gt; elseif type(o) == &amp;quot;table&amp;quot; then&lt;br&gt;  g_file:write(&amp;quot;{\n&amp;quot;)&lt;br&gt;  for k,v in pairs(o) do&lt;br&gt;   g_file:write(&amp;quot; [&amp;quot;)&lt;br&gt;   serialize2(k)&lt;br&gt;   g_file:write(&amp;quot;] = &amp;quot;)&lt;br&gt;   serialize2(v)&lt;br&gt;   g_file:write(&amp;quot;,\n&amp;quot;)&lt;br&gt;  end&lt;br&gt;  g_file:write(&amp;quot;}\n&amp;quot;)&lt;br&gt; else&lt;br&gt;  error(&amp;quot;cannot serialize a &amp;quot; .. type(o))&lt;br&gt; end&lt;br&gt;end&lt;/div&gt;
&lt;div&gt;function savetest ()&lt;br&gt; if g_file == nil then &lt;br&gt;      print(&amp;quot;error int 'savetest()'&amp;quot;);&lt;br&gt;      return;&lt;br&gt;   end &lt;br&gt; g_file:write(&amp;quot;cha = ｛｝\n&amp;quot;)&lt;br&gt; g_file:write(&amp;quot;cha[1] = ｛\n&amp;quot;)&lt;br&gt; serialize2( cha[1] ); &lt;br&gt; g_file:write(&amp;quot;｝\n&amp;quot;)&lt;br&gt;end&lt;/div&gt;
&lt;div&gt;g_file = io.open(&amp;quot;c:\\tt.lua&amp;quot;, &amp;quot;w&amp;quot;); &lt;br&gt;savetest();&lt;br&gt;g_file:close() &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;三。原program in lua中的保存带/不带循环的table&lt;br&gt;&lt;/div&gt;
&lt;div&gt;12.1.1 保存不带循环的table&lt;br&gt;我们下一个艰巨的任务是保存表。根据表的结构不同，采取的方法也有很多。没有一种单一的算法对所有情况都能很好地解决问题。简单的表不仅需要简单的算法而且输出文件也需要看起来美观。&lt;br&gt;我们第一次尝试如下：&lt;br&gt;function serialize (o)&lt;br&gt; if type(o) == &amp;quot;number&amp;quot; then&lt;br&gt;  io.write(o)&lt;br&gt; elseif type(o) == &amp;quot;string&amp;quot; then&lt;br&gt;  io.write(string.format(&amp;quot;%q&amp;quot;, o))&lt;br&gt; elseif type(o) == &amp;quot;table&amp;quot; then&lt;br&gt;  io.write(&amp;quot;{\n&amp;quot;)&lt;br&gt;  for k,v in pairs(o) do&lt;br&gt;   io.write(&amp;quot; &amp;quot;, k, &amp;quot; = &amp;quot;)&lt;br&gt;   serialize(v)&lt;br&gt;   io.write(&amp;quot;,\n&amp;quot;)&lt;br&gt;  end&lt;br&gt;  io.write(&amp;quot;}\n&amp;quot;)&lt;br&gt; else&lt;br&gt;  error(&amp;quot;cannot serialize a &amp;quot; .. type(o))&lt;br&gt; end&lt;br&gt;end&lt;br&gt;尽管代码很简单，但很好地解决了问题。只要表结构是一个树型结构（也就是说，没有共享的子表并且没有循环），上面代码甚至可以处理嵌套表（表中表）。对于所进不整齐的表我们可以少作改进使结果更美观，这可以作为一个练习尝试一下。（提示：增加一个参数表示缩进的字符串，来进行序列化）。前面的函数假定表中出现的所有关键字都是合法的标示符。如果表中有不符合Lua语法的数字关键字或者字符串关键字，上面的代码将碰到麻烦。一个简单的解决这个难题的方法是将：&lt;br&gt;io.write(&amp;quot; &amp;quot;, k, &amp;quot; = &amp;quot;)&lt;br&gt;改为&lt;br&gt;io.write(&amp;quot; [&amp;quot;)&lt;br&gt;serialize(k)&lt;br&gt;io.write(&amp;quot;] = &amp;quot;)&lt;br&gt;这样一来，我们改善了我们的函数的健壮性，比较一下两次的结果：&lt;br&gt;-- result of serialize{a=12, b='Lua', key='another &amp;quot;one&amp;quot;'}&lt;br&gt;-- 第一个版本&lt;br&gt;{&lt;br&gt;a = 12,&lt;br&gt;b = &amp;quot;Lua&amp;quot;,&lt;br&gt;key = &amp;quot;another \&amp;quot;one\&amp;quot;&amp;quot;,&lt;br&gt;}&lt;/div&gt;
&lt;div&gt;-- 第二个版本&lt;br&gt;{&lt;br&gt;[&amp;quot;a&amp;quot;] = 12,&lt;br&gt;[&amp;quot;b&amp;quot;] = &amp;quot;Lua&amp;quot;,&lt;br&gt;[&amp;quot;key&amp;quot;] = &amp;quot;another \&amp;quot;one\&amp;quot;&amp;quot;,&lt;br&gt;}&lt;br&gt;我们可以通过测试每一种情况，看是否需要方括号，另外，我们将这个问题留作一个练习给大家。&lt;br&gt;12.1.2 保存带有循环的table&lt;br&gt;针对普通拓扑概念上的带有循环表和共享子表的table，我们需要另外一种不同的方法来处理。构造器不能很好地解决这种情况，我们不使用。为了表示循环我们需要将表名记录下来，下面我们的函数有两个参数：table和对应的名字。另外，我们还必须记录已经保存过的table以防止由于循环而被重复保存。我们使用一个额外的table来记录保存过的表的轨迹，这个表的下表索引为table，而值为对应的表名。&lt;br&gt;我们做一个限制：要保存的table只有一个字符串或者数字关键字。下面的这个函数序列化基本类型并返回结果。&lt;br&gt;function basicSerialize (o)&lt;br&gt; if type(o) == &amp;quot;number&amp;quot; then&lt;br&gt;  return tostring(o)&lt;br&gt; else  -- assume it is a string&lt;br&gt;  return string.format(&amp;quot;%q&amp;quot;, o)&lt;br&gt; end&lt;br&gt;end&lt;br&gt;关键内容在接下来的这个函数，saved这个参数是上面提到的记录已经保存的表的踪迹的table。&lt;br&gt;function save (name, value, saved)&lt;br&gt; saved = saved or {}   -- initial value&lt;br&gt; io.write(name, &amp;quot; = &amp;quot;)&lt;br&gt; if type(value) == &amp;quot;number&amp;quot; or type(value) == &amp;quot;string&amp;quot; then&lt;br&gt;  io.write(basicSerialize(value), &amp;quot;\n&amp;quot;)&lt;br&gt; elseif type(value) == &amp;quot;table&amp;quot; then&lt;br&gt;  if saved[value] then  -- value already saved?&lt;br&gt;   -- use its previous name&lt;br&gt;   io.write(saved[value], &amp;quot;\n&amp;quot;)&lt;br&gt;  else&lt;br&gt;   saved[value] = name -- save name for next time&lt;br&gt;   io.write(&amp;quot;{}\n&amp;quot;)  -- create a new table&lt;br&gt;   for k,v in pairs(value) do -- save its fields&lt;br&gt;    local fieldname = string.format(&amp;quot;%s[%s]&amp;quot;, name,&lt;br&gt;           basicSerialize(k))&lt;br&gt;    save(fieldname, v, saved)&lt;br&gt;   end&lt;br&gt;  end&lt;br&gt; else&lt;br&gt;  error(&amp;quot;cannot save a &amp;quot; .. type(value))&lt;br&gt; end&lt;br&gt;end&lt;br&gt;举个例子：&lt;br&gt;我们将要保存的table为：&lt;br&gt;a = {x=1, y=2; {3,4,5}}&lt;br&gt;a[2] = a  -- cycle&lt;br&gt;a.z = a[1]  -- shared sub-table&lt;br&gt;调用save('a', a)之后结果为：&lt;br&gt;a = {}&lt;br&gt;a[1] = {}&lt;br&gt;a[1][1] = 3&lt;br&gt;a[1][2] = 4&lt;br&gt;a[1][3] = 5&lt;/div&gt;
&lt;div&gt;a[2] = a&lt;br&gt;a[&amp;quot;y&amp;quot;] = 2&lt;br&gt;a[&amp;quot;x&amp;quot;] = 1&lt;br&gt;a[&amp;quot;z&amp;quot;] = a[1]&lt;br&gt;（实际的顺序可能有所变化，它依赖于table遍历的顺序，不过，这个算法保证了一个新的定义中需要的前面的节点都已经被定义过）&lt;br&gt;如果我们想保存带有共享部分的表，我们可以使用同样table的saved参数调用save函数，例如我们创建下面两个表：&lt;br&gt;a = {{&amp;quot;one&amp;quot;, &amp;quot;two&amp;quot;}, 3}&lt;br&gt;b = {k = a[1]}&lt;br&gt;保存它们：&lt;br&gt;save('a', a)&lt;br&gt;save('b', b)&lt;br&gt;结果将分别包含相同部分：&lt;br&gt;a = {}&lt;br&gt;a[1] = {}&lt;br&gt;a[1][1] = &amp;quot;one&amp;quot;&lt;br&gt;a[1][2] = &amp;quot;two&amp;quot;&lt;br&gt;a[2] = 3&lt;br&gt;b = {}&lt;br&gt;b[&amp;quot;k&amp;quot;] = {}&lt;br&gt;b[&amp;quot;k&amp;quot;][1] = &amp;quot;one&amp;quot;&lt;br&gt;b[&amp;quot;k&amp;quot;][2] = &amp;quot;two&amp;quot;&lt;br&gt;然而如果我们使用同一个saved表来调用save函数：&lt;br&gt;local t = {}&lt;br&gt;save('a', a, t)&lt;br&gt;save('b', b, t)&lt;br&gt;结果将共享相同部分：&lt;br&gt;a = {}&lt;br&gt;a[1] = {}&lt;br&gt;a[1][1] = &amp;quot;one&amp;quot;&lt;br&gt;a[1][2] = &amp;quot;two&amp;quot;&lt;br&gt;a[2] = 3&lt;br&gt;b = {}&lt;br&gt;b[&amp;quot;k&amp;quot;] = a[1]&lt;br&gt;上面这种方法是Lua中常用的方法，当然也有其他一些方法可以解决问题。比如，我们可以不使用全局变量名来保存，即使用封包，用chunk构造一个local值然后返回之；通过构造一张表，每张表名与其对应的函数对应起来等。Lua给予你权力，由你决定如何实现。&lt;br&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+Lua%e6%96%87%e4%bb%b6%e5%a4%84%e7%90%86&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!797.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!797.entry</guid><pubDate>Fri, 07 Jul 2006 07:22:10 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!797/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!797.entry#comment</wfw:comment><dcterms:modified>2006-07-07T07:22:10Z</dcterms:modified></item><item><title>Output Lua Table To Html File  (转)</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!796.entry</link><description>&lt;div&gt;Output Lua Table To Html File  (转)&lt;br&gt; wiki &lt;/div&gt;
&lt;div&gt;来源:http://lua-users.org/wiki/OutputLuaTableToHtmlFile&lt;br&gt; &lt;br&gt; &lt;/div&gt;
&lt;div&gt;This sample code converts a Lua table into a html file that can be viewed by a browser showing different levels of the table nesting with different colors. The maximum level of nesting is set to 10, althought this can be easily tweaked for higher levels. &lt;br&gt;&lt;a href="mailto:dontspamme_samlie@yahoo.com"&gt;dontspamme_samlie@yahoo.com&lt;/a&gt; &lt;/div&gt;
&lt;div&gt;&lt;br&gt;Converts Lua Table to html output to table.html file&lt;br&gt;function tohtml(x) &lt;/div&gt;
&lt;div&gt;ret = tohtml_table(x,1) &lt;br&gt;writefile(&amp;quot;table.html&amp;quot;, ret) &lt;br&gt;os.execute(&amp;quot;table.html&amp;quot;) &lt;br&gt;return(ret) &lt;br&gt;end &lt;/div&gt;
&lt;div&gt;Saves a string to file&lt;br&gt;function writefile(filename, value) &lt;br&gt;if (value) then &lt;br&gt;local file = io.open(filename,&amp;quot;w+&amp;quot;) &lt;br&gt;file:write(value) &lt;br&gt;file:close() &lt;br&gt;end &lt;br&gt;end &lt;/div&gt;
&lt;div&gt;&lt;br&gt;Flattens a table to html output&lt;br&gt;function tohtml_table(x, table_level) &lt;/div&gt;
&lt;div&gt;local k, s, tcolor local html_colors = { &amp;quot;#339900&amp;quot;,&amp;quot;#33CC00&amp;quot;,&amp;quot;#669900&amp;quot;,&amp;quot;#666600&amp;quot;,&amp;quot;#FF3300&amp;quot;,&amp;quot;#FFCC00&amp;quot;,&amp;quot;#FFFF00&amp;quot;,&amp;quot;#CCFFCC&amp;quot;,&amp;quot;#CCCCFF&amp;quot;,&amp;quot;#CC66FF&amp;quot;, &lt;/div&gt;
&lt;div&gt;&amp;quot;#339900&amp;quot;,&amp;quot;#33CC00&amp;quot;,&amp;quot;#669900&amp;quot;,&amp;quot;#666600&amp;quot;,&amp;quot;#FF3300&amp;quot;,&amp;quot;#FFCC00&amp;quot;,&amp;quot;#FFFF00&amp;quot;,&amp;quot;#CCFFCC&amp;quot;,&amp;quot;#CCCCFF&amp;quot;,&amp;quot;#CC66FF&amp;quot; } &lt;br&gt;local lineout = {} local tablefound = false &lt;br&gt;if type(x) == &amp;quot;table&amp;quot; then &lt;br&gt;s = &amp;quot;&amp;quot; &lt;br&gt;k = 1 &lt;br&gt;local i, v = next(x) &lt;br&gt;while i do &lt;br&gt;if (type(v) == &amp;quot;table&amp;quot;) then &lt;br&gt;if (table_level&amp;lt;10) then &lt;br&gt;lineout[k] = &amp;quot;&amp;lt;b&amp;gt;&amp;quot; .. flat(i) .. &amp;quot;&amp;lt;/b&amp;gt;&amp;quot;.. tohtml_table(v, table_level + 1) &lt;br&gt;else &lt;br&gt;lineout[k] = &amp;quot;&amp;lt;b&amp;gt;MAXIMUM LEVEL BREACHED&amp;lt;/b&amp;gt;&amp;quot; &lt;br&gt;end &lt;br&gt;tablefound = true &lt;br&gt;else &lt;br&gt;lineout[k] = flat(i) .. &amp;quot;=&amp;quot; .. tohtml_table(v) &lt;br&gt;end &lt;br&gt;k = k + 1 &lt;br&gt;i, v = next(x, i) &lt;br&gt;end &lt;/div&gt;
&lt;div&gt;for k,line in lineout do &lt;br&gt;if (tablefound) then &lt;br&gt;s = s .. &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot; .. line .. &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\n&amp;quot; &lt;br&gt;else &lt;br&gt;s = s .. &amp;quot;&amp;lt;td&amp;gt;&amp;quot; .. line .. &amp;quot;&amp;lt;/td&amp;gt;\n&amp;quot; &lt;br&gt;end &lt;br&gt;end &lt;br&gt;if not (tablefound) then &lt;br&gt;s = &amp;quot;&amp;lt;table border='1' bgcolor='#FFFFCC' cellpadding='5' cellspacing='0'&amp;gt;&amp;quot; .. &lt;br&gt;&amp;quot;&amp;lt;tr&amp;gt;&amp;quot; .. s .. &amp;quot;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;\n&amp;quot; &lt;br&gt;else &lt;br&gt;tcolor = html_colors[table_level] &lt;br&gt;s = &amp;quot;&amp;lt;table border='3' bgcolor='&amp;quot;..tcolor..&amp;quot;' cellpadding='10' cellspacing='0'&amp;gt;&amp;quot; .. &lt;br&gt;s .. &amp;quot;&amp;lt;/table&amp;gt;\n&amp;quot; &lt;br&gt;end &lt;/div&gt;
&lt;div&gt;&lt;br&gt;return s &lt;br&gt;end &lt;br&gt;if type(x) == &amp;quot;function&amp;quot; then &lt;br&gt;return &amp;quot;FUNC&amp;quot; &lt;br&gt;end &lt;br&gt;if type(x) == &amp;quot;file&amp;quot; then &lt;br&gt;return &amp;quot;FILE&amp;quot; &lt;br&gt;end &lt;/div&gt;
&lt;div&gt;return tostring(x) &lt;br&gt;end &lt;/div&gt;
&lt;div&gt;Flattens a table to string&lt;br&gt;function flat(x) &lt;/div&gt;
&lt;div&gt;return toflat(x,1) &lt;br&gt;end &lt;/div&gt;
&lt;div&gt;Flattens a table to string&lt;br&gt;function toflat(x, tlevel) local s tlevel = tlevel + 1 &lt;/div&gt;
&lt;div&gt;&lt;br&gt;if type(x) == &amp;quot;table&amp;quot; then &lt;br&gt;s = &amp;quot;{&amp;quot; &lt;br&gt;local i, v = next(x) &lt;br&gt;while i do &lt;br&gt;if (tlevel &amp;lt; 15) then &lt;br&gt;s = s .. i .. &amp;quot;=&amp;quot; .. toflat(v, tlevel) &lt;br&gt;else &lt;br&gt;s = s .. i .. &amp;quot;={#}&amp;quot; &lt;br&gt;end &lt;/div&gt;
&lt;div&gt;i, v = next(x, i) &lt;br&gt;if i then &lt;br&gt;s = s .. &amp;quot;, &amp;quot; &lt;br&gt;end &lt;br&gt;end &lt;br&gt;return s .. &amp;quot;}\n&amp;quot; &lt;br&gt;end &lt;br&gt;if type(x) == &amp;quot;function&amp;quot; then &lt;br&gt;return &amp;quot;FUNC&amp;quot; &lt;br&gt;end &lt;br&gt;if type(x) == &amp;quot;file&amp;quot; then &lt;br&gt;return &amp;quot;FILE&amp;quot; &lt;br&gt;end &lt;/div&gt;
&lt;div&gt;return tostring(x) &lt;br&gt;end &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br&gt;FindPage · RecentChanges · preferences&lt;br&gt;edit · history&lt;br&gt;Last edited February 8, 2005 1:32 am GMT (diff)&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+Output+Lua+Table+To+Html+File++(%e8%bd%ac)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!796.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!796.entry</guid><pubDate>Fri, 07 Jul 2006 07:12:15 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!796/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!796.entry#comment</wfw:comment><dcterms:modified>2006-07-07T07:23:46Z</dcterms:modified></item><item><title>HTML语法大全(转)</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!214.entry</link><description>&lt;div&gt;                   &lt;font color="#00ffff" size=5&gt; HTML语法大全&lt;/font&gt; &lt;/div&gt;
&lt;div&gt;&lt;br&gt;--------------------------------------------------------------------------------&lt;/div&gt;
&lt;div&gt;　　 卷标 , 属性名称 , 简介 &lt;/div&gt;
&lt;div&gt; &amp;lt;! - - ... - -&amp;gt; 批注 &lt;br&gt; &amp;lt;!&amp;gt; 跑马灯 &lt;br&gt; &amp;lt;marquee&amp;gt;...&amp;lt;/marquee&amp;gt;普通卷动 &lt;br&gt; &amp;lt;marquee behavior=slide&amp;gt;...&amp;lt;/marquee&amp;gt;滑动 &lt;br&gt; &amp;lt;marquee behavior=scroll&amp;gt;...&amp;lt;/marquee&amp;gt;预设卷动 &lt;br&gt; &amp;lt;marquee behavior=alternate&amp;gt;...&amp;lt;/marquee&amp;gt;来回卷动 &lt;br&gt; &amp;lt;marquee direction=down&amp;gt;...&amp;lt;/marquee&amp;gt;向下卷动 &lt;br&gt; &amp;lt;marquee direction=up&amp;gt;...&amp;lt;/marquee&amp;gt;向上卷动 &lt;br&gt; &amp;lt;marquee direction=right&amp;gt;&amp;lt;/marquee&amp;gt;向右卷动 &lt;br&gt; &amp;lt;marquee direction=left&amp;gt;&amp;lt;/marquee&amp;gt;向左卷动 &lt;br&gt; &amp;lt;marquee loop=2&amp;gt;...&amp;lt;/marquee&amp;gt;卷动次数 &lt;br&gt; &amp;lt;marquee width=180&amp;gt;...&amp;lt;/marquee&amp;gt;设定宽度 &lt;br&gt; &amp;lt;marquee height=30&amp;gt;...&amp;lt;/marquee&amp;gt;设定高度 &lt;br&gt; &amp;lt;marquee bgcolor=FF0000&amp;gt;...&amp;lt;/marquee&amp;gt;设定背景颜色 &lt;br&gt; &amp;lt;marquee scrollamount=30&amp;gt;...&amp;lt;/marquee&amp;gt;设定卷动距离 &lt;br&gt; &amp;lt;marquee scrolldelay=300&amp;gt;...&amp;lt;/marquee&amp;gt;设定卷动时间 &lt;br&gt; &amp;lt;!&amp;gt;字体效果 &lt;br&gt; &amp;lt;h1&amp;gt;...&amp;lt;/h1&amp;gt;标题字(最大) &lt;br&gt; &amp;lt;h6&amp;gt;...&amp;lt;/h6&amp;gt;标题字(最小) &lt;br&gt; &amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt;粗体字 &lt;br&gt; &amp;lt;strong&amp;gt;...&amp;lt;/strong&amp;gt;粗体字(强调) &lt;br&gt; &amp;lt;i&amp;gt;...&amp;lt;/i&amp;gt;斜体字 &lt;br&gt; &amp;lt;em&amp;gt;...&amp;lt;/em&amp;gt;斜体字(强调) &lt;br&gt; &amp;lt;dfn&amp;gt;...&amp;lt;/dfn&amp;gt;斜体字(表示定义) &lt;br&gt; &amp;lt;u&amp;gt;...&amp;lt;/u&amp;gt;底线 &lt;br&gt; &amp;lt;ins&amp;gt;...&amp;lt;/ins&amp;gt;底线(表示插入文字) &lt;br&gt; &amp;lt;strike&amp;gt;...&amp;lt;/strike&amp;gt;横线 &lt;br&gt; &amp;lt;s&amp;gt;...&amp;lt;/s&amp;gt;删除线 &lt;br&gt; &amp;lt;del&amp;gt;...&amp;lt;/del&amp;gt;删除线(表示删除) &lt;br&gt; &amp;lt;kbd&amp;gt;...&amp;lt;/kbd&amp;gt;键盘文字 &lt;br&gt; &amp;lt;tt&amp;gt;...&amp;lt;/tt&amp;gt; 打字体 &lt;br&gt; &amp;lt;xmp&amp;gt;...&amp;lt;/xmp&amp;gt;固定宽度字体(在文件中空白、换行、定位功能有效) &lt;br&gt; &amp;lt;plaintext&amp;gt;...&amp;lt;/plaintext&amp;gt;固定宽度字体(不执行标记符号) &lt;br&gt; &amp;lt;listing&amp;gt;...&amp;lt;/listing&amp;gt; 固定宽度小字体 &lt;br&gt; &amp;lt;font color=00ff00&amp;gt;...&amp;lt;/font&amp;gt;字体颜色 &lt;br&gt; &amp;lt;font size=1&amp;gt;...&amp;lt;/font&amp;gt;最小字体 &lt;br&gt; &amp;lt;font style =font-size:100 px&amp;gt;...&amp;lt;/font&amp;gt;无限增大 &lt;br&gt; &amp;lt;!&amp;gt;区断标记 &lt;br&gt; &amp;lt;hr&amp;gt;水平线 &lt;br&gt; &amp;lt;hr size=9&amp;gt;水平线(设定大小) &lt;br&gt; &amp;lt;hr width=80%&amp;gt;水平线(设定宽度) &lt;br&gt; &amp;lt;hr color=ff0000&amp;gt;水平线(设定颜色) &lt;br&gt; &amp;lt;br&amp;gt;(换行) &lt;br&gt; &amp;lt;nobr&amp;gt;...&amp;lt;/nobr&amp;gt;水域(不换行) &lt;br&gt; &amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt;水域(段落) &lt;br&gt; &amp;lt;center&amp;gt;...&amp;lt;/center&amp;gt;置中 &lt;br&gt; &amp;lt;!&amp;gt;连结格式 &lt;br&gt; &amp;lt;base href=地址&amp;gt;(预设好连结路径) &lt;br&gt; &amp;lt;a href=地址&amp;gt;&amp;lt;/a&amp;gt;外部连结 &lt;br&gt; &amp;lt;a href=地址 target=_blank&amp;gt;&amp;lt;/a&amp;gt;外部连结(另开新窗口) &lt;br&gt; &amp;lt;a href=地址 target=_top&amp;gt;&amp;lt;/a&amp;gt;外部连结(全窗口连结) &lt;br&gt; &amp;lt;a href=地址 target=页框名&amp;gt;&amp;lt;/a&amp;gt;外部连结(在指定页框连结) &lt;br&gt; &amp;lt;!&amp;gt;贴图/音乐 &lt;br&gt; &amp;lt;img src=图片地址&amp;gt;贴图 &lt;br&gt; &amp;lt;img src=图片地址 width=180&amp;gt;设定图片宽度 &lt;br&gt; &amp;lt;img src=图片地址 height=30&amp;gt;设定图片高度 &lt;br&gt; &amp;lt;img src=图片地址 alt=提示文字&amp;gt;设定图片提示文字 &lt;br&gt; &amp;lt;img src=图片地址 border=1&amp;gt;设定图片边框 &lt;br&gt; &amp;lt;bgsound src=MID音乐文件地址&amp;gt;背景音乐设定 &lt;br&gt; &amp;lt;!&amp;gt;表格语法 &lt;br&gt; &amp;lt;table aling=left&amp;gt;...&amp;lt;/table&amp;gt;表格位置,置左 &lt;br&gt; &amp;lt;table aling=center&amp;gt;...&amp;lt;/table&amp;gt;表格位置,置中 &lt;br&gt; &amp;lt;table background=图片路径&amp;gt;...&amp;lt;/table&amp;gt;背景图片的URL=就是路径网址 &lt;br&gt; &amp;lt;table border=边框大小&amp;gt;...&amp;lt;/table&amp;gt;设定表格边框大小(使用数字) &lt;br&gt; &amp;lt;table bgcolor=颜色码&amp;gt;...&amp;lt;/table&amp;gt;设定表格的背景颜色 &lt;br&gt; &amp;lt;table borderclor=颜色码&amp;gt;...&amp;lt;/table&amp;gt;设定表格边框的颜色 &lt;br&gt; &amp;lt;table borderclordark=颜色码&amp;gt;...&amp;lt;/table&amp;gt;设定表格暗边框的颜色 &lt;br&gt; &amp;lt;table borderclorlight=颜色码&amp;gt;...&amp;lt;/table&amp;gt;设定表格亮边框的颜色 &lt;br&gt; &amp;lt;table cellpadding=参数&amp;gt;...&amp;lt;/table&amp;gt;指定内容与网格线之间的间距(使用数字) &lt;br&gt; &amp;lt;table cellspacing=参数&amp;gt;...&amp;lt;/table&amp;gt;指定网格线与网格线之间的距离(使用数字) &lt;br&gt; &amp;lt;table cols=参数&amp;gt;...&amp;lt;/table&amp;gt;指定表格的栏数 &lt;br&gt; &amp;lt;table frame=参数&amp;gt;...&amp;lt;/table&amp;gt;设定表格外框线的显示方式 &lt;br&gt; &amp;lt;table width=宽度&amp;gt;...&amp;lt;/table&amp;gt;指定表格的宽度大小(使用数字) &lt;br&gt; &amp;lt;table height=高度&amp;gt;...&amp;lt;/table&amp;gt;指定表格的高度大小(使用数字) &lt;br&gt; &amp;lt;td colspan=参数&amp;gt;...&amp;lt;/td&amp;gt;指定储存格合并栏的栏数(使用数字) &lt;br&gt; &amp;lt;td rowspan=参数&amp;gt;...&amp;lt;/td&amp;gt;指定储存格合并列的列数(使用数字) &lt;br&gt; &amp;lt;!&amp;gt;分割窗口 &lt;br&gt; &amp;lt;frameset cols=&amp;quot;20%,*&amp;quot;&amp;gt;左右分割,将左边框架分割大小为20%右边框架的大小浏览器会自动调整 &lt;br&gt; &amp;lt;frameset rows=&amp;quot;20%,*&amp;quot;&amp;gt;上下分割,将上面框架分割大小为20%下面框架的大小浏览器会自动调整 &lt;br&gt; &amp;lt;frameset cols=&amp;quot;20%,*&amp;quot;&amp;gt;分割左右两个框架 &lt;br&gt; &amp;lt;frameset cols=&amp;quot;20%,*,20%&amp;quot;&amp;gt;分割左中右三个框架 &lt;br&gt; &amp;lt;分割上下两个框架 &lt;br&gt; &amp;lt;frameset rows=&amp;quot;20%,*,20%&amp;quot;&amp;gt;分割上中下三个框架 &lt;br&gt; &amp;lt;! - - ... - -&amp;gt; 批注 &lt;br&gt; &amp;lt;A HREF TARGET&amp;gt; 指定超级链接的分割窗口 &lt;br&gt; &amp;lt;A HREF=#锚的名称&amp;gt; 指定锚名称的超级链接 &lt;br&gt; &amp;lt;A HREF&amp;gt; 指定超级链接 &lt;br&gt; &amp;lt;A NAME=锚的名称&amp;gt; 被连结点的名称 &lt;br&gt; &amp;lt;ADDRESS&amp;gt;....&amp;lt;/ADDRESS&amp;gt; 用来显示电子邮箱地址 &lt;br&gt; &amp;lt;B&amp;gt; 粗体字 &lt;br&gt; &amp;lt;BASE TARGET&amp;gt; 指定超级链接的分割窗口 &lt;br&gt; &amp;lt;BASEFONT SIZE&amp;gt; 更改预设字形大小 &lt;br&gt; &amp;lt;BGSOUND SRC&amp;gt; 加入背景音乐 &lt;br&gt; &amp;lt;BIG&amp;gt; 显示大字体 &lt;br&gt; &amp;lt;BLINK&amp;gt; 闪烁的文字 &lt;br&gt; &amp;lt;BODY TEXT LINK VLINK&amp;gt; 设定文字颜色 &lt;br&gt; &amp;lt;BODY&amp;gt; 显示本文 &lt;br&gt; &amp;lt;BR&amp;gt; 换行 &lt;br&gt; &amp;lt;CAPTION ALIGN&amp;gt; 设定表格标题位置 &lt;br&gt; &amp;lt;CAPTION&amp;gt;...&amp;lt;/CAPTION&amp;gt; 为表格加上标题 &lt;br&gt; &amp;lt;CENTER&amp;gt; 向中对齐 &lt;br&gt; &amp;lt;CITE&amp;gt;...&amp;lt;CITE&amp;gt; 用于引经据典的文字 &lt;br&gt; &amp;lt;CODE&amp;gt;...&amp;lt;/CODE&amp;gt; 用于列出一段程序代码 &lt;br&gt; &amp;lt;COMMENT&amp;gt;...&amp;lt;/COMMENT&amp;gt; 加上批注 &lt;br&gt; &amp;lt;DD&amp;gt; 设定定义列表的项目解说 &lt;br&gt; &amp;lt;DFN&amp;gt;...&amp;lt;/DFN&amp;gt; 显示&amp;quot;定义&amp;quot;文字 &lt;br&gt; &amp;lt;DIR&amp;gt;...&amp;lt;/DIR&amp;gt; 列表文字卷标 &lt;br&gt; &amp;lt;DL&amp;gt;...&amp;lt;/DL&amp;gt; 设定定义列表的卷标 &lt;br&gt; &amp;lt;DT&amp;gt; 设定定义列表的项目 &lt;br&gt; &amp;lt;EM&amp;gt; 强调之用 &lt;br&gt; &amp;lt;FONT FACE&amp;gt; 任意指定所用的字形 &lt;br&gt; &amp;lt;FONT SIZE&amp;gt; 设定字体大小 &lt;br&gt; &amp;lt;FORM ACTION&amp;gt; 设定户动式窗体的处理方式 &lt;br&gt; &amp;lt;FORM METHOD&amp;gt; 设定户动式窗体之资料传送方式 &lt;br&gt; &amp;lt;FRAME MARGINHEIGHT&amp;gt; 设定窗口的上下边界 &lt;br&gt; &amp;lt;FRAME MARGINWIDTH&amp;gt; 设定窗口的左右边界 &lt;br&gt; &amp;lt;FRAME NAME&amp;gt; 为分割窗口命名 &lt;br&gt; &amp;lt;FRAME NORESIZE&amp;gt; 锁住分割窗口的大小 &lt;br&gt; &amp;lt;FRAME SCROLLING&amp;gt; 设定分割窗口的滚动条 &lt;br&gt; &amp;lt;FRAME SRC&amp;gt; 将HTML文件加入窗口 &lt;br&gt; &amp;lt;FRAMESET COLS&amp;gt; 将窗口分割成左右的子窗口 &lt;br&gt; &amp;lt;FRAMESET ROWS&amp;gt; 将窗口分割成上下的子窗口 &lt;br&gt; &amp;lt;FRAMESET&amp;gt;...&amp;lt;/FRAMESET&amp;gt; 划分分割窗口 &lt;br&gt; &amp;lt;H1&amp;gt;~&amp;lt;H6&amp;gt; 设定文字大小 &lt;br&gt; &amp;lt;HEAD&amp;gt; 标示文件信息 &lt;br&gt; &amp;lt;HR&amp;gt; 加上分网格线 &lt;br&gt; &amp;lt;HTML&amp;gt; 文件的开始与结束 &lt;br&gt; &amp;lt;I&amp;gt; 斜体字 &lt;br&gt; &amp;lt;IMG ALIGN&amp;gt; 调整图形影像的位置 &lt;br&gt; &amp;lt;IMG ALT&amp;gt; 为你的图形影像加注 &lt;br&gt; &amp;lt;IMG DYNSRC LOOP&amp;gt; 加入影片 &lt;br&gt; &amp;lt;IMG HEIGHT WIDTH&amp;gt; 插入图片并预设图形大小 &lt;br&gt; &amp;lt;IMG HSPACE&amp;gt; 插入图片并预设图形的左右边界 &lt;br&gt; &amp;lt;IMG LOWSRC&amp;gt; 预载图片功能 &lt;br&gt; &amp;lt;IMG SRC BORDER&amp;gt; 设定图片边界 &lt;br&gt; &amp;lt;IMG SRC&amp;gt; 插入图片 &lt;br&gt; &amp;lt;IMG VSPACE&amp;gt; 插入图片并预设图形的上下边界 &lt;br&gt; &amp;lt;INPUT TYPE NAME value&amp;gt; 在窗体中加入输入字段 &lt;br&gt; &amp;lt;ISINDEX&amp;gt; 定义查询用窗体 &lt;br&gt; &amp;lt;KBD&amp;gt;...&amp;lt;/KBD&amp;gt; 表示使用者输入文字 &lt;br&gt; &amp;lt;LI TYPE&amp;gt;...&amp;lt;/LI&amp;gt; 列表的项目 ( 可指定符号 ) &lt;br&gt; &amp;lt;MARQUEE&amp;gt; 跑马灯效果 &lt;br&gt; &amp;lt;MENU&amp;gt;...&amp;lt;/MENU&amp;gt; 条列文字卷标 &lt;br&gt; &amp;lt;META NAME=&amp;quot;REFRESH&amp;quot; CONTENT URL&amp;gt; 自动更新文件内容 &lt;br&gt; &amp;lt;MULTIPLE&amp;gt; 可同时选择多项的列表栏 &lt;br&gt; &amp;lt;NOFRAME&amp;gt; 定义不出现分割窗口的文字 &lt;br&gt; &amp;lt;OL&amp;gt;...&amp;lt;/OL&amp;gt; 有序号的列表 &lt;br&gt; &amp;lt;OPTION&amp;gt; 定义窗体中列表栏的项目 &lt;br&gt; &amp;lt;P ALIGN&amp;gt; 设定对齐方向 &lt;br&gt; &amp;lt;P&amp;gt; 分段 &lt;br&gt; &amp;lt;PERSON&amp;gt;...&amp;lt;/PERSON&amp;gt; 显示人名 &lt;br&gt; &amp;lt;PRE&amp;gt; 使用原有排列 &lt;br&gt; &amp;lt;SAMP&amp;gt;...&amp;lt;/SAMP&amp;gt; 用于引用字 &lt;br&gt; &amp;lt;SELECT&amp;gt;...&amp;lt;/SELECT&amp;gt; 在窗体中定义列表栏 &lt;br&gt; &amp;lt;SMALL&amp;gt; 显示小字体 &lt;br&gt; &amp;lt;STRIKE&amp;gt; 文字加横线 &lt;br&gt; &amp;lt;STRONG&amp;gt; 用于加强语气 &lt;br&gt; &amp;lt;SUB&amp;gt; 下标字 &lt;br&gt; &amp;lt;SUP&amp;gt; 上标字 &lt;br&gt; &amp;lt;TABLE BORDER=n&amp;gt; 调整表格的宽线高度 &lt;br&gt; &amp;lt;TABLE CELLPADDING&amp;gt; 调整数据域位之边界 &lt;br&gt; &amp;lt;TABLE CELLSPACING&amp;gt; 调整表格线的宽度 &lt;br&gt; &amp;lt;TABLE HEIGHT&amp;gt; 调整表格的高度 &lt;br&gt; &amp;lt;TABLE WIDTH&amp;gt; 调整表格的宽度 &lt;br&gt; &amp;lt;TABLE&amp;gt;...&amp;lt;/TABLE&amp;gt; 产生表格的卷标 &lt;br&gt; &amp;lt;TD ALIGN&amp;gt; 调整表格字段之左右对齐 &lt;br&gt; &amp;lt;TD BGCOLOR&amp;gt; 设定表格字段之背景颜色 &lt;br&gt; &amp;lt;TD COLSPAN ROWSPAN&amp;gt; 表格字段的合并 &lt;br&gt; &amp;lt;TD NOWRAP&amp;gt; 设定表格字段不换行 &lt;br&gt; &amp;lt;TD VALIGN&amp;gt; 调整表格字段之上下对齐 &lt;br&gt; &amp;lt;TD WIDTH&amp;gt; 调整表格字段宽度 &lt;br&gt; &amp;lt;TD&amp;gt;...&amp;lt;/TD&amp;gt; 定义表格的数据域位 &lt;br&gt; &amp;lt;TEXTAREA NAME ROWS COLS&amp;gt; 窗体中加入多少列的文字输入栏 &lt;br&gt; &amp;lt;TEXTAREA WRAP&amp;gt; 决定文字输入栏是自动否换行 &lt;br&gt; &amp;lt;TH&amp;gt;...&amp;lt;/TH&amp;gt; 定义表格的标头字段 &lt;br&gt; &amp;lt;TITLE&amp;gt; 文件标题 &lt;br&gt; &amp;lt;TR&amp;gt;...&amp;lt;/TR&amp;gt; 定义表格美一行 &lt;br&gt; &amp;lt;TT&amp;gt; 打字机字体 &lt;br&gt; &amp;lt;U&amp;gt; 文字加底线 &lt;br&gt; &amp;lt;UL TYPE&amp;gt;...&amp;lt;/UL&amp;gt; 无序号的列表 ( 可指定符号 ) &lt;br&gt; &amp;lt;VAR&amp;gt;...&amp;lt;/VAR&amp;gt; 用于显示变量 &lt;br&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+HTML%e8%af%ad%e6%b3%95%e5%a4%a7%e5%85%a8(%e8%bd%ac)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!214.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!214.entry</guid><pubDate>Wed, 30 Nov 2005 11:51:01 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!214/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!214.entry#comment</wfw:comment><dcterms:modified>2005-12-06T05:36:13Z</dcterms:modified></item><item><title>类xml或html格式简单分析</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!212.entry</link><description>&lt;div&gt;                   &lt;font color="#00ffff" size=5&gt;类xml或html格式简单分析&lt;/font&gt; &lt;/div&gt;
&lt;div&gt;--------------------------------------------------------------------------------------------------------------------&lt;/div&gt;
&lt;p&gt;有个做浏览器的网友问了一下类xml或html格式分析，下面是我的简单想法，放这备份一下，
&lt;p&gt;有兴趣的人可以交流一下:
&lt;p&gt;昨晚说的那个树的实现方式我想了一下，现在把大概实现发给你看有没有帮助,&lt;br&gt;其实这你要实现的可能跟以前我们在一个mmo中实现的帮助类似，我们的帮助是这样的&lt;br&gt;当你在游戏中按下帮助按钮，会通过http的方式下载一个页面文件，该面面文件格式大概&lt;br&gt;如下:&lt;br&gt;&amp;lt;Text&amp;gt; 帮助 &amp;lt;/Text&amp;gt;&lt;br&gt;&amp;lt;Text url=http://www.xxx.com/help.txt&amp;gt; 任务 &amp;lt;/Text&amp;gt;&lt;br&gt;&amp;lt;Text url=http://www.xxx.com/consortia.txt&amp;gt; 公会 &amp;lt;/Text&amp;gt;&lt;br&gt;.....&lt;br&gt;我们的实现就是定义一个结构，内部有一个url指针和一个字符串，&lt;br&gt;然后在下载到这样的页文件后，给每一个&amp;lt;Text&amp;gt;内容&amp;lt;/Text&amp;gt;块产生一个这样的结构对象并加到&lt;br&gt;列表中，最后在处理时发现如果url指针不为空时就产生一个超链接控件（带下划线的文本）供点击，&lt;br&gt;否则只产生文本显示。&lt;br&gt;而如果你想产生类似于xml或html格式文本的话我想是可以考虑在前述方式上扩充的,例如要处理如下的例子:
&lt;p&gt;&amp;lt;Title&amp;gt; 飘零风雨亭 &amp;lt;/Title&amp;gt;&lt;br&gt;&amp;lt;Bobdy&amp;gt;&lt;br&gt;   &amp;lt;Text align=&amp;quot;center&amp;quot; &amp;gt; 欢迎光临 &amp;lt;/Text&amp;gt;&lt;br&gt;   &amp;lt;Text font=&amp;quot;宋体&amp;quot; posx=100 posy=200&amp;gt; 新闻 &amp;lt;Text url=&amp;quot;&lt;a href="http://www.xxxx.com/"&gt;http://www.xxxx.com&lt;/a&gt;&amp;quot;&amp;gt; 点击这里进入 &amp;lt;/Text&amp;gt; &amp;lt;/Text&amp;gt;&lt;br&gt;   &amp;lt;Img w=100 h=200&amp;gt; &lt;a href="http://www.xxxx.com/hello.gif"&gt;http://www.xxxx.com/hello.gif&lt;/a&gt; &amp;lt;/Img&amp;gt;&lt;br&gt;&amp;lt;/Bobdy&amp;gt;
&lt;p&gt;上述第一行是标题，每３行是一个字串，每4行是一个字串(&amp;quot;新闻&amp;quot;)和一个超链接(&amp;quot;点击这里&amp;quot;)&lt;br&gt;第5行是一个图片路径
&lt;p&gt;我的处理方法是用树的方式来处理，每一个块(以&amp;lt;TAG&amp;gt;和&amp;lt;/TAG&amp;gt;对称成为一个块)作为一个结点，&lt;br&gt;每个结点中有一个结点属性对象和一个子结点列表。结构如下:&lt;br&gt;1.属性类, 这个分为基类和从基类派生的各个Tag属性类, 这些属性是为结点服务的，就是说&lt;br&gt;每个结点都包含有一个对应的属性对象:&lt;br&gt;// 属性基类&lt;br&gt;class kPropBase{&lt;br&gt;   kAlign align;  &lt;br&gt;   int posx;&lt;br&gt;   int posy;&lt;br&gt;   // 除了下面这个用来储存在块的两个Tag之间的字符串之外，&lt;br&gt;   // 其它的变量存的是参数值（即&amp;lt;Tag param1 param2 ...&amp;gt;中的param）&lt;br&gt;   std::string strData; &lt;br&gt;public:&lt;br&gt;   virtual bool Update() = 0; // 需要更新的原因是有些界面元素会作变色位移等动画（可以考虑关键帧动画）&lt;br&gt;   virtual bool Draw()   = 0; // 画出&lt;br&gt;   // 下面这个是处理从对应的块字串中取对应值赋予此类参数和数据串。&lt;br&gt;   // szBlock参数存的就是块字串，象:&amp;quot;&amp;lt;Text align=&amp;quot;center&amp;quot; &amp;gt; 欢迎光临 &amp;lt;/Text&amp;gt;&amp;quot;&lt;br&gt;   virtual void ProcessBlock( const char *szBlock ) = 0;&lt;br&gt;   //...&lt;br&gt;};&lt;br&gt;// 标题属性类:&lt;br&gt;class kPropTitle : public kPropBase{&lt;br&gt;public:&lt;br&gt; //...&lt;br&gt;}&lt;br&gt;// Body属性类:&lt;br&gt;class kPropBody : public kPropBase{&lt;br&gt;   //...&lt;br&gt;}&lt;br&gt;// 文本属性类:&lt;br&gt;class kPropText : public kPropBase{&lt;br&gt;   kFont font;&lt;br&gt;   //...&lt;br&gt;};&lt;br&gt;// 图片属性类:&lt;br&gt;class kPropImg : public kPropBase{&lt;br&gt;   std::string strUrl;&lt;br&gt;   //...&lt;br&gt;};
&lt;p&gt;2. 结点类, 第１个是类型（如文本，图片等）, 第２个是属性（这里用它的属性基类指针，&lt;br&gt;可以判断第１个变量看是什么类型从而强制转化成对应派生类对象指针进行处理），第３个是所有子结点&lt;br&gt;class kNode{  &lt;br&gt;   E_TAG     eType;&lt;br&gt;   kPropBase *pData;&lt;br&gt;   std::vector&amp;lt; kNode &amp;gt;  vecChild;&lt;br&gt;};
&lt;p&gt;上面结构我想应该还是比较晰，就不说明了&lt;br&gt;在处理字串碰到块的开始和结束如果要严格配对时可这么作，在开始时，如检查到&amp;lt;Text&amp;gt;开头，&lt;br&gt;我们push Text这个flag, 然后在碰到&amp;lt;/Text&amp;gt;时Pop Flag, 看是否相等，不等就是不配对提示出错。
&lt;p&gt; &lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+%e7%b1%bbxml%e6%88%96html%e6%a0%bc%e5%bc%8f%e7%ae%80%e5%8d%95%e5%88%86%e6%9e%90&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!212.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!212.entry</guid><pubDate>Wed, 30 Nov 2005 03:09:46 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!212/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!212.entry#comment</wfw:comment><dcterms:modified>2005-12-06T05:39:20Z</dcterms:modified></item><item><title>脚本</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!124.entry</link><description>&lt;div&gt;1. lua 手册&lt;br&gt;http://www.gamedev.net/reference/programming/features/lua/ 
&lt;p&gt;
&lt;p&gt;Programming in Lua:&lt;br&gt;http://www.lua.org/pil/&lt;br&gt;2. 一个简单例子&lt;br&gt;width=800;&lt;br&gt;height=600;
&lt;p&gt;BLUE={r=0, g=0, b=255};&lt;br&gt;background=BLUE;
&lt;p&gt;function hello()&lt;br&gt;  a = 5;&lt;br&gt;  b = 10;&lt;br&gt;  c = a + b;&lt;br&gt;  print (&amp;quot;5+10=&amp;quot; .. c);&lt;br&gt;  test(c);&lt;br&gt;end
&lt;p&gt;function f(x, y)&lt;br&gt;  return (x^2 * sin(y))/(1-x);&lt;br&gt;end
&lt;p&gt;hello()
&lt;p&gt;&lt;br&gt;二。自己实现一个简单的脚本&lt;br&gt;//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&lt;br&gt;//                          flipcode@msn.com&lt;br&gt;//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&lt;br&gt;// 以下说明一个简单的脚本实现原理
&lt;p&gt;这是很早以前实现的类c脚本语言。(这篇文章也是当初所写)&lt;br&gt;1。读入脚本&lt;br&gt;2。语法分析,并按优先级递归生成对应2叉树&lt;br&gt;3。倒序递归解释2叉树，并调用对应自己所写的代码
&lt;p&gt;[祥细如下:]
&lt;p&gt;一、起步：先说明表达式的处理(热身运动)&lt;br&gt;例: a=1+obj.fun(&amp;quot;price&amp;quot;,5)+2; &lt;br&gt; a.表达式的分析:&lt;br&gt;  //(建立函数Create2Tree(root,s)其中s字符中的内容是上述的表达式)&lt;br&gt;　//(1)找出字符串（即参数）中最低级的运算符，以该操作符为中心将字符串分为两半&lt;br&gt;  //(2)root=该操作符(及你需要的其它各信息)&lt;br&gt;  //(3)root-&amp;gt;left=new STree;s1=左边字符串;把root=root-&amp;gt;left及s1当参数跳到第(1)步继续(即回归处理);&lt;br&gt;  //(4)root-&amp;gt;right=new STree;s2=右边字符串;把root=root-&amp;gt;right及s2当参数跳到第(1)步继续(即回归处理)&lt;br&gt;　//(5)直到剩下变量或函数（包括对象函数）及常量(),再用root保存相关信息&lt;br&gt;  //(这样就可生成如下2叉树:)&lt;br&gt;          =&lt;br&gt;       a    + &lt;br&gt;          1   +
&lt;p&gt;        obj.fun   2 
&lt;p&gt;        &amp;quot;price&amp;quot;   5
&lt;p&gt; b.表达式的解释：&lt;br&gt;　 用vector&amp;lt;*op&amp;gt;存下如下函数的地址:&lt;br&gt;   ProcVer{stack.push(&amp;amp;a);}                &lt;br&gt;   ProcNum{push(1);}                     &lt;br&gt;   ProcNum{push(2);}                      &lt;br&gt;   ProcFun{?push(obj.fun(pop(),pop()));}//注意参数要从右到左出栈,?号表示如果函数有返回值则压栈!&lt;br&gt;      //这里假设你已能得到该函数的地址(通过预设一份静态的函数名与函数地址对应的映射表查询得到)&lt;br&gt;   ProcNum{push(2);}&lt;br&gt;   ProcAdd{push(pop()+pop());}&lt;br&gt;   ProcAdd{push(pop()+pop());}&lt;br&gt;   ProcAssign{*(sp-2)=pop();}&lt;br&gt;   //最后a的值就可用pop()取出&lt;br&gt; c.表达式的执行&lt;br&gt; &lt;br&gt;------------------------------------------------------------------------------------------------&lt;br&gt;三、完整脚本的举例说明&lt;br&gt;脚本如下:&lt;br&gt;int row=5,b=-1,ires;&lt;br&gt;ListBox lb1;&lt;br&gt;while(row=row+b)&lt;br&gt;    ires=1+obj.fun(1,12)+2; &lt;br&gt;endwhile&lt;br&gt;//.......
&lt;p&gt;　1。定义的分析:&lt;br&gt;        首先是否存在关键字int及是否存在ListBox类(相当于vb中控件类,但它是可视的,vb中你要用控件的前提是控件栏中必须有此控件你才可拖拉到窗体.这里你要用这个ListBox东东(类)的前提是必须存在这个类)，&lt;br&gt;     不存在则: &lt;br&gt;         提示错误!&lt;br&gt;     存在则：&lt;br&gt;         a.是定义变量的生成对应的内存空间，并加入到ver_map(变量名，变量地址)映射表(如第一行)&lt;br&gt;         b.是定义对象的创建对象,并进行初始化。并加入到obj_map(对象名，对象地址)映射表(如第二行)&lt;br&gt;(相当于vb中拖了一个列表框到窗口上，此时它会生成一个列表框对象)
&lt;p&gt;  2。表达式的分析与解释:&lt;br&gt;  　 用大概类似于struct {void (*op)(void) VCode[1000];int ip}VMachine这样的结构存下如下&lt;br&gt;&amp;quot;Procxxx&amp;quot;之类的函数的地址:&lt;br&gt;     //先处理while(row=row+h):&lt;br&gt;     ProcVer{push(&amp;amp;row);} &lt;br&gt;     ProcVer{push(&amp;amp;h);}   &lt;br&gt;     ProcAdd{push(pop()+pop());} &lt;br&gt;     ProcVer{push(&amp;amp;row);}        &lt;br&gt;     ProcAssign{*(sp-2)=pop();}  &lt;br&gt;     ProcWhile{WhileIP.push(ip);while(!pop().value &amp;amp;&amp;amp; pop().name!=&amp;quot;endwhile&amp;quot;)pop();} 
&lt;p&gt;     //再处理ires=1+obj.fun(1,2)+2:&lt;br&gt;     ProcNum{push(1);}                &lt;br&gt;     ProcNum{push(12);}                &lt;br&gt;     ProcFun{?push(obj.fun(pop(),pop()));}//注意参数要从右到左出栈,?号表示如果函数有返回值则压栈!&lt;br&gt;      //这里假设你已能得到该函数的地址(通过预设一份静态的函数名与函数地址对应的映射表查询得到)&lt;br&gt;     ProcNum{push(2);}                &lt;br&gt;     ProcAdd{push(pop()+pop());}&lt;br&gt;     ProcNum{push(1);}                &lt;br&gt;     ProcVer{push(&amp;amp;ires);}                &lt;br&gt;     ProcAdd{push(pop()+pop());}&lt;br&gt;     ProcAssign{*(sp-2)=pop();}
&lt;p&gt;     //然后处理endwhile:&lt;br&gt;     ProcEndwhile(ip=WhileIP.pop()-1);&lt;br&gt;     //.......          &lt;br&gt;     NULL;
&lt;p&gt;  3。脚本语言的执行&lt;br&gt;     VMachine.ip=0;&lt;br&gt;     while(VMachine.VCode[VMachine.ip].op != NULL)&lt;br&gt;     {&lt;br&gt;         (*VMachine.VCode[VMachine.ip].op)();&lt;br&gt; VMachine.ip].op++;&lt;br&gt;     }
&lt;p&gt;                                                        flipcode   2001.12&lt;br&gt;  
&lt;p&gt;
&lt;p&gt;三、老外的一个完整的脚本语言教程(基本原理类同上述第二点)&lt;br&gt;http://www.peroxide.dk/tuts_scr.shtml
&lt;p&gt;                                                                 
&lt;p&gt;&lt;br&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+%e8%84%9a%e6%9c%ac&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!124.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!124.entry</guid><pubDate>Fri, 25 Nov 2005 03:20:49 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!124/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!124.entry#comment</wfw:comment><dcterms:modified>2005-11-27T05:29:55Z</dcterms:modified></item></channel></rss>