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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值