微型lua
来源:互联网 发布:qq飞车金殿魅影数据 编辑:程序博客网 时间:2024/06/09 20:04
微型lua
2007-03-04 16:51:15 by sdragon
这是一个微型的脚本语言,还不完善,只是用来演示脚本语言的设计模式。
一、代码.h文件:
#ifndef mini_scriptH
#define mini_scriptH
//---------------------------------------------------------------------------
#include <map>
#include <vector>
#include <string>
using namespace std;
typedef vector<string> stack_t;
typedef int(*func_t)(const stack_t& args);
class mini_script
{
private:
typedef struct{
string fname; //函数名称
stack_t args; //参数表
}state_t;
typedef map<string, func_t> func_heap_t;
public:
int parse(const string& str);
int reg_func(func_t func, const string& fname);
private:
int run(const state_t& state);
func_heap_t func_heap;
};
//---------------------------------------------------------------------------
#endif
二、代码.cpp文件
//---------------------------------------------------------------------------
#pragma hdrstop
#include "mini_script.h"
#include <vcl.h>
extern void print(const string& str);
//---------------------------------------------------------------------------
#pragma package(smart_init)
int mini_script::parse(const string& str)
{
static char* spliter = " /t/r/n";
state_t state;
string::size_type pos = 0, pos_back = 0;
pos = str.find_first_of(spliter);
if(string::npos != pos)
{
state.fname = str.substr(0, pos);
for(;;)
{
//pos_back = pos + 1;
pos_back = str.find_first_not_of(spliter, pos+1);
pos = str.find_first_of(",/r/n", pos_back);
if(pos != string::npos)
{
state.args.push_back(str.substr(pos_back,
//str.find_last_not_of("
pos - pos_back));
}
else
{
state.args.push_back(str.substr(pos_back, str.length() - pos_back));
break;
}
}
return run(state);
}
else
{
if(pos != str.length())
{
state.fname = str;
return run(state);
}
else
return -1;
}
}
int mini_script::reg_func(func_t func, const string& fname)
{
func_heap_t::iterator itr;
itr = func_heap.find(fname);
if(itr==func_heap.end())
{
func_heap.insert(func_heap_t::value_type(fname, func));
return 0;
}
return -1;
}
int mini_script::run(const state_t& state)
{
func_heap_t::iterator itr;
itr = func_heap.find(state.fname);
if(itr!=func_heap.end())
{
int n = (*itr->second)(state.args);
return 0;
}
else
print("未知的命令:" + state.fname);
return -1;
}
三、代码测试。这里简单的写了两个函数,然后绑定到脚本语言,脚本程序就能执行相应的命令了。在窗体上添加一个TMemo,一个TEdit。
int print(const stack_t& args)
{
for(size_t i=0; i<args.size(); ++i)
{
Form1->Memo1->Lines->Add(args[i]);
}
return 0;
}
int time(const stack_t& args)
{
Form1->Memo1->Lines->Add(TimeToStr(Now()));
return 0;
}
int exit_program(const stack_t& args)
{
Form1->Close();
return 0;
}
//---------------------------------------------------------------------------
mini_script script;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//绑定三个命令,分别是print, time, close。
script.reg_func(print, "print");
script.reg_func(time, "time");
script.reg_func(exit_program, "exit");
}
void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
//输入回车键,执行命令
if(Key == VK_RETURN)
{
script.parse(Edit1->Text.c_str());
Edit1->Text = "";
}
}
一切准备好后,在Edit控件中输入"time",回车,Memo里就打出了当前的时间。好了,现在输入"exit"退出。
- 微型lua
- 微型lua
- 用 Lua 实现一个微型虚拟机-基本篇
- 用 Lua 实现一个微型虚拟机-基本篇
- 用 Lua 实现一个微型虚拟机-基本篇
- 微型小说
- 微型 练习
- 面向小微型企业的微型服务器
- 微型蓝球赛问题
- 简单Excel微型数据库
- 微型项目实践感悟
- 金山词霸 -- 微型网络版
- 微型调试器
- 微型可变电源
- MFC微型教程
- 微型Web服务器
- 几则微型小说
- 微型操作系统开发
- sp提供的移动通道的接口调用的方法
- poj todo
- c语言指针使用的注意问题
- 07年第九周学习之路
- 迅龙的数据库反向还原算法结构
- 微型lua
- 你的编程语言可以这样做吗?(map/reduce的js示范) (转)
- 使用zlib压缩IStream流
- 揭示win32 api拦截细节 转载自www.hookbase.com
- 端口截听实现端口隐藏,嗅探与攻击
- Javascript判断object 的特定类(文章经转者改动)
- 使用zlib压缩IStream流2
- 咨询前辈
- test