博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lua2.4 解释器入口 lua.c
阅读量:7009 次
发布时间:2019-06-28

本文共 1460 字,大约阅读时间需要 4 分钟。

  hot3.png

开始解释器篇。

解释器部分会写几节还说不准,因为,不少相关内容在之前的版本中是有覆盖到的。
同样,还是从解释器入口的 main 函数说起。

int main (int argc, char *argv[]){ int i; int result = 0; iolib_open (); strlib_open (); mathlib_open (); lua_register("argv", lua_getargv); if (argc < 2)   manual_input(); else {  for (i=1; i

程序上来先定义一个程序的返回值。按 C 语言惯例,程序返回 0 表示成功,非 0 表示失败。

打开几个库,io 库,字符串库,数学库。打开库的过程就是把库函数注册到全局符号表中去。
注册一个 argv 函数以在 Lua 脚本里取得命令行中给 Lua 脚本的参数。这些参数是保存在了 C 的执行环境中。注册函数用的是 lua_register 宏,上面的程序内置库的注册用的也是这个宏。
如果无参,则表示程序执行在交互模式。就是把命令行里的用户手动输入的内容做为 Lua 脚本程序来执行。

static void manual_input (void){  if (isatty(0))  {   char buffer[250];   while (fgets(buffer, sizeof(buffer), stdin) != 0)     lua_dostring(buffer);  }  else    lua_dofile(NULL); /* executes stdin as a file */}

isatty 是检查设备是否是某种终端类型,它定义在 POSIX 里的。

这里是在 windows 里分析的,所以用一个宏代替它,就是把标准输入当做一个 tty。
因此在 windows 里,isatty(0) 永远为真,也就是手动输入 manual_input 里是按行执行输入脚本代码的,通过 lua_dostring 执行。
回到 main 函数。
接着开解释命令行的参数。
第一个 for 循环是为了解析出 Lua 脚本的输入参数的位置和个数,就是从两个减号 "--" 开始的参数是 Lua 脚本的参数。

  for (i=1; i

第二个 for 循环也是解析命令行输入的。

如果是两个减号"--",表示是 Lua 脚本的参数开始了,就停止。
如果是一个减号 "-",表示是交互模式,这个和无参时情况类似,调用的也是 manual_input 来执行用户的手动输入内容。
如果是 "-v",打印程序的版本,版权,作者信息。
否则,就是脚本文件的解释执行了。调用 lua_dofile 解释脚本文件。
如果执行脚本文件结果出错(就是 result 非 0 的情况),打印出错信息。
这一版本,新增了外部编译器,Lua 可以直接解释编译器编译过的 luac.out 格式的二进制文件, Lua 是如何区分脚本文件和编译过的二进制文件的呢?
----------------------------------------
到目前为止的问题:
> Lua 是如何区分脚本文件和编译过的二进制文件的呢?
----------------------------------------

转载于:https://my.oschina.net/xhan/blog/330452

你可能感兴趣的文章
Java 一个特殊的类 ServiceLoader<S> 详解
查看>>
盒子模型中的div居中
查看>>
让你打开眼界的生活小创意!
查看>>
常用apt命令
查看>>
CSS实现3D旋转
查看>>
golang服务端, 游戏公测时遇到的socket写超时的问题, 也是游戏框架的设计问题
查看>>
oracle 定时器
查看>>
mysqld_multi 多实例启动mysql
查看>>
配置linux下的vimrc
查看>>
glusterfs Self-Heal and Re-Balance Operations
查看>>
Python文件夹与文件的操作
查看>>
Apache 启动遇到问题解决
查看>>
final和static
查看>>
win7 64位 下USB转COM驱动安装方法
查看>>
QString 与中文问题
查看>>
MPLS ××× 配置步聚
查看>>
BGP 管理距离修改及分析
查看>>
我的友情链接
查看>>
uptime详解,最通俗的说明了cpu平均负载
查看>>
docker-compose 学习:通过 Dockerfile 和 build 指令搭建 LNMP
查看>>