Lua-的C接口-解释器源码_第1页
Lua-的C接口-解释器源码_第2页
Lua-的C接口-解释器源码_第3页
Lua-的C接口-解释器源码_第4页
Lua-的C接口-解释器源码_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Lua 的C接口-解释器源码用lua快一年了,因为引擎部分比较少改动,所以一直没用过它的C接口,都是在写脚本。年前看书时写了一个小的demo做学习用,好像当时遇到些困难,但是没有记录下来,几乎都忘了。这里贴点源码出来做备忘吧:)lua的语法还是比较简单,其官网()上有电子文档(/pil/),看一看就会了。不过学会一门语言的语法跟用好一门语言还是两回事,好在它的源码也不多,多看看源码理解就深了。首先说我比较讨厌lua的几个地方:1、把数组和table混在一起,数组可以很方便取得size,而table就只能自己遍历去数。2、没有continue,经常出现循环里面嵌套N层if。3、最最无聊的就是变量默认是global的,要显示声明local才是本地变量。大概就这几个公认的问题了,下面贴代码:)程序实现了一个lua解释器,其实就是读入lua语句然后解释执行,用了readline是为了输入方便。另外启动的时候load了一个叫init.lua的脚本文件,提供了几个api供脚本使用,全部代码如下:(csdn怎么不提供附件功能呢)main.hpp#include #include #include #include #include #include #include #include extern lua_State *L; bool exelua(const char*);bool init_script();int lua_getcwd(lua_State*);int lua_dir(lua_State*);void register_api(lua_State*);void create_table(lua_State*);main.cpp#include main.hpplua_State *L; int main(int argc, char* argv). L = luaL_newstate();/创建一个lua运行环境,可以传入一个内存管理参数luaL_openlibs(L);/打开常用libif ( ! init_script() )/load脚本return -1; register_api(L);/注册apicreate_table(L);/创建一个tablechar* input = NULL;while(1). input = readline();/提示输入if (input). if ( *input ). if( exelua(input) )/执行输入的语句add_history(input);/增加到历史命令 free(input);input = NULL; else. break; lua_close(L);return 0;bool exelua(const char* line).int error = luaL_loadbuffer(L, line, strlen(line), line) | lua_pcall(L, 0, 0, 0);/load并执行 if ( error ). std:cerr lua_tostring(L, -1) std:endl;lua_pop(L, 1); return false; return true;bool init_script().if ( luaL_dofile(L, init.lua) != 0 ) .std:cerr load init.lua failed ;return false;lua_pushnumber(L, 1);/传入参数lua_getglobal(L, _init_);/获取脚本中_init_变量if ( lua_isfunction(L, -1) )/判断_init_是否一个函数.if ( lua_pcall(L, 0, 1, NULL) != 0 )/调用_init_.std:cerr call _init_ error ;return false;int ret = lua_tonumber(L, -1) | lua_toboolean(L, -1);/取得_init_的返回值lua_pop(L, 1);if ( !ret ).std:cerr _init_ failed ;return false;return true;api.cpp#include #include main.hppint lua_getcwd(lua_State* L)/获取当前工作目录.char pathMAXPATHLEN;bzero(path, MAXPATHLEN);if (lua_gettop(L) != 0 ) /不需要参数. luaL_argerror(L, 0, no arg expected);return 0; if ( !getcwd(path, MAXPATHLEN) ). luaL_error(L, getcwd error %d, %s, errno, strerror(errno);return 0; lua_pushlstring(L, path, strlen(path);/将返回值压栈return 1;/返回返回值个数int lua_dir(lua_State* L)/取得目录下元素.const char* path = luaL_checkstring(L, 1); DIR* dir = opendir(path);if ( !dir ). lua_pushnil(L);lua_pushstring(L, strerror(errno);return 2; int i = 1;struct dirent *ent;lua_newtable(L);/把所有元素放到一个table中,以数组返回while( ent = readdir(dir) ). lua_pushnumber(L, i+);lua_pushstring(L, ent-d_name);lua_settable(L, -3); closedir(dir);return 1;void register_api(lua_State* L)/注册api.lua_register(L, getcwd, lua_getcwd);/脚本中可以使用getcwd调用lua_getcwdlua_register(L, dir, lua_dir);const luaL_Reg mylib = . .getcwd, lua_getcwd,.dir, lua_dir,.NULL, NULL,;luaL_register(L, tlib, mylib);/注册一个名为tlib的模块,tlib.getcwd()void create_table(lua_State* L)/创建一个table.lua_newtable(L);lua_pushnumber(L, 123);lua_setfield(L, -2, id);lua_pushcfunction(L, lua_getcwd);lua_setfield(L, -2, fun);lua_setglobal(L, tb);init.luafunction _init_()print(_init_ ok)return 1;endMakefile CPPFLAGS=-Wall -g -O0 -I /usr/local/include/lua51/LIB=-L/usr/local/lib/lua51/ -llua -lreadlineCC=g+SRC=main.cpp api.cppOBJ=$SRC:%.cpp=%.oall: depend mai

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论