簡單的lua教程

 一。lua 腳本: 
1. lua 手冊
Programming in Lua:
http://www.lua.org/pil/
2. 一個簡單例子
width=800;
height=600;

BLUE={r=0, g=0, b=255};
BLUE;< /span>

function hello()
a = 5;
b = 10;
c = a + b;
print ("5+10=" .. c);
test(c);
end

function f(x, y)
return (x^2 * sin(y))/(1-x);
end

hello()


二。自己實現一個簡單的腳本
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// [email protected]
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// 以下說明一個簡單的腳本實現原理

這是很早以前實現的類c腳本語言。(這篇文章也是當初所寫)
1。讀入腳本
2。語法分析,並按優先級遞歸生成對應2叉樹
3。倒序遞歸解釋2叉樹,並調用對應自己所寫的代碼

[祥細如下:]

一、起步:先說明表達式的處理(熱身運動)
例: a=1+obj.fun("price",5)+2; 
a.表達式的分析:
//(建立函數Create2Tree(root,s)其中s字符中的內容是上述的表達式)
 //(1)找出字符串(即參數)中最低級的運算符,以該操作符爲中心將字符串分爲兩半
//(2)root=該操作符(及你需要的其它各信息)
//(3)root->left=new STree;s1=左邊字符串;把root=root->left及s1當參數跳到第(1)步繼續(即迴歸處理);
//(4)root->right=new STree;s2=右邊字符串;把root=root->right及s2當參數跳到第(1)步繼續(即迴歸處理)
 //(5)直到剩下變量或函數(包括對象函數)及常量(),再用root保存相關信息
//(這樣就可生成如下2叉樹
=
a + 
1 +

obj.fun 2 

"price" 5

b.表達式的解釋:
  用vector<*op>存下如下函數的地址:
ProcVer{stack.push(&a);} 
ProcNum{push(1);} 
ProcNum{push(2);} 
ProcFun{?push(obj.fun(pop(),pop()));}//注意參數要從右到左出棧,?號表示如果函數有返回值則壓棧!
//這裏假設你已能得到該函數的地址(通過預設一份靜態的函數名與函數地址對應的映射表查詢得到)
ProcNum{push(2);}
ProcAdd{push(pop()+pop());}
ProcAdd{push(pop()+pop());}
ProcAssign{*(sp-2)=pop();}
//最後a的值就可用pop()取出
c.表達式的執行

------------------------------------------------------------------------------------------------
三、完整腳本的舉例說明
腳本如下:
int row=5,b=-1,ires;
ListBox lb1;
while(row=row+b)
ires=1+obj.fun(1,12)+2; 
endwhile
//.......

 1。定義的分析:
首先是否存在關鍵字int及是否存在ListBox類(相當於vb中控件類,但它是可視的,vb中你要用控件的前提是控件欄中必須有此控件你纔可拖拉到窗體.這裏你要用這個ListBox東東(類)的前提是必須存在這個類),
不存在則: 
提示錯誤!
存在則:
a.是定義變量的生成對應的內存空間,並加入到ver_map(變量名,變量地址)映射表(如第一行)
b.是定義對象的創建對象,並進行初始化。並加入到obj_map(對象名,對象地址)映射表(如第二行)
(相當於vb中拖了一個列表框到窗口上,此時它會生成一個列表框對象)

2。表達式的分析與解釋:
  用大概類似於struct {void (*op)(void) VCode[1000];int ip}VMachine這樣的結構存下如下
"Procxxx"之類的函數的地址:
//先處理while(row=row+h):
ProcVer{push(&row);} 
ProcVer{push(&h);} 
ProcAdd{push(pop()+pop());} 
ProcVer{push(&row);} 
ProcAssign{*(sp-2)=pop();} 
ProcWhile{WhileIP.push(ip);while(!pop().value && pop().name!="endwhile")pop();} 

//再處理ires=1+obj.fun(1,2)+2:
ProcNum{push(1);} 
ProcNum{push(12);} 
ProcFun{?push(obj.fun(pop(),pop()));}//注意參數要從右到左出棧,?號表示如果函數有返回值則壓棧!
//這裏假設你已能得到該函數的地址(通過預設一份靜態的函數名與函數地址對應的映射表查詢得到)
ProcNum{push(2);} 
ProcAdd{push(pop()+pop());}
ProcNum{push(1);} 
ProcVer{push(&ires);} 
ProcAdd{push(pop()+pop());}
ProcAssign{*(sp-2)=pop();}

//然後處理endwhile:
ProcEndwhile(ip=WhileIP.pop()-1);
//....... 
NULL;

3。腳本語言的執行
VMachine.ip=0;
while(VMachine.VCode[VMachine.ip].op != NULL)
{
(*VMachine.VCode[VMachine.ip].op)();
VMachine.ip].op++;
}


三、老外的一個完整的腳本語言教程(基本原理類同上述第二點)
http://www.peroxide.dk/tuts_scr.shtml
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章