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

原创粉丝点击