简单的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

你可能感兴趣的:(lua教程)