微型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"退出。