Lua2.4 開啟檔案 inout.c

來源:互聯網
上載者:User

標籤:io   os   ar   檔案   資料   sp   問題   c   on   

這雷根據 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 方法裡調的那幾個方法又分別是幹什麼的?
----------------------------------------

Lua2.4 開啟檔案 inout.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.