Lua学习笔记:词法分析

2023-09-22 15:32:57
前言
本篇在讲什么

Lua的词法分析
本篇需要什么

Lua语法有简单认知
C++语法有简单认知
依赖Visual Studio工具

本篇的特色

具有全流程的图文教学
重实践,轻理论,快速上手
提供全流程的源码内容


★提高阅读体验★

👉 ♠ 一级标题 👈

👉 ♥ 二级标题 👈

👉 ♣ 三级标题 👈

👉 ♦ 四级标题 👈


♠ 前言


♠ 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_loadfilelua_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(数字1,ascill码61)

在这里插入图片描述


♠ 关键函数

我们了解一下个词法分析相关的重要函数和作用

  • luaL_loadfile

解析Lua脚本,获取脚本内的二进制或字节流

  • luaY_parser

词法分析的核心函数

  • luaX_next

解析字节流中的下一个token块

  • chunk

解析token的函数

简单的概括下对一段Lua代码进行词法分析都经历了哪些步骤

在这里插入图片描述


♠ 实例详解

我们直接通过断点调试和堆栈信息查看,来看看解析一段Lua代码的过程,这里直接从luaY_parser函数开始,Lua代码如下所示

local num = 1

1、运行代码后第一个断点卡在了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

♠ 结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈
更多推荐

什么是Vue的Vetur插件?它有哪些功能

引言在现代前端开发中,Vue.js已经成为了一个备受欢迎的JavaScript框架。随着Vue.js的流行,开发人员需要强大的工具来提高他们的生产力和Vue.js项目的质量。Vetur插件是一个为Vue.js开发者提供的强大工具,它不仅提供了丰富的功能,还能让你更轻松地编写和维护Vue.js应用程序。本文将深入探讨Ve

007-第一代软件需求整理

第一代软件需求整理文章目录第一代软件需求整理项目介绍需求来源需求来源1:竞品软件分析需求来源2:医生(市场)需求来源3:项目组内部需求来源4:软件组内部需求来源5:软件开发成员需求来源6:法律和法规总结一下关键字:Qt、Qml、需求、类型、采集项目介绍欢迎来到我们的QML&C++项目!这个项目结合了QML(QtMeta

Unity shader内置standard代码解析

最近有相关需求制作,所以这里编写一个文档,方便后续的流程查看。下载源码由于unity内置的shader是无法查看源码的,你需要去官网下载对应版本内置源码查看在引擎下载那里,会有一个BuiltinShaders,下载打开以后,就是对应的shader内置的shandard在DefaultResourcesExtra目录内,

更快,更稳,更智能,科聪穿梭车(RGV)快速构建方案!

随着自动化物流发展,密集存储得到越来越广泛地应用,已经是现代物流的重要组成部分之一。作为密集存储系统中关键设备之一,穿梭车(RGV)越来越受到大家的重视。穿梭车(RGV)是一种智能机器人,可以编程实现取货、运送、放置等任务,并可与上位机、调度系统或WMS系统进行通讯,结合RFID、条码等识别技术,实现自动化识别、存取等

Git:Git的一些基本操作

文章目录基本认识使用方法创建本地仓库配置本地仓库工作区、暂存区、版本库的概念添加文件版本回退撤销修改删除操作基本认识首先要对Git有一个基本的认知:Git本质上是一个版本控制器,可以对一个信息的多个版本进行一些控制,而能对版本的控制的好处就是,不管需要哪个版本的内容,都可以借助Git这个工具找到所需要的信息Git是一个

API接口在电商商品数据获取中的应用

一、引言在当前的数字化时代,电子商务平台已经成为了人们购物的主要场所之一。许多电商平台都提供了API接口,以便开发者可以获取商品数据并进行创新应用。本文将深入探讨如何使用API接口获取商品数据,以及如何将这些数据应用到电商领域中。二、API接口概述1.API接口定义API(ApplicationProgrammingI

Java-List<Map>的复制 深拷贝与浅拷贝

博客背景是Java开发。讲一讲List<Map>的复制中深拷贝与浅拷贝。文章目录1、浅拷贝1.1循环遍历复制1.2使用list实现类的构造方法1.3addAll方法2、深拷贝深拷贝工具类SerializationUtils.clone1、浅拷贝Map除了基本类型是值传递,其余的都是引用地址传递。由于map的value存

MySql(随记)

一条MySql执行过程首先Mysql的架构分为两层,Server层和存储引擎层。Server层:MySql大多数核心功能,主要包括,连接器,查询缓存,解释器,预处理器,优化器,执行器等存储引擎层:负责数据的获取和存储。(innodb,MyISAM)连接器1.首先经过TCP三次握手,随后进行权限验证,若有问题则返回“Ac

UI美工设计岗位的基本职责概述(合集)

UI美工设计岗位的基本职责概述11、有良好的美术功底、设计新颖,整体配色及设计创意理念,能够独立完成整个网站页面设计及制作;2、熟练运用DIV+CSS,HTML设计制作网页;3、熟练运用Photoshop,Dreamweaver,Coreldraw(或Illustrator),Flash,Fireworks等软件。4、

两个有序链表序列的交集

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。输入格式:输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。输出格式:在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。输入

红黑树插入的实现

红黑树:1.概念:红黑树的性质:红黑树的插入操作:其前面的插入和二叉搜索树的一模一样,只是后面需要判断是否满足红黑树的性质:具体分为三种情况:1.uncle节点存在且为红色的:对应如图:这种情况只需要将parent和uncle节点都弄成黑色,对应的grandparent节点弄成黑色接下来又会分为三种情况:1.如果对应的

热文推荐