Lua代码分析 0.1 语言吗?

ChongQingJin28 2013-10-19 08:17:57

0.声明:
第一、我不能保证我说的是对的
第二、顺序可能会很混乱(因为不会整理)

1.什么是语言呢?

1)先从keyword说起吧
文件:lparser.c 函数:statement
static void statement (LexState *ls) {
int line = ls->linenumber; /* may be needed for error messages */
enterlevel(ls);
switch (ls->t.token) {
case ';': { /* stat -> ';' (empty statement) */
luaX_next(ls); /* skip ';' */
break;
}
case TK_IF: { /* stat -> ifstat */
ifstat(ls, line);
break;
}
case TK_WHILE: { /* stat -> whilestat */
whilestat(ls, line);
break;
}
case TK_DO: { /* stat -> DO block END */
luaX_next(ls); /* skip DO */
block(ls);
check_match(ls, TK_END, TK_DO, line);
break;
}

由此我们可以猜测 if 会用ifstat处理 while会用whilestat、do会用block

2)print在哪里呢?
文件:lbaselib.c 函数:luaB_print
static int luaB_print (lua_State *L) {
int n = lua_gettop(L); /* 参数的数量 */
int i;
lua_getglobal(L, "tostring"); //难道他不会改变top吗
for (i=1; i<=n; i++) { //遍历所有的参数
const char *s;
size_t l;
lua_pushvalue(L, -1); /* function to be called */
lua_pushvalue(L, i); /* value to print */
/* 这个时候 top就变成了参数 而1 则成了函数 */
lua_call(L, 1, 1); //应该是调用index 1 并有一个参数
s = lua_tolstring(L, -1, &l); /* get result 为什么用两次 tostring 呢? 明白了*/
if (s == NULL)
return luaL_error(L,
LUA_QL("tostring") " must return a string to " LUA_QL("print"));
if (i>1) luai_writestring("\t", 1); //用tab分割
luai_writestring(s, l); //原来是这样输出的
lua_pop(L, 1); /* pop result */
}
luai_writeline();
return 0; //因为他不会操作栈顶所以 返回 0
}

仅仅有 luaB_print 好像还不够 ,还有:
static const luaL_Reg base_funcs[] = {
{"next", luaB_next},
{"pairs", luaB_pairs},
{"pcall", luaB_pcall},
{"print", luaB_print},
{NULL, NULL}
}; //他应该是函数名与函数的对应吧

LUAMOD_API int luaopen_base (lua_State *L) {
/* set global _G */
lua_pushglobaltable(L);
lua_pushglobaltable(L);
lua_setfield(L, -2, "_G");
/* open lib into global table */
luaL_setfuncs(L, base_funcs, 0); //他用到了上面的base_funcs
lua_pushliteral(L, LUA_VERSION); //应该是注册函数的意思吧
lua_setfield(L, -2, "_VERSION"); /* set global _VERSION */
return 1;
}

3)math.sin 在哪里呢?
文件:lmathlib.c 函数:math_sin
static int math_sin (lua_State *L) {
lua_pushnumber(L, l_tg(sin)(luaL_checknumber(L, 1)));
return 1;
}

还有(这个和print一样了就)
static const luaL_Reg mathlib[] = {
{"sinh", math_sinh},
{"sin", math_sin},
{"tan", math_tan},
{NULL, NULL}
};

LUAMOD_API int luaopen_math (lua_State *L) {
luaL_newlib(L, mathlib); //通过 luaL_Reg 的数组建立新的lib
lua_pushnumber(L, PI); //先压入member 在给member设置名字
lua_setfield(L, -2, "pi");
lua_pushnumber(L, HUGE_VAL);
lua_setfield(L, -2, "huge");
return 1; //为什么总是返回1呢?
}

4) + - * / and or not在哪里呢?
文件:lcode.c 函数:luaK_infix
void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) {
switch (op) {
case OPR_AND: {
luaK_goiftrue(fs, v);
break;
}
case OPR_OR: {
luaK_goiffalse(fs, v);
break;
}
case OPR_CONCAT: {
luaK_exp2nextreg(fs, v); /* operand must be on the `stack' */
break;
}
case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV:
case OPR_MOD: case OPR_POW: {
if (!isnumeral(v)) luaK_exp2RK(fs, v);
break;
}
default: {
luaK_exp2RK(fs, v);
break;
}
}
}

5)让螺丝刀变的锋利一点
假如我有一个lua文件,文件的内容是
function f(arg)
print(math.tan(0.23) .. "Ha ha")
end
我能直接跳转到 lmathlib.c中的
static int math_tan (lua_State *L) 吗?

能根据 .. 而跳转到 void luaK_infix 中的 case OPR_CONCAT: { 吗?

[1] 我的螺丝刀可以 (他叫 E马克思)

...全文
130 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChongQingJin28 2013-10-22
  • 打赏
  • 举报
回复
回复楼上

写工具,我可没有那个能力。顶多给工具写几行脚本。

1楼帖子的最后一句中的编辑器
ckc 2013-10-22
  • 打赏
  • 举报
回复
你自己写了个工具?是开发环境还是编辑器?
bugs2k 2013-10-19
  • 打赏
  • 举报
回复
还是用eclipse吧,可以支持c/c++、lua
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧