写在前面
使用lua时,会发现这样一个情况
print("aa") -- 输出aa print('aa') -- 输出aa print "aa" -- 输出aa print 'aa' -- 输出aa print {} -- 输出某地址。
可以发现lua的写法十分灵活,为什么能这么些呢,lua又是怎么解析这些句子的呢,接下来来分析下Lua源代码(基于5.3.5)
解析过程
//parser.c static void suffixedexp (LexState *ls, expdesc *v) { /* suffixedexp -> primaryexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs } */ FuncState *fs = ls->fs; int line = ls->linenumber; primaryexp(ls, v); ... }
1.首先我们进入suffixedexp后再进入primaryexp
static void primaryexp (LexState *ls, expdesc *v) { /* primaryexp -> NAME | '(' expr ')' */ switch (ls->t.token) { ... case TK_NAME: { singlevar(ls, v); return; } ... } }
2.我们获取了函数的名字然后在suffixedexp过程中 有
static void suffixedexp (LexState *ls, expdesc *v) { ... for (;;) { switch (ls->t.token) { ... case '(': case TK_STRING: case '{': { /* funcargs */ luaK_exp2nextreg(fs, v); funcargs(ls, v, line); break; } ... } }
3.可以得到如下结论,lua的函数接受三种写法传入参数,且能起到相同的作用
1. (arg1, arg2, arg3 ... )
2. "argv" 'argv'
3. {}
后两种类型的参数数量只能为1,而且类型限定为字符串或者表。