Lua2.4 解譯器入口 lua.c

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.