源码已经更新在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 和 通义灵码的帮助下,还是更方便了。