做論壇網(wǎng)站時應(yīng)該注意什么印度疫情最新消息
本篇在講什么 Lua的詞法分析 本篇需要什么 對Lua語法有簡單認知 對C++語法有簡單認知 依賴Visual Studio工具 本篇的特色 具有全流程的圖文教學(xué) 重實踐,輕理論,快速上手 提供全流程的源碼內(nèi)容 |
![]() ★提高閱讀體驗★ 👉 ? 一級標(biāo)題 👈👉 ? 二級標(biāo)題 👈👉 ? 三級標(biāo)題 👈👉 ? 四級標(biāo)題 👈 |
目錄
- ? 前言
- ? luaL_dofile
- ? 保留字
- ? token
- ? 關(guān)鍵函數(shù)
- ? 實例詳解
- ? 推送
- ? 結(jié)語
? 前言
? luaL_dofile
在C++中我們通過luaL_dofile
宏來加載一個lua文件,如下述代碼所示
int main()
{lua_State* L = luaL_newstate();luaL_openlibs(L);luaL_dofile(L, "lua_src/test.lua");lua_close(L);
}
其實際上執(zhí)行了兩個函數(shù),分別是luaL_loadfile
和lua_pcall
,二者包括宏均定義在lauxlib.h
腳本內(nèi)
本篇重點去認識和了解luaL_loadfile
函數(shù),在該函數(shù)內(nèi)去對一個Lua文件進行詞法分析
? 保留字
我們先了解一下Lua的一些保留字,其定義在llex.h
腳本當(dāng)中,每一個保留字都對應(yīng)了Lua中某個關(guān)鍵字或類型,比如TK_AND
代指的就是and
關(guān)鍵字
保留字定義為int類型,從257
開始,以此遞增,原因是Lua識別字符的時候通過Ascii
碼來標(biāo)記,防止二者有沖突
? token
我們先了解一下什么是token
,其代指的保留字相關(guān)的枚舉類型,每一個都是一個token類型
Lua在做詞法分析的時候會根據(jù)不同的token類型去執(zhí)行不同的方法,詞法分析的過程可以理解成對每一個token分析的過程
舉個例子,我們在腳本test.lua
中定義了一句Lua代碼,如下圖所示,其解析過程如下:
1、local ——> TK_LOCAL(268)
2、空格 ——> 32(空格ascii碼)
3、num ——> TK_NAME(285)(自定義變量)
4、空格 ——> 32(空格ascii碼)
5、等號 ——> 61(=的ascii碼)
6、空格 ——> 32(空格ascii碼)
7、1 ——> TK_NUMBER(數(shù)字1,ascill碼61)
? 關(guān)鍵函數(shù)
我們了解一下個詞法分析相關(guān)的重要函數(shù)和作用
- luaL_loadfile
解析Lua腳本,獲取腳本內(nèi)的二進制或字節(jié)流
- luaY_parser
詞法分析的核心函數(shù)
- luaX_next
解析字節(jié)流中的下一個token塊
- chunk
解析token的函數(shù)
簡單的概括下對一段Lua代碼進行詞法分析都經(jīng)歷了哪些步驟
? 實例詳解
我們直接通過斷點調(diào)試和堆棧信息查看,來看看解析一段Lua代碼的過程,這里直接從luaY_parser
函數(shù)開始,Lua代碼如下所示
local num = 1
1、運行代碼后第一個斷點卡在了chunk
函數(shù),我們可以通過堆棧信息看到&lexstate
中獲取的第一個token是268,對應(yīng)的正是Lua中的local
2、第二個斷點我們打在了statement
函數(shù)里,可以看到因為獲取的token是TK_LOCAL
所以執(zhí)行到了對應(yīng)的case里面
3、第三個斷點我們打在了luaX_next
函數(shù)里,從堆棧中看到新獲取的token是285,對應(yīng)的是TK_NAME
,因為lua中的num
是我們自定義的變量
4、放開斷點繼續(xù)執(zhí)行,依然卡到了luaX_next
里面,這里可一看獲取到的token
是61,對應(yīng)的就是=
的ascii碼
5、放開斷點繼續(xù)執(zhí)行,依然卡到了luaX_next
里面,這里可一看獲取到的token
是284,對應(yīng)的類型是TK_NUMBER
,因為我們在Lua中給變量num賦值是數(shù)字1,
6、繼續(xù)執(zhí)行,獲取的最后一個token是287,對應(yīng)的類型是TK_EOS
,該token類型代表著解析結(jié)束
至此,我們對該Lua代碼的詞法解析就全部結(jié)束了
? 推送
- Github
https://github.com/KingSun5
? 結(jié)語
若是覺得博主的文章寫的不錯,不妨關(guān)注一下博主,點贊一下博文,另博主能力有限,若文中有出現(xiàn)什么錯誤的地方,歡迎各位評論指摘。