Lua中文语言编程源码-第一节,更改llex.c词法分析器模块, 使Lua支持中文关键词。

源码已经更新在CSDN的码库里:

git clone https://gitcode.com/funsion/CLua.git

在src文件夹下的llex.c,是Lua的词法分析器模块。

增加中文保留字标识符列表,保留英文保留字标识符列表。

搜索“ORDER RESERVED”,将原始代码

/* ORDER RESERVED */
static const char *const luaX_tokens [] = {"and", "break", "do", "else", "elseif","end", "false", "for", "function", "goto", "if","in", "local", "nil", "not", "or", "repeat","return", "then", "true", "until", "while","//", "..", "...", "==", ">=", "<=", "~=","<<", ">>", "::", "<eof>","<number>", "<integer>", "<name>", "<string>"
};

更改成以下代码:

/* 保留字标识符列表 */
static const char *const luaX_tokens[] = {"与", "跳出", "做", "否则", "要么","结束", "假", "因为", "函数", "跑到", "如果","属于", "局部", "虚", "非", "或", "重复","返回", "即", "真", "直至", "当","//", "..", "...", "==", ">=", "<=", "~=","<<", ">>", "::","<文末>", "<数字>", "<整数>", "<名字>", "<文字>"};/* 英文保留字标识符列表 */
static const char *const luaX_tokens1[] = {"and", "break", "do", "else", "elseif","end", "false", "for", "function", "goto", "if","in", "local", "nil", "not", "or", "repeat","return", "then", "true", "until", "while","//", "..", "...", "==", ">=", "<=", "~=","<<", ">>", "::", "<eof>","<number>", "<integer>", "<name>", "<string>"};

为了保证中英文都可以使用,以便你可以复制英文原码来进行更改。所以保留了英文的关键词,这样就只能使用两个关键词表,luaX_tokens[]数组,luaX_tokens1[]数组。

初始化Lua状态机的预留关键字和环境变量名称。

搜索luaX_tokens,将原始代码

void luaX_init (lua_State *L) {int i;TString *e = luaS_newliteral(L, LUA_ENV);  /* create env name */luaC_fix(L, obj2gco(e));  /* never collect this name */for (i=0; i<NUM_RESERVED; i++) {TString *ts = luaS_new(L, luaX_tokens[i]);luaC_fix(L, obj2gco(ts));  /* reserved words are never collected */ts->extra = cast_byte(i+1);  /* reserved word */}
}

更改成增加中文关键字预留的操作。

/** 初始化Lua状态机的预留关键字和环境变量名称。* * 参数:*   L - 指向Lua状态机的指针。* * 返回值:*   无。*/
void luaX_init(lua_State *L)
{int i;/* 创建环境变量名称,并确保它不会被垃圾回收 */TString *e = luaS_newliteral(L, LUA_ENV); luaC_fix(L, obj2gco(e));  /* 遍历预留关键字列表,为每个关键字创建TString对象,并设置额外信息 */for (i = 0; i < NUM_RESERVED; i++){/* 创建预留关键字,并确保它们不会被垃圾回收 */TString *ts = luaS_new(L, luaX_tokens[i]);luaC_fix(L, obj2gco(ts));     ts->extra = cast_byte(i + 1); /* 将预留关键字设置为额外的标识信息 *//* 检查是否为预留关键字,相似地处理 */TString *ts2 = luaS_new(L, luaX_tokens1[i]); luaC_fix(L, obj2gco(ts2));                   ts2->extra = cast_byte(i + 1);               /* 将预留关键字设置为额外的标识信息 */}
}

然后保存后,即可以编译Lua的源码,初步实现以上列出的关键词的中文化。

注意,在Window系统下编译Lua, 最好将所有Lua的源码,重新保存成ANSI格式的文件,刚下载的默认的源码会是UTF-8格式的。

这个事情说三遍,

1,不然就会出现,Window下的UTF-8源码可编译,但Shell里的中文输出会乱码。
2,要不然就是Window的ANSI源码不可编译(假如你没做以上步骤),
3,如果是用ANSI格式的源码编译的Lua.exe,对应的,你在Window下写的Lua程序也是需要保存成ANSI格式的。这样就可以在Shell里输出正确的中文显示。

如图编译完了。Lua4.5.6,并且目前已经支持了以上我们所列出来的中文关键字。

来个小例程试一下,“如果演示.Lua"

如果 真 即print("如果,真,即,'print'打印还是英文,结束")
结束

演示截图如下:

好了,重拾Lua中文编程,在VC code 和 通义灵码的帮助下,还是更方便了。

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

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

相关文章

微信小程序开发学习笔记——3.10【小案例】表单提交样式布局与model双向绑定

>>跟着b站up主“咸虾米_”学习微信小程序开发中&#xff0c;把学习记录存到这方便后续查找。 课程连接&#xff1a;3.10.【小案例】表单提交样式布局与model双向绑定_哔哩哔哩_bilibili 一、model简易双向绑定 简单双向绑定语法查阅&#xff1a;小程序框架 / 视图层 /…

ARM和AMD介绍

一、介绍 ARM 和 AMD 都是计算机领域中的知名公司&#xff0c;它们在不同方面具有重要的影响和地位。 ARM&#xff08;Advanced RISC Machine&#xff09;&#xff1a;ARM 公司是一家总部位于英国的公司&#xff0c;专注于设计低功耗、高性能的处理器架构。ARM 架构以其精简指…

如何在“Microsoft Visual Studio”中使用OpenCV编译应用程序

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 前一篇&#xff1a;OpenCV4.9.0在windows系统下的安装 后一篇&#xff1a; 警告&#xff1a; 本教程可以包含过时的信息。 我在这里描述的所有内容都将适用于 OpenCV 的C\C接口。我首先假…

图像处理ASIC设计方法 笔记10 插值算法的流水线架构

&#xff08;一&#xff09; 三次插值算法实现的图像旋转设计的流水线架构 传统上&#xff0c;三次插值算法实现的图像旋转设计需要三块一样的处理资源&#xff0c;为了节约资源&#xff0c;采用流水线设计&#xff0c;简单来讲就是三次插值算法共用一块资源&#xff0c;优化这…

Hive Sql获取含有特殊字符key的json数据

hive表中json数据的key含有.符号&#xff0c;所以使用get_json_object(str,“$.key_1.key_2”)语法的时候就会获取到null。解法是通过json_to_map方法将json数据变成一个map结果&#xff0c;然后用key下标的方式获取值&#xff0c;代码 json_to_map(str)["key_1.key_2]

mysql报错日志查看

路径命令 在MySQL命令行客户端中&#xff0c;执行SHOW VARIABLES LIKE log_error;这个命令可以显示log_error系统变量的值&#xff0c;这个值通常指向MySQL的错误日志文件&#xff08;error log&#xff09;的路径。通过这个命令&#xff0c;你可以快速找到MySQL的报错日志文件…

数据结构的概念大合集02(线性表)

概念大合集02 1、线性表及其逻辑结构1.1 线性表的定义1.2 线性表的基本操作 2、线性表的顺序存储结构2.1 顺序表 3、线性表的链式存储3.1 链表3.1.1 头结点&#xff08;头指针&#xff09;&#xff0c;首指针&#xff0c;尾指针&#xff0c;尾结点3.1.2 单链表3.1.3 双链表3.1.…

软件供应链投毒 — NPM 恶意组件分析(二)

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01; 专栏供应链安全 数字化时代&#xff0c;软件无处不在。软件如同社会中的“虚拟人”&#xff0c;已经成为支撑社会正常运转的最基本元素之一&#xff0c;软件的安全性问题也正在成为当今社会的根本性、基础性问题。 随…

瑞熙贝通实验室安全培训考试系统

一、系统概述 瑞熙贝通实验室安全培训考试系统是一种基于互联网和人工智能技术的在线考试平台&#xff0c;旨在旨在提供实验室安全教育和考核的全面解决方案。该系统可以帮助实现实验室安全培训考试的在线化、智能化和规范化&#xff0c;提高实验室安全意识和能力&#xff0c;…

IntelliJ IDEA 面试题及答案整理,最新面试题

IntelliJ IDEA中的插件系统如何工作&#xff1f; IntelliJ IDEA的插件系统工作原理如下&#xff1a; 1、插件架构&#xff1a; IntelliJ IDEA通过插件架构扩展其功能&#xff0c;插件可以添加新的功能或修改现有功能。 2、安装和管理&#xff1a; 通过IDEA内置的插件市场下载…

【机器学习】1 机器学习概述

1.机器学习、人工智能、深度学习的关系 机器学习是人工智能的一个实现途径深度学习是机器学习的一个方法 2.人工智能的起点 1956年&#xff0c;达特茅斯会议&#xff0c;主题是&#xff1a;用机器来模仿人类学习以及他方面的智能。 3.人工智能的三大流派 符号主义学派:由心…

第二门课:改善深层神经网络<超参数调试、正则化及优化>-超参数调试、Batch正则化和程序框架

文章目录 1 调试处理2 为超参数选择合适的范围3 超参数调试的实践4 归一化网络的激活函数5 将Batch Norm拟合进神经网络6 Batch Norm为什么会奏效&#xff1f;7 测试时的Batch Norm8 SoftMax回归9 训练一个SoftMax分类器10 深度学习框架11 TensorFlow 1 调试处理 需要调试的参…

R语言深度学习-5-深度前馈神经网络

本教程参考《RDeepLearningEssential》 本篇我们将学习如何建立并训练深度预测模型。我们将关注深度前馈神经网络 5.1 深度前馈神经网络 我们还是使用之前提到的H2O包&#xff0c;详细可以见之前的博客&#xff1a;R语言深度学习-1-深度学习入门&#xff08;H2O包安装报错解决…

用 Visual Studio 调试器中查看内存中图像

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 前一篇&#xff1a;OpenCV4.9.0在windows系统下的安装 后一篇&#xff1a; ​警告 本教程可以包含过时的信息。 Image Watch 是 Microsoft Visual Studio 的插件&#xff0c;可用于在调…

Webapi(.net6) 批量服务注册

如果不考虑第三方库&#xff0c;如Autofac这种进行服务注入&#xff0c;通过本身的.Core Weabpi实现的&#xff0c;总结了两种实现方法&#xff0c; 1.一种是参考abp框架里面的形式; 1.1 新建个生命周期的文件夹: 三个接口分别为: public interface IScopedDependency { }pu…

tomcat 实现会话绑定

Tomcat 后端服务器实现 Session ID会话保持 基础架构&#xff1a; 7-6 代理服务器nginx配置 7-3 tomcat 服务器 7-5 同理 测试&#xff1a; 此时刷新&#xff0c;会话ID一直在变&#xff0c;这样不好 如何解决呢&#xff1f; 不好的是确定ip之后&#xff0c;会一直在一台机上…

RISC-V 编译环境搭建:riscv-gnu-toolchain 和 riscv-tools

RISC-V 编译环境搭建&#xff1a;riscv-gnu-toolchain 和 riscv-tools 编译环境搭建以及说明 操作系统&#xff1a;什么系统都可以 虚拟机&#xff1a;VMmare Workstation Pro 17.50.x (版本不限) 编译环境&#xff1a;Ubuntu 18.04.5 CPU&#xff1a;i7-8750h(虚拟机分配4核…

JVM学习-JMM

目录 1.什么是JMM 2.JMM怎样保障数据的可见性、有序性、原子性 2.1保证原子性 2.2.保证可见性 2.3保证有序性 3.CAS 3.1乐观锁和悲观锁 3.2 CAS介绍 4.重量级锁的自旋优化 1.什么是JMM JMM即Java内存模型 &#xff0c;定义了一套在多线程读写共享数据&#xff08;如数组、成…

openssl3.2 - note - Writing OpenSSL Provider Skeleton

文章目录 openssl3.2 - note - Writing OpenSSL Provider Skeleton概述笔记测试工程的建立复现的provider工程总结Provider包含的头文件openssl/core.h中的数据结构实现 OSSL_provider_init()看一下openssl自带的提供者provider的openssl命令行测试provider的本质是hook了opens…

插入排序:一种简单而有效的排序算法

插入排序&#xff1a;一种简单而有效的排序算法 一、什么是插入排序&#xff1f;二、插入排序的步骤三、插入排序的C语言实现四、插入排序的性能分析五、插入排序的优化六、总结 在我们日常生活和工作中&#xff0c;排序是一种非常常见的操作。比如&#xff0c;我们可能需要对一…