Lua学习笔记:词法分析

前言
本篇在讲什么

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.xdnf.cn/news/139600.html

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

相关文章

207.Flink(二):架构及核心概念,flink从各种数据源读取数据,各种算子转化数据,将数据推送到各数据源

一、Flink架构及核心概念 1.系统架构 JobMaster是JobManager中最核心的组件,负责处理单独的作业(Job)。一个job对应一个jobManager 2.并行度 (1)并行度(Parallelism)概念 一个特定算子的子任务(subtask)的个数被称之为其并行度(parallelism)。这样,包含并行子任…

【方案】浅析AI视频分析与视频监控技术的工厂车间智能化监管方案

一、方案背景 工厂生产车间一般是从原材料到成品的流水作业,有大量器械和物料。为保障车间财产安全并提高生产效率,需要进行全面的监管。在生产制造流水线的关键工序中,不仅有作业过程监管需求,同时,也存在生产发生异…

第七章 查找

一、树形查找-二叉排序树和红黑树 二叉排序树 // 二叉排序树节点 typedef struct BSTNode{ElemType key;struct BSTNode *lchild, *rchild; } BSTNode, *BSTree;五叉查找树 // 5叉排序树的节点定义 struct Node{ElemType keys[4]; // 5叉查找树一个节点最多4个关键字struct…

【二、安装centOS】

下载 地址:https://mirrors.aliyun.com/centos/ 地址 1、https://mirrors.aliyun.com/centos/7.9.2009/ 2、https://mirrors.aliyun.com/centos/7.9.2009/isos/ 3、https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/ 选哪一个 可以选择第一个&#xff0…

Openresty(二十二)ngx.balance和balance_by_lua终结篇

一 灰度发布铺垫 ① init_by_lua* init_by_lua init_by_lua_block 特点: 在openresty start、reload、restart时执行,属于master init 阶段机制: nginx master 主进程加载配置文件时,运行全局Lua VM级别上的参数指定的Lua代码场景: …

java版Spring Cloud+Mybatis+Oauth2+分布式+微服务+实现工程管理系统

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内部工程管…

(二)随机变量的数字特征:探索概率分布的关键指标

文章目录 🍋1. 随机变量的数学期望🍋1.1 离散型随机变量的数学期望🍋1.2 连续型随机变量的数学期望 🍋2. 随机变量函数的数学期望🍋2.1 一维随机变量函数的数学期望🍋2.2 二维随机变量函数的数学期望 &…

基于SpringBoot的网上超市系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 管理员功能实现 用户功能实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计…

linux升级glibc-2.28

1.准备工作 1.1升级gcc到gcc8 # 安装devtoolset-8-gcc yum install centos-release-scl yum install devtoolset-8 scl enable devtoolset-8 -- bash# 启用工具 source /opt/rh/devtoolset-8/enable # 安装GCC-8 yum install -y devtoolset-8-gcc devtoolset-8-gcc-c devtoolse…

open62541开发:添加sqlite3 历史数据库

历史数据库在OPCUA 应用中十分重要,例如OPCUA 网关和OPCUA 汇聚服务器中都需要历史数据库功能。但是open62541 协议栈中仅包含了基于内存的历史数据库,在实际应用中是不够的。本博文讨论open62541 中添加sqlite3 为基础的历史数据库若干问题。 借鉴 Gi…

某手新版本sig3参数算法还原

Frida Native层主动调用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81…

Lua学习笔记:探究package

前言 本篇在讲什么 理解Lua的package 本篇需要什么 对Lua语法有简单认知 对C语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 ★提高阅读体验★ 👉 ♠ 一级…

ruoyi框架修改左侧菜单样式

菜单效果 ruoyi前端框架左侧的菜单很丑,我们需要修改一下样式,下面直接看效果。 修改代码 1、sidebar.scss .el-menu-item, .el-submenu__title {overflow: hidden !important;text-overflow: ellipsis !important;white-space: nowrap !important;//…

微软宣布推广数字助理 Copilot;GPT 应用开发和思考

🦉 AI新闻 🚀 微软宣布推广基于生成式人工智能的数字助理 Copilot 摘要:微软宣布将基于生成式人工智能的数字助理 Copilot 推广到更多软件产品中。新的 AI 助理 Microsoft Copilot 将在 Windows 中无缝可用,包括 Windows 11 桌面…

【C++面向对象侯捷】12.虚函数与多态 | 13.委托相关设计【设计模式 经典做法,类与类之间关联起来,太妙了,不断的想,不断的写代码】

文章目录 12.虚函数与多态举例:委托 继承【观察者模式】13.委托相关设计Composite 组合模式Prototype 原型模式 12.虚函数与多态 纯虚函数 一定要 子类重新定义的 继承和复合 关系下的构造和析构 举例:委托 继承【观察者模式】 13.委托相关设计 问题…

BOM与DOM--记录

BOM基础(BOM简介、常见事件、定时器、this指向) BOM和DOM的区别和联系 JavaScript的DOM与BOM的区别与用法详解 DOM和BOM是什么?有什么作用? 图解BOM与DOM的区别与联系 BOM和DOM详解 JavaScript 中的 BOM(浏览器对…

蓝桥杯 题库 简单 每日十题 day8

01 扫雷 题目描述 在一个n行列的方格图上有一些位置有地雷,另外一些位置为空。 请为每个空位置标一个整数,表示周围八个相邻的方格中有多少个地雷。 输入描述 输入的第一行包含两个整数n,m。 第2行到第n1行每行包含m个整数,相邻整…

数据结构——单链表

目录 一.前言 二.链表表示和实现(单链表) 1.1 顺序表的优缺点 1.2 链表的概念及结构 1.3 打印函数 1.4 空间函数 1.5 尾插函数(最最最麻烦的) 1.5.1 尾插最关键部分! 1.6 头插函数 1.7 尾删函数…

深拷贝和浅拷贝

两者区别 深拷贝和浅拷贝是用来描述对象或者对象数组这种引用数据类型的复制场景的。 浅拷贝 浅拷贝,就是只复制某个对象的指针,而不复制对象本身。这种复制方式意味着两个引用指针指向被复制对象的同一块内存地址,如下图: 深拷贝…

conda的安装和使用

参考资料: https://www.bilibili.com/read/cv8956636/?spm_id_from333.999.0.0 https://www.bilibili.com/video/BV1Mv411x775/?spm_id_from333.999.0.0&vd_source98d31d5c9db8c0021988f2c2c25a9620 目录 conda是啥以及作用conda的安装conda的启动conda的配置…