標籤:io os ar for 檔案 sp on 問題 代碼
開始解譯器篇。
解譯器部分會寫幾節還說不準,因為,不少相關內容在之前的版本中是有覆蓋到的。
同樣,還是從解譯器入口的 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<argc; i++) if (strcmp(argv[i], "--") == 0) { lua_argc = argc-i-1; lua_argv = argv+i; break; } for (i=1; i<argc; i++) { if (strcmp(argv[i], "--") == 0) break; else if (strcmp(argv[i], "-") == 0) manual_input(); else if (strcmp(argv[i], "-v") == 0) printf("%s %s\n(written by %s)\n\n", LUA_VERSION, LUA_COPYRIGHT, LUA_AUTHORS); else { result = lua_dofile (argv[i]); if (result) fprintf(stderr, "lua: error trying to run file %s\n", argv[i]); } } } return result;}
程式上來先定義一個程式的傳回值。按 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<argc; i++) if (strcmp(argv[i], "--") == 0) { lua_argc = argc-i-1; lua_argv = argv+i; break; }
第二個 for 迴圈也是解析命令列輸入的。
如果是兩個減號"--",表示是 Lua 指令碼的參數開始了,就停止。
如果是一個減號 "-",表示是互動模式,這個和無參時情況類似,調用的也是 manual_input 來執行使用者的手動輸入內容。
如果是 "-v",列印程式的版本,著作權,作者資訊。
否則,就是指令檔的解釋執行了。調用 lua_dofile 解釋指令檔。
如果執行指令檔結果出錯(就是 result 非 0 的情況),列印出錯資訊。
這一版本,新增了外部編譯器,Lua 可以直接解釋編譯器編譯過的 luac.out 格式的二進位檔案, Lua 是如何區分指令檔和編譯過的二進位檔案的呢?
----------------------------------------
到目前為止的問題:
> Lua 是如何區分指令檔和編譯過的二進位檔案的呢?
----------------------------------------
Lua2.4 解譯器入口 lua.c