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