在編寫lua中,關於error:syntax error during pre-compliation,似乎是家常便飯,能否有一個更為詳細的定位來指正錯誤。答案是可以的。
首先,我們可以根據提示在LuaStack::luaLoadBuffer(...)中,你會發現相關的代碼實現,其主要代碼如下:
// 加載腳本相關
int LuaStack::luaLoadBuffer(lua_State *L, const char *chunk, int chunkSize, const char *chunkName) { int r = 0; // 解密以XXTA加密的lua文件 if (_xxteaEnabled && strncmp(chunk, _xxteaSign, _xxteaSignLen) == 0) { xxtea_long len = 0; unsigned char* result = xxtea_decrypt((unsigned char*)chunk + _xxteaSignLen, (xxtea_long)chunkSize - _xxteaSignLen, (unsigned char*)_xxteaKey, (xxtea_long)_xxteaKeyLen, &len); skipBOM((const char*&)result, (int&)len); r = luaL_loadbuffer(L, (char*)result, len, chunkName); free(result); } else { skipBOM(chunk, chunkSize); r = luaL_loadbuffer(L, chunk, chunkSize, chunkName); }
// 檢查文件合法性,倘若不合法,返回對應的錯誤 #if defined(COCOS2D_DEBUG) && COCOS2D_DEBUG > 0 if (r) { switch (r) { case LUA_ERRSYNTAX: // 語法錯誤 CCLOG("[LUA ERROR] load \"%s\", error: syntax error during pre-compilation.", chunkName); break; case LUA_ERRMEM: // 內存分配錯誤 CCLOG("[LUA ERROR] load \"%s\", error: memory allocation error.", chunkName); break; case LUA_ERRRUN: // 運行錯誤 CCLOG("[LUA ERROR] load \"%s\", error: run error.", chunkName); break; case LUA_ERRFILE: // 文件錯誤 CCLOG("[LUA ERROR] load \"%s\", error: cannot open/read file.", chunkName); break; case LUA_ERRERR: // 運行錯誤處理函數時發生錯誤 CCLOG("[LUA ERROR] load \"%s\", while running the error handler function.", chunkName); break; default:
// 未知錯誤 CCLOG("[LUA ERROR] load \"%s\", error: unknown.", chunkName); } // 此處要做修改,稍后會添加一些代碼:do something } #endif return r; }
關於Lua的錯誤標記,大體分為編譯錯誤和運行錯誤。如下:
#define LUA_YIELD 1 -- 線程被掛起 #define LUA_ERRRUN 2 -- 運行時的錯誤 #define LUA_ERRSYNTAX 3 -- 編譯錯誤 #define LUA_ERRMEM 4 -- 內存分配錯誤 #define LUA_ERRERR 5 -- 在運行錯誤處理函數時發生的錯誤
以上都能將錯誤信息返回到堆棧的最頂層,因此在loadBuffer表明的注釋部分,可添加如下代碼:
-- 通過lua的堆棧,獲取棧頂的錯誤信息,將錯誤日志打印出來
const char* error = lua_tostring(L, -1); -- -1表示棧頂,lua_tostring用於獲取棧中數據,然后轉換為string CCLOG("[LUA ERROR] error result: %s",error); lua_pop(L, 1);
簡要說明下,lua與C++之間的數據交互是通過堆棧進行,其堆棧索引可以是正數,也可以是負數。
棧中的數據通過索引值進行定位,可理解為棧頂就是-1,棧底就是1。
更多參考:https://www.cnblogs.com/SkyflyBird/p/11938373.html
編寫如上代碼后,重新編譯運行,寫一個例子看看效果,在42行處的末尾,添加了一個中文符號“;”,編譯后,運行腳本,提示錯誤:
輸出:
在這種情況下,我相信比之前查找錯誤要好很多,感謝!
