lua-checker[譯]轉(zhuǎn)載請注明出處。
https://code.google.com/p/lua-checker/ 簡介
Lua Checker是一個用來分析lua源代碼的一般錯誤的程序,很想C語言的"lint"。以下的問題已經(jīng)被定義:
Lua Checker是谷歌Street View團(tuán)隊(duì)用來驗(yàn)證Lua腳本而編寫的。Lua Checker是在Lua 5.0標(biāo)準(zhǔn)允許的。
Lua Checker包含一個bison兼容的解析器(詳見lua.y)。
背景
諸如C/C++和Java都是強(qiáng)類型的。這意味著每一個變量只有一種類型(比如數(shù)組、字符串或者對象),當(dāng)變量被錯誤使用的時候,編譯器會給出錯誤信息。所以很多問題都能盡早被發(fā)現(xiàn)。
相反地,Lua腳本語言是動態(tài)類型的,只有一種簡單的類型模型(a simple type model)。變量可被指派為任意類型。這使得腳本語言的開發(fā)在某種程度上更加簡單,但是它也意味著在一些大型程序中,很多一般的錯誤只有在程序運(yùn)行的時候才能被發(fā)現(xiàn)。舉例:
事實(shí)上,超過1000行的Lua程序tend to累積這些問題,從而使得調(diào)試變得困難。一種標(biāo)準(zhǔn)的用來處理未定義的全局變量的Lua慣例是在全局變量的table安裝一個特殊的'get-value'句柄,可以警告未定的全局變量。這是有局限性的,因?yàn)槿耘f只有在程序運(yùn)行的時候才能發(fā)現(xiàn)缺陷。
Lua Checker正式用來解決這些問題的。它在程序運(yùn)行前執(zhí)行靜態(tài)分析,并且可以發(fā)現(xiàn)問題并給出警告信息。
用法
為了幫助Lua Checker做這些工作,Lua源碼必須被寫得更加嚴(yán)謹(jǐn)。
1、所有的全局變量在使用前必須聲明,如下:
但是不能像這樣,即使作用是相同的:
2、通過_G table進(jìn)入的全局變量可以被檢查機(jī)制忽略,所以盡量不要這樣做。
3、通過dofile被包含進(jìn)的源文件也會被掃描,只要dofile用一個單獨(dú)的字符串參數(shù)被調(diào)用在outer scope:
4、變量可以被聲明為常量,只要添加了以下代碼:
--@標(biāo)記代表著特殊的lua checker關(guān)鍵字將會在同一行出現(xiàn)。const 關(guān)鍵字意味著之前的變量被聲明為一個常量。之后任何對這個常量其他的操作
都被認(rèn)為是錯誤的。注意特殊的關(guān)機(jī)子能夠跟隨lua注釋,如下:
命令行參數(shù)
CHECK_LUA.SH是用來調(diào)用lua_checker的。它是笨拙的并且將被更好的代替。
lua_checker 程序像這樣被調(diào)用:
可用的flags參數(shù)是
實(shí)現(xiàn)(Implementation)
Lua Checker的有趣部分被應(yīng)用在bison解析器中。兩個分開的部分被使用,那在兩個分開的程序中執(zhí)行:
遠(yuǎn)景(Future)
產(chǎn)品特色:
分類: Lua
|
|