寫在前面
使用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,而且類型限定為字符串或者表。
