宣传型网站建设,积分商城系统,做网站的模版,上海有哪些优化网站推广公司前言 本篇在讲什么 Lua的词法分析 本篇需要什么 对Lua语法有简单认知 对C语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践#xff0c;轻理论#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ #x1f449; ♠ 一级标题… 前言 本篇在讲什么 Lua的词法分析 本篇需要什么 对Lua语法有简单认知 对C语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践轻理论快速上手 提供全流程的源码内容 ★提高阅读体验★ ♠ 一级标题 ♥ 二级标题 ♣ 三级标题 ♦ 四级标题 目录 ♠ 前言♠ luaL_dofile♠ 保留字♠ token♠ 关键函数♠ 实例详解♠ 推送♠ 结语 ♠ 前言 ♠ 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);
}其实际上执行了两个函数分别是luaL_loadfile和lua_pcall二者包括宏均定义在lauxlib.h脚本内 本篇重点去认识和了解luaL_loadfile函数在该函数内去对一个Lua文件进行词法分析 ♠ 保留字
我们先了解一下Lua的一些保留字其定义在llex.h脚本当中每一个保留字都对应了Lua中某个关键字或类型比如TK_AND代指的就是and关键字 保留字定义为int类型从257开始以此递增原因是Lua识别字符的时候通过Ascii码来标记防止二者有冲突 ♠ token
我们先了解一下什么是token其代指的保留字相关的枚举类型每一个都是一个token类型
Lua在做词法分析的时候会根据不同的token类型去执行不同的方法词法分析的过程可以理解成对每一个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数字1ascill码61 ♠ 关键函数
我们了解一下个词法分析相关的重要函数和作用
luaL_loadfile 解析Lua脚本获取脚本内的二进制或字节流 luaY_parser 词法分析的核心函数 luaX_next 解析字节流中的下一个token块 chunk 解析token的函数 简单的概括下对一段Lua代码进行词法分析都经历了哪些步骤 ♠ 实例详解
我们直接通过断点调试和堆栈信息查看来看看解析一段Lua代码的过程这里直接从luaY_parser函数开始Lua代码如下所示
local num 11、运行代码后第一个断点卡在了chunk函数我们可以通过堆栈信息看到lexstate中获取的第一个token是268对应的正是Lua中的local 2、第二个断点我们打在了statement函数里可以看到因为获取的token是TK_LOCAL所以执行到了对应的case里面 3、第三个断点我们打在了luaX_next函数里从堆栈中看到新获取的token是285对应的是TK_NAME因为lua中的num是我们自定义的变量 4、放开断点继续执行依然卡到了luaX_next里面这里可一看获取到的token是61对应的就是的ascii码 5、放开断点继续执行依然卡到了luaX_next里面这里可一看获取到的token是284对应的类型是TK_NUMBER因为我们在Lua中给变量num赋值是数字1 6、继续执行获取的最后一个token是287对应的类型是TK_EOS该token类型代表着解析结束 至此我们对该Lua代码的词法解析就全部结束了 ♠ 推送
Github
https://github.com/KingSun5♠ 结语
若是觉得博主的文章写的不错不妨关注一下博主点赞一下博文另博主能力有限若文中有出现什么错误的地方欢迎各位评论指摘。 本文属于原创文章转载请评论留言并在转载文章头部著名作者出处