Lua学习笔记:词法分析

news2024/12/24 9:16:31
前言
本篇在讲什么

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_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

♠ 结语

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1033482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

stm32之PWM呼吸灯

呼吸灯是灯从渐亮到渐灭周而复始形成的一个效果。由于51没有PWM所以需要定时器模拟PWM才能实现呼吸灯的效果,但是stm32的通用定时器是有PWM模式的,所以不需要再用软件模拟,精准度也高。 本实验用的基于stm32f103C8t6。在PB8引脚上接了一个le…

stm32之串口/蓝牙控制led灯

该文章记录学习stm32串口遇到的一些问题,完整代码地址。 一、项目描述 通过串口或蓝牙发送指令来控制led灯。 open ------> led 亮close ------> led 灭其它 -------> 反馈给串口或蓝牙错误指令 二、项目用到的模块 stm32 串口1,PA9(TX), PA10(RX)HC…

计算机组成与设计硬软件接口学习2

并行处理器:从客户端到云 任务级并行或进程级并行:通过同时运行独立的多个程序来使用多处理器 并行处理程序:同时在多个处理器上运行的单个程序 通过增加硬件的方式,将取指令和指令译码实现并行,一次性取出多条指令…

MQTT 协议概要

01 MQTT协议 MQTT(消息队列遥测传输) 是基于 TCP/IP 协议栈而构建的支持在各方之间异步通信的消息协议。MQTT在空间和时间上将消息发送者与接收者分离,因此可以在不可靠的网络环境中进行扩展。虽然叫做消息队列遥测传输,但它与消息…

[RF学习记录][ssh library][execute Command】关键字的返回值

有时候需要判断通过ssh在远程机器上执行的命令是否正常,使用关键字Execute Command可以在远程机器上运行命令,但是默认不加任何参数的话,没有看到范返回值,而这个关键字是带了几个参数的,简单的试验了下这几个参数&…

点云从入门到精通技术详解100篇-单期点云的高斯曲率定位桥梁潜在损伤技术研究

目录 前言 国内外研究现状 三维激光扫描对桥梁损伤检测的研究现状 基于点云高斯曲率损伤检测的研究现状 柱体偏差检测技术研究现状 存在的问题 法向量约束高斯曲率的 TLS 桥面潜在损伤区域探测 2.1 高斯曲率探伤的基本理论 2.2 点云拓扑关系建立的方法比较 2.2.1 KD-…

机器学习第十三课--主成分分析PCA

一.高维数据 除了图片、文本数据,我们在实际工作中也会面临更多高维的数据。比如在评分卡模型构建过程中,我们通常会试着衍生出很多的特征,最后就得到上千维、甚至上完维特征;在广告点击率预测应用中,拥有几个亿特征也是常见的事…

【数学建模】2023华为杯研究生数学建模F题思路详解

强对流降水临近预报 我国地域辽阔,自然条件复杂,因此灾害性天气种类繁多,地区差异大。其中,雷雨大风、冰雹、龙卷、短时强降水等强对流天气是造成经济损失、危害生命安全最严重的一类灾害性天气[1]。以2022年为例,我国强对流天气引发风雹灾害造成的死亡失踪人数和直接经济…

git:一、GIT介绍+安装+全局配置+基础操作

版本管理系统(SVN和Git): 集中式版本控制系统(SVN) SVN是集中式版本控制系统,版本库是集中放在中央服务器的. 工作流程如下: 1.从中央服务器远程仓库下载代码 2.修改后将代码提交到中央服务器远程仓库…

基于微信小程序的电影院订票系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言运行环境说明用户微信小程序端的主要功能有:管理员的主要功能有:具体实现截图详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考论文参考源码获取 前言 💗博主介绍&…

原生js的animate()方法详解

1.介绍 Element 接口的 animate() 方法是创建一个新的 Animation 的便捷方法,将它应用于元素,然后运行动画。它将返回一个新建的 Animation 对象实例。 同时通过Element.getAnimations() 方法可获取元素所有的Animation实例。 2.语法 Element.animate…

读高性能MySQL(第4版)笔记14_备份与恢复(中)

1. 在线备份 2. 离线备份 2.1. 关闭MySQL做备份是最简单、最安全的 2.2. 所有获取一致性副本的方法中最好的 2.3. 损坏或不一致的风险最小 2.4. 根本不用关心InnoDB缓冲池中的脏页或其他缓存 2.5. 不需要担心数据在尝试备份的过程中被修改 2.5.1. 服务器不对应用提供访问…

Redis淘汰策略-架构案例2020(三十六)

上篇案例回顾: 解释器,管道过滤,隐式调用优缺点? 解释器 则是独立的语法规则,可以通过解释器来解析,可扩展性很高,灵活性强。 管道过滤则是侧重于数据的输入和输出,上一个模块的数…

stm32之看门狗

STM32 有两个看门狗,独立看门狗和窗口看门狗,独立看门狗又称宠物狗,窗 口看门狗又称警犬。可用来检测和解决由软件错误引起的故障。两个看门狗的原理都是当计数器达到给定的超时值时,产生系统复位,对于窗口型看门狗同…

2023.9.20 简单了解 HTTP协议 及 Fiddle 安装使用

目录 HTTP 协议基本概念 Fiddle 下载 HTTP 请求格式 HTTP 响应格式 HTTP 协议基本概念 应用层使用最广泛的协议浏览器 基于 HTTP协议 获取网站是 浏览器 和 服务器 之间的交互桥梁HTTP协议 基于传输层的 TCP协议 实现HTTP 全称为 HyperText Transfer Protocol,中…

Java IO流实现文件复制

目录 前言 文件复制底层逻辑 代码实现 ​编辑 重点!!! 完整代码 改善思考 前言 Windows文件复制时我们是使用Ctrl C复制Ctrl V粘贴,上一篇文章Java基础入门对存储文件的相关操作 我们学习了Java IO流对文件的读写操作&…

数据结构--排序(1)

文章目录 排序概念直接插入排序希尔排序冒泡排序堆排序选择排序验证不同排序的运行时间 排序概念 排序指的是通过某一特征关键字(如信息量大小,首字母等)来对一连串的数据进行重新排列的操作,实现递增或者递减的数据排序。 稳定…

深度学习自学笔记二:逻辑回归和梯度下降法

目录 一、逻辑回归 二、逻辑回归的代价函数 三、梯度下降法 一、逻辑回归 逻辑回归是一种常用的二分类算法,用于将输入数据映射到一个概率输出,表示为属于某个类别的概率。它基于线性回归模型,并使用了sigmoid函数作为激活函数。 假设我们…

Git_06_创建分支/查看分支

创建分支 # 创建分支的同时,切换到该分支上 > git checkout -b 分支名称 # > git push origin 分支名称查看分支 # 查看本地分支 > git branch # 查看远程分支 > git branch -r # 查看所有分支 > git branch -a删除分支 # 删除本地分支 > git …

app一键加固加签名脚本 百度加固 window版本

echo off setlocal enabledelayedexpansionset KEYSTORE_PATH*.jks set KEYSTORE_PASSWORD* set KEY_ALIAS* set KEY_PASSWORD*set OUTPUT_DIR%cd%\out set UNSIGNED_DIR%cd%\unsignedREM 设置加固工具的路径和密钥 set APKPROTECT_PATH"apkprotect" set AKEY替换成你…