Lua2.4 打開文件 inout.c

這裏根據 luac.c 裏的函數調用順序,依次展開相關的代碼。首先要看的就是 lua_openfile,該函數定義於 inout.c 中:

數據結構

/*
** Function to open a file to be input unit.
** Return the file.
*/
FILE *lua_openfile (char *fn)
{
 lua_setinput (fileinput);
 if (fn == NULL)
 {
   fp = stdin;
   fn = "(stdin)";
 }
 else
   fp = fopen (fn, "r");
 if (fp == NULL)
   return NULL;
 lua_linenumber = 1;
 lua_parsedfile = luaI_createfixedstring(fn)->str;
 return fp;
}

函數一開始調用 lua_setinput,傳給它一個函數指針。
lua_setinput 定義於 lex.c 中,給詞法分析器一個函數指針,之後詞法分析程序須要從該函數指針中獲得一個個的輸入字符。
這裏 lua_setinput 的實際輸入參數是 fileinput,fileinput 定義以下:
模塊化

/*
** Function to get the next character from the input file
*/
static int fileinput (void)
{
 return fgetc (fp);
}

能夠看出,這個函數的做用就是每次調用它時從文件中取得一個字符。

回到 lua_openfile ,若是傳入的文件名爲空,則程序認爲從標準輸入讀入內容。設置文件描述符爲標準輸入 stdin,設置它的文件名爲 「(stdin)」。
若是傳入正常的文件名,則打開它。若是打開失敗,返回 NULL。
設置當前的行號爲 1。
設置當前的要分析的文件爲當前打開的文件。luaI_createfixedstring 函數是在 Lua 的字符串存儲空間中生成一個不可回收的字符串,這個方法之後會提到。
最後,函數返回文件描述符 fp;
lua_openfile 分析完了。

再看看相應的 lua_closefile
函數

/*
** Function to close an opened file
*/
void lua_closefile (void)
{
 if (fp != NULL && fp != stdin)
 {
  fclose (fp);
  fp = NULL;
 }
}

這個函數就是關閉由 lua_openfile 打開的文件。

lua_openstring, lua_closestring 和上面的打開關閉文件的操做相似,就再也不重複了。
注意,lua_openstring 時,給它設置的文件名爲 "(string)", 這個格式和上面的以標準輸入爲輸入文件的文件名格式相同。
這樣是爲了程序上的統一,就是看到文件是一個括號裏有一個字符串,就知道文件並不是真正的文件,而只是爲了維持寫程序時概念上的統一。
這也是寫程序中比較經常使用的技巧,就是把特例轉化爲某種特殊的通常狀況。

到這裏,和編譯器相關的 inout.c 中的內容已經說完了。這裏能夠回答在編譯器那裏提出的 compile 裏打開關閉文件相關的問題了。

那裏提出的爲何要調用 lua_openfile 這樣的問題,這裏解答一下,把輸入輸出這樣的放到一塊是出於設計上的考量,程序結構很清晰。

再誇一句,Lua 的設計作的很好,模塊化作得很漂亮,代碼質量也很高。

luac.c 裏提到和打開關閉文件相關的問題已經解答了。不過,在上面的看代碼的過程當中又發現一些新的問題,列在下面:
> lua_setinput 在詞法分析裏的做用?相關的詞法分析內容又是什麼?
> luaI_createfixedstring 是什麼? 那個 TaggedString 是個什麼數據結構?

記點題外話,其實也不算是偏題太遠。目前計劃的是 Lua2.4 先跟編譯器這條線兒,這條線兒結束了,再看看解釋器那條。只看代碼,寫代碼相關的東西,原理性的東西,不影響解釋的狀況下,儘可能少說。由於原理性的東西,網上仍是比較多的,相關的書籍也有不少。這裏說的原理性的東西主要是指編譯原理相關的。

----------------------------------------
記一下到目前爲止的問題:
inout.c
> lua_setinput 在詞法分析裏的做用?相關的詞法分析內容又是什麼?
> luaI_createfixedstring 是什麼? 那個 TaggedString 是個什麼數據結構?

luac.c
> do_compile 裏的 TFunc 是什麼?那個初始化 luaI_initTFunc 是什麼?
> lua_parser 是什麼? do_dump 方法裏調的那幾個方法又分別是幹什麼的?
----------------------------------------
lua

相關文章
相關標籤/搜索