一、Lua5.1相关资源
下载见:
http://luabinaries.sourceforge.net/download.html
在线版:
http://www.lua.org/source/5.1/
关于它的代码有一个阅读顺序,可以参考这篇文章:
http://www.reddit.com/comments/63hth/ask_reddit_which_oss_codebases_out_there_are_so/c02pxbp
Lua语言的Wiki条目
http://en.wikipedia.org/wiki/Lua_(programming_language)
二、lua.c概述
lua.c实现Lua独立解析器。
它在官网中被分类为Interpreter。
http://www.lua.org/source/5.1/lua.c.html
总行数391行。
三、lua.c头文件
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
四、lua.c宏
1. #define lua_c
lua_c是lua.c的缩写,用于打开luaconf.c第222-293行的独立程序宏配置。
由于VC的宏展开问题,luaconf.c的那些宏可能无法直接用右键查找。
2. #define notail(x) {if ((x)[2] != '\0') return -1;}
在静态方法collectargs中检查控制台命令行的单个字符串参数在结尾没有多余字符。
用于诊断x的字符串长度为1,否则直接退出命令行解析。
五、静态全局变量
1. static lua_State *globalL = NULL;
独立解析器的全局Lua状态机。
它允许laction方法可以直接读取状态数据。
它被laction读取,被pmain修改。
全局的Lua虚拟机指针
由于是在signal指定的句柄函数laction中使用,所以需要这样处理。
2. static const char *progname = LUA_PROGNAME;
当前的程序名(短名,默认为lua),注意它的指针值可以被改变(但字符串是常量)。
它被dotty和pmain修改,被print_usage、report和dotty读取。
六、静态全局方法
1. static void lstop (lua_State *L, lua_Debug *ar) {
在出现signal中断时进行出错处理的lua钩子。
只是简单地输出字符串"interrupted!"
2. static void laction (int i) {
signal中断的处理句柄。
它在docall中被注册。
确保如果在lstop之前出现其他SIGINT,就直接结束进程(默认动作)
然后用lua_sethook挂钩子lstop。
3. static void print_usage (void) {
在stderr控制台输出中输出lua解析器的用法。
4. static void l_message (const char *pname, const char *msg) {
公共的信息输出函数。
5. static int report (lua_State *L, int status) {
运行完pmain后取出栈顶的出错信息然后用l_message输出。
6. static int traceback (lua_State *L) {
出错处理的C函数,间接调用Lua标准库里的debug.traceback函数
首先判断栈顶是不是出错信息的字符串message。
然后调用debug.traceback(message, 2)输出当前Lua状态机的堆栈回溯。
7. static int docall (lua_State *L, int narg, int clear) {
Lua保护模式运行VM(已经载入脚本后)
先确保在出错时Lua状态机调用traceback这个C函数。
然后用lua_pcall启动虚拟机。
8. static void print_version (void) {
用l_message输出版本信息
9. static int getargs (lua_State *L, char **argv, int n) {
把argv字符串数组压入L栈中,变成一个Lua表。
10. static int dofile (lua_State *L, const char *name) {
执行Lua脚本文件。
首先用luaL_loadfile加载(编译)文件,然后用docall执行。
最后用report报告返回的状态值。
11. static int dostring (lua_State *L, const char *s, const char *name) {
执行Lua脚本字符串。
类似dofile,不过用luaL_loadbuffer代替luaL_loadfile。
12. static int dolibrary (lua_State *L, const char *name) {
用Lua标准库的require函数加载脚本。
13. static const char *get_prompt (lua_State *L, int firstline) {
从Lua全局变量_PROMPT和_PROMPT2获取首行或次行的命令行提示符,
如果没有定义,默认是
#define LUA_PROMPT
"> "
#define LUA_PROMPT2
">> "
它们定义在luaconf.h中的#if defined(lua_c) || defined(luaall_c)内。
14. static int incomplete (lua_State *L, int status) {
在状态机出现语法出错后判断是否遇到<eof>。
用于交互模式输入时的多行预测(有可能当前还没有输入完)。
15. static int pushline (lua_State *L, int firstline) {
交互模式,读取stdin的一行,无循环。
16. static int loadline (lua_State *L) {
交互模式,读入stdin的一行,然后循环读取余下未输入完的内容。
17. static void dotty (lua_State *L) {
进入交互模式。
18. static int handle_script (lua_State *L, char **argv, int n) {
注入Lua全局变量arg,然后执行脚本或执行stdin的输入内容。
19. static int collectargs (char **argv, int *pi, int *pv, int *pe) {
第一次命令行扫描,获取大部分选项。
20. static int runargs (lua_State *L, char **argv, int n) {
第二次命令行扫描,用Lua虚拟机执行-e(字符串)或-l(文件)的内容
21. static int handle_luainit (lua_State *L) {
读取环境变量LUA_INIT指定的脚本(@开头)或命令
22. static int pmain (lua_State *L) {
把主入口实现为Lua的C函数,在Lua虚拟机上注册运行。
它依次执行以下操作,
并且把返回值保存到其userdata参数(类型为Smain)的status域中:
* 取出第一个参数(即lua_cpcall的第三参数)。
* 把L保存到全局变量globalL。
* 设置progname。
* 关闭GC。
* 打开所有标准库(可能使用标准库里的debug和require)。
* 执行GC。
* 执行初始化操作和命令行选项提取:handle_luainit、collectargs、print_version、runargs。
* 根据获取的选项选择执行handle_script(执行脚本)、dotty(交互模式)、执行stdin内容。
七、全局结构体
1. struct Smain {
int argc;
char **argv;
int status;
};
在main和pmain中使用。
它是pmain的C函数参数。
它在pmain中作为userdata被读出。
在main中,它是一个结构体局部变量的类型,其地址传给lua_cpcall的第三参数。
argc域和argv域是命令行参数(避免全局读)。
status域是最近一次lua库函数的返回值,非0表示有错误。
八、公共全局方法
1. int main (int argc, char **argv) {
解析器入口。argc是参数个数,argv是字符串数组,长度为argc。
作为C函数的入口被控制台程序执行。
wmain.c把__argc和__argv传递给这个函数,模拟控制台参数。
它的作用是:
* 创建Lua状态,程序唯一的数据交互中心。
* 创建Smain结构体对象,保存argc和argv。
* 用lua_cpcall执行pmain这个C函数,然后报告结果和关闭状态机。
* 根据lua_cpcall的返回值和Smain结构体对象的状态值退出程序
九、值得观察的关键代码
1. docall
观察Lua脚本文件或字符串执行前后的状态变化。
2. pmain
观察两次命令行扫描后的变化。
分享到:
相关推荐
cjson.dll 需要lua5.1.dll 调用require “cjson” cjson.dll 需要lua5.1.dll 调用require “cjson”
本文将详细解析"Lua5.1全三套:Lua Programming(中英文版)+中文手册"中包含的知识点。 首先,我们有《Lua Programming》第二版的中文版和英文版。这本书由Mario J. Silva、Luiz Henrique de Figueiredo和Roberto ...
在这个版本中,我们看到的是v5.1.5-52,这是对Lua 5.1的一个特定构建,它包含了标准库和一些额外的模块。使用LuaForWindows,开发者可以方便地编写、运行和测试Lua脚本,同时通过集成的调试器进行代码调试,这对于...
2. **luac5.1.exe**:这是Lua的编译器,它可以将Lua源代码转换为预编译的字节码,这种字节码可以直接由Lua虚拟机执行,提高了加载速度。这对于大型应用或者需要快速启动的环境尤其有用。 3. **bin2c5.1.exe**:这是...
总的来说,“lua5.1 + luarocks for windows64安装版”是一个完整的Lua开发环境,适合在64位Windows操作系统上进行Lua编程。它提供了必要的运行时环境和便捷的包管理工具,使得开发者能够在Windows平台上轻松地开发...
lua5.1.lib文件缺失,LNK1181
源代码通常包含`.c`和`.h`文件,`.c`文件是实现函数和数据结构的C语言代码,`.h`文件则定义了头文件,包含对外接口声明。这对于理解Lua的内部工作原理以及根据特定需求定制功能非常有用。 "编译 lua5.1"标签指示了...
│ luac.exe │ luadec.exe │ luaopswap.exe │ luareplace.exe │ ├─5.2 │ └─bin │ liblua52.lib │ lua.exe │ lua52.dll │ lua52.lib │ luac.exe │ luadec.exe │ luaopswap.exe │ luareplace.exe │...
1. **lua.h**: 这是Lua C API的头文件,定义了所有与C语言交互的函数和数据结构。 2. **lua.c/lua.o**: Lua的主解析器和虚拟机实现,编译后的对象文件或静态库。 3. **lapi.c/lapi.o**: 实现了Lua与C之间的接口,...
宿主程序可以通过调用Lua提供的库函数来执行一段Lua代码,可以读写Lua变量,也可以引入C函数供Lua代码调用。这种能力使得Lua能够处理各种不同的事务领域,从而定制出各种不同的语言,它们共享一个统一的句法格式框架...
lua 5.1 manual.chm lua 5.1 manual.chm lua 5.1 manual.chm
- **Lua**:一种扩展编程语言,旨在支持一般过程式编程,并具备数据描述功能。同时,它还提供了面向对象编程、函数式编程及数据驱动编程的良好支持。 - **设计目的**:Lua 被设计为一种强大的轻量级脚本语言,适用于...
标题 "luasocket3.0rc1 & lua 5.1" 涉及到的是一个结合了 Lua 5.1.4 和 luasocket 3.0rc1 的软件包,该包专为使用 Microsoft Visual C++ 2015 编译器的用户设计。Luasocket 是一个广泛使用的 Lua 语言扩展库,它提供...
通过分析`lua.c`和`luac.c`等文件,我们可以看到如何将源代码编译为字节码,以及字节码如何被解释执行。 编译器部分负责将Lua源代码转换为字节码。Lua 5.1的编译器采用了LL(1)文法,这保证了编译过程的效率和正确性...
Lua5.1是一种轻量级的脚本语言,它被广泛应用于游戏开发、嵌入式系统和各种软件中,以其简洁、高效和易嵌入的特性受到开发者喜爱。在这个项目中,我们关注的是一个针对Visual Studio 2008(VS08)编译环境的工程,它...
宿主程序可以通过调用 Lua 函数来执行 Lua 代码,读写 Lua 变量,甚至可以向 Lua 注入 C 函数,从而极大地扩展 Lua 的功能范围。**Lua** 的官方发行版包含了名为 `lua` 的简单宿主程序,它可以作为一个独立的 Lua ...
Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。 Lua...
其中,`lua.c` 和 `luac.c` 分别是 Lua 解释器和编译器的主要实现。通过阅读这些源码,你可以了解到 Lua 如何解析和执行代码。 2. `lualib/`:这个目录包含了 Lua 标准库的源代码,如数学运算、字符串处理、文件I/O...
luaffifb, 用于 Lua 5.1和 Lua 5.2的voiceover软件包 这是一个用来调用C 函数和从lua操作C 类型的库。 它被设计成与 LuaJIT ( 请参见 http://luajit.org/ext_ffi.html ) 中的FFI库兼容。 它可以解析 header 文件中...
VS2010是微软的一个强大的集成开发环境,支持多种编程语言,包括C/C++,它的调试工具和项目管理功能对于开发和调试Lua5.1源码非常有帮助。 Lua5.1源码中的主要组成部分包括: 1. **虚拟机(VM)**:Lua的执行引擎,...