微型lua

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值