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.hqwc.cn/news/544630.html

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

相关文章

Redisson 分布式锁原理分析

Redisson 分布式锁原理分析 示例程序 示例程序&#xff1a; public class RedissonTest {public static void main(String[] args) {Config config new Config();config.useSingleServer().setPassword("123456").setAddress("redis://127.0.0.1:6379"…

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核…

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

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

游戏引擎中的动画基础

一、动画技术简介 视觉残留理论 - 影像在我们的视网膜上残留1/24s。 游戏中动画面临的挑战&#xff1a; 交互&#xff1a;游戏中的玩家动画需要和场景中的物体进行交互。实时&#xff1a;最慢需要在1/30秒内算完所有的场景渲染和动画数据。&#xff08;可以用动画压缩解决&am…

【IC设计】Verilog线性序列机点灯案例(三)(小梅哥课程)

声明&#xff1a;案例和代码来自小梅哥课程&#xff0c;本人仅对知识点做做笔记&#xff0c;如有学习需要请支持官方正版。 文章目录 该系列目录设计目标设计思路RTL及Testbench代码RTL代码Testbench代码 仿真结果上板视频 该系列目录 Verilog线性序列机点灯案例(一)&#xff…

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

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

【Java】容器|Set、List、Map及常用API

目录 一、概述 二、List 1、List的常用API 2、ArrayList 3、List遍历 三、Set 1、Set的常用方法: 2、HashSet 3、遍历集合&#xff1a; 四、Map 1、Map常用API 2、HashMap 3、遍历Map 五、迭代器 一、概述 在Java中所有的容器都属于Collection接口下的内容 1…

【视频异常检测】Diversity-Measurable Anomaly Detection 论文阅读

Diversity-Measurable Anomaly Detection 论文阅读 Abstract1. Introduction2. Related Work3. Diversity-Measurable Anomaly Detection3.1. The framework3.2. Information compression module3.3. Pyramid deformation module3.4. Foreground-background selection3.5. Trai…

宜搭faas服务器报错Network response was not OK

[error] https://api.dingtalk.com/v1.0/yida/forms/instances? fetch error Error: Network response was not OK 不出意外的话肯定是请求代码的某个部分出了问题&#xff1a;其中formInstanceId和updateFormDataJson是业务的内容 我检查过是没问题的。appType和systemToken…

【二】【单片机】有关独立按键的实验

自定义延时函数Delay 分别用Delay.c文件存储Delay函数。用Delay.h声明Delay函数。每次将这两个文件复制到工程中&#xff0c;直接使用。 //Delay.c void Delay(unsigned int xms) //11.0592MHz {while(xms--){unsigned char i, j;i 2;j 199;do{while (--j);}…

VMware的安装和Ubuntu的配置安装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、linux是什么&#xff1f;二、基础知识虚拟机 三、安装VMware总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; Linux是一个功能…

第18节 动态规划一讲

1假设有排成一行的N个位置记为1~N&#xff0c;N一定大于或等于2 开始时机器人在其中的M位置上(M一定是1~N中的一个) 如果机器人来到1位置&#xff0c;那么下一步只能往右来到2位置&#xff1b; 如果机器人来到N位置&#xff0c;那么下一步只能往左来到N-1位置&#xff1b; 如果…