lua--从小白开始(2)

目前lua最新版本,5.2.3。

此例为一个简单的lua解析器,源码摘自《Lua游戏开发实践指南》。

测试例程功能为:解析简单的lua指令,如:print("Hello world!");

function fun(x ,y) return x + y end

z =fun(1,1);

print(z);

结果如下图:

源码如下:

simple_main.cpp:

#include <stdio.h>
#include <string.h>
#include "cLua.h"

LuaGlue _Version(lua_State *L)
{
	puts("This is 2.o fuck you!");
	return 0;
}

char gpCommandBuffer[254];

const char* GetCommand()
{
	memset(gpCommandBuffer,0,sizeof(gpCommandBuffer));
	printf("Read>");
	fgets(gpCommandBuffer,254,stdin);
	//printf("&&&&%s&&&&&",gpCommandBuffer);
	gpCommandBuffer[strlen(gpCommandBuffer) - 1] = 0;
	//printf("-----%s----",gpCommandBuffer);
	return gpCommandBuffer;
}

int main()
{
	puts("SKLDB");
	puts("fky");

	cLua *pLua = new cLua;

	pLua->AddFunction("Version",_Version);

	const char *pCommand = GetCommand();

	while (strcmp(pCommand,"QUIT") != 0)
	{
		if (! pLua->RunString(pCommand))
		{
			printf("Error is:%s",pLua->GetErrorString());
		}
		pCommand = GetCommand();
	}

	delete pLua;

	return 0;
}

cLua.h:

#ifndef __CLUA__
#define __CLUA__

struct lua_State;

#define LuaGlue extern "C" int
extern "C" {
typedef int (*LuaFunctionType)(struct lua_State *pLuaState);
};

class cLua
{
public:
	cLua();
	virtual ~cLua();

	bool		RunScript(const char *pFilename);
	bool		RunString(const char *pCommand);
	const char *GetErrorString(void);
	bool		AddFunction(const char *pFunctionName, LuaFunctionType pFunction);
	const char *GetStringArgument(int num, const char *pDefault=NULL);
	double		GetNumberArgument(int num, double dDefault=0.0);
	void		PushString(const char *pString);
	void		PushNumber(double value);

	void		SetErrorHandler(void(*pErrHandler)(const char *pError)) {m_pErrorHandler = pErrHandler;}

	lua_State	*GetScriptContext(void)		{return m_pScriptContext;}

private:
	lua_State	*m_pScriptContext;
	void(*m_pErrorHandler)(const char *pError);
};

#endif

cLua.cpp:

#include <stdio.h>
#include <string.h>
#include <string>

#include "cLua.h"
extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}

cLua::cLua()
{
	m_pErrorHandler = NULL;

	m_pScriptContext = luaL_newstate();
	luaL_openlibs(m_pScriptContext);
	//luaopen_base(m_pScriptContext);
	//luaopen_io(m_pScriptContext);
	//luaopen_string(m_pScriptContext);
	//luaopen_math(m_pScriptContext);
	//luaopen_debug(m_pScriptContext);
	//luaopen_table(m_pScriptContext);
}

cLua::~cLua()
{
	if(m_pScriptContext)
		lua_close(m_pScriptContext);
}

static std::string findScript(const char *pFname)
{
	FILE *fTest;

	char drive[_MAX_DRIVE];
	char dir[_MAX_DIR];
	char fname[_MAX_FNAME];
	char ext[_MAX_EXT];

	_splitpath( pFname, drive, dir, fname, ext );

	std::string strTestFile = (std::string) drive + dir + "Scripts\\" + fname + ".LUB";
	fTest = fopen(strTestFile.c_str(), "r");
	if(fTest == NULL)
	{
		//not that one...
		strTestFile = (std::string) drive + dir + "Scripts\\" + fname + ".LUA";
		fTest = fopen(strTestFile.c_str(), "r");
	}

	if(fTest == NULL)
	{
		//not that one...
		strTestFile = (std::string) drive + dir + fname + ".LUB";
		fTest = fopen(strTestFile.c_str(), "r");
	}

	if(fTest == NULL)
	{
		//not that one...
		//not that one...
		strTestFile = (std::string) drive + dir + fname + ".LUA";
		fTest = fopen(strTestFile.c_str(), "r");
	}

	if(fTest != NULL)
	{
		fclose(fTest);
	}

	return strTestFile;
}

bool cLua::RunScript(const char *pFname)
{
	std::string strFilename = findScript(pFname);
	const char *pFilename = strFilename.c_str();

	if (0 != luaL_loadfile(m_pScriptContext, pFilename))
	{
		if(m_pErrorHandler)
		{
			char buf[256];
			sprintf(buf, "Lua Error - Script Load\nScript Name:%s\nError Message:%s\n", pFilename, luaL_checkstring(m_pScriptContext, -1));
			m_pErrorHandler(buf);
		}

		return false;
	}
	if (0 != lua_pcall(m_pScriptContext, 0, LUA_MULTRET, 0))
	{
		if(m_pErrorHandler)
		{
			char buf[256];
			sprintf(buf, "Lua Error - Script Run\nScript Name:%s\nError Message:%s\n", pFilename, luaL_checkstring(m_pScriptContext, -1));
			m_pErrorHandler(buf);
		}

		return false;
	}
	return true;

}

bool cLua::RunString(const char *pCommand)
{
	if (0 != luaL_loadbuffer(m_pScriptContext, pCommand, strlen(pCommand), NULL))
	{
		if(m_pErrorHandler)
		{
			char buf[256];
			sprintf(buf, "Lua Error - String Load\nString:%s\nError Message:%s\n", pCommand, luaL_checkstring(m_pScriptContext, -1));
			m_pErrorHandler(buf);
		}

		return false;
	}
	if (0 != lua_pcall(m_pScriptContext, 0, LUA_MULTRET, 0))
	{
		if(m_pErrorHandler)
		{
			char buf[256];
			sprintf(buf, "Lua Error - String Run\nString:%s\nError Message:%s\n", pCommand, luaL_checkstring(m_pScriptContext, -1));
			m_pErrorHandler(buf);
		}

		return false;
	}
	return true;
}

const char *cLua::GetErrorString(void)
{
	return luaL_checkstring(m_pScriptContext, -1);
}

bool cLua::AddFunction(const char *pFunctionName, LuaFunctionType pFunction)
{
	lua_register(m_pScriptContext, pFunctionName, pFunction);
	return true;
}

const char *cLua::GetStringArgument(int num, const char *pDefault)
{
	return luaL_optstring(m_pScriptContext, num, pDefault);

}

double cLua::GetNumberArgument(int num, double dDefault)
{
	return luaL_optnumber(m_pScriptContext, num, dDefault);
}

void cLua::PushString(const char *pString)
{
	lua_pushstring(m_pScriptContext, pString);
}

void cLua::PushNumber(double value)
{
	lua_pushnumber(m_pScriptContext, value);
}

源码链接:http://download.csdn.net/detail/shinhwalin/7831493

时间: 2024-09-28 21:41:53

lua--从小白开始(2)的相关文章

【游戏开发】小白学Lua(上)

在很多游戏中,脚本语言是不可或缺的一部分,很多游戏都使用到了Lua,js,python一类的脚本,脚本语言可以在很多方面给开发进程带来帮助.脚本语言可以作为初始化文件读入变量和游戏数据的一个快速而方便的方法.它们通常因为具有节省编译时间提高生产效率.提高创造性和拓展性的有点而受到众多游戏开发厂商的青睐.在本篇博客中,马三将和大家一起学习一下Lua这门脚本语言. 一.搭建Lua运行环境 学习任何一门编程语言恐怕都是要先搭建起来它的开发环境,这样才能多写代码多练习.Lua有一个交互的解释程序(lua

【小白学Lua】之Lua变长参数和unpack函数

一.简介 Lua的变长参数和unpack函数在实际的开发中应用的还挺多的,比如在设计print函数的时候,需要支持对多个变量进行打印输出,这时我们就需要用到Lua中的变长参数和unpack函数了. 二.Lua变长参数与unpack函数 Lua中支持可变参数,用 ... 表示.比如定义下面的这样一个函数: local function func1(...) end 当然它也支持在变长参数前面添加固定参数: local function func1(var,...) --dosomething en

小白日记14:kali渗透测试--NMAP

NAMP 被认为是最强大的扫描器 所有参数 [email protected]:~# nmap Nmap 7.01 ( https://nmap.org ) Usage: nmap [Scan Type(s)] [Options] {target specification} TARGET SPECIFICATION: <strong> #目标发现</strong> Can pass hostnames, IP addresses, networks, etc. Ex: scanm

online_jf.lua --累计在线时间领取物品(积分)的lua脚本

原作者: ayase 8-27修正 修复首次使用后的红字不需要额外进数据库导入计分表,这lua全自动生成 --------------------------------------------------------------惯例写在前面: 写这玩意其实学习性更大于目的性..= =研究了两天晚上写的我人参中滴第一个lua脚本,居然还真给我写出来了,好感动由于写代码的基础基本是零 所以碰了N+N次壁 什么函数字母大小写还要区分  -- 闹哪样啊喂 因为这个原因我试了半个多钟才发现问题所在什么函

Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那这篇博文就是主要讲的如何定义这个指定的函数,这个指定的函数是什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(5): 返回指定表格中的所有键(key):table.keys

这里的函数主要用来做:返回指定表格中所有的键.参考资料为quick_cocos. 星月倾心贡献~~~ --[[ -- 返回指定表格中的所有键(key) -- example: local t = ( a = 1, b = 2, c = 3 ) local keys = table.keys( t ) -- keys = { "a", "b", "c" } -- @param t 要检查的表格(t表示是table) -- @param table

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(7): 其他table方法

看了下其他的table方法,好像没有什么好说的,注释里已经写的很明白了,这里就不罗嗦了~(小白:懒...).参考资料为quick_cocos. 星月倾心贡献~~~ --[[ -- 返回指定表格中的所有值(value) -- example local t = { a = 1, b = 2, c = 3 } local values = table.values( t ) -- values = { 1, 2, 3 } -- @parame t 要检查的表格(t表示是table) -- @para

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(8): 生成只读table

这个函数的作用是:生成只读table. --[[ -- 生成只读table -- @param table t 需要不允许修改的table example: local tb = {"星期一", "星期二", "星期日"} local days = readOnly( tb ); days[2] = "星期三哪去了啊?" ; "[string \"Functions.lua\"]:466: 别修改

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(6): 合并表格:table.merge

这里的函数主要用来做:合并表格.参考资料为quick_cocos. 星月倾心贡献~~~ --[[ -- 将 来源表格 中所有键及值复制到 目标表格 对象中,如果存在同名键,则覆盖其值 -- example local tDest = { a = 1, b = 2 } local tSrc = { c = 3, d = 4 } table.merge( tDest, tSrc ) -- tDest = { a = 1, b = 2, c = 3, d = 4 } -- @param tDest 目

Lua语言基础汇总(8) -- Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那本文就是主要讲的是如何定义这个指定的函数,这个指定的函数是什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连接