cocos 3.x關於error: syntax error during pre-compilation


在編寫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行處的末尾,添加了一個中文符號“;”,編譯后,運行腳本,提示錯誤:

輸出:

在這種情況下,我相信比之前查找錯誤要好很多,感謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM