让 Lua-5.3.2 支持中文变量名和函数名

让 Lua-5.3.2 支持中文变量名和函数名

今天看了一段 lua 代码, 发现变量名跟函数名都太长了, 看起来很费劲, 就是这段代码:

function Sandbox_HandleEvent(sandbox, event)
...
end

如果写成中文就简短多了, 如下:

function 沙箱_事件处理(沙箱,事件)
...
end

于是打算让 Lua 支持中文变量名和函数名, 上网查了一下, 通过修改 lua 的源代码实现, 记得修改前先做备份, 一般有两种做法:

一种是修改 src/llex.c 文件中的标识符判断条件, 增加一个 ||, 完整代码如下:

  else if (isalpha(ls->current) || ls->current == '_' || ls->current > 0x80) { 
    /* identifier or reserved word */                    
    TString *ts;                                         
    do {                                                 
      save_and_next(ls);                                 
    } while (isalnum(ls->current) || ls->current == '_' || ls->current > 0x80);
    ts = luaX_newstring(ls, luaZ_buffer(ls->buff),       
                            luaZ_bufflen(ls->buff));     
    if (ts->tsv.reserved > 0)  /* reserved word? */      
      return ts->tsv.reserved - 1 + FIRST_RESERVED;      
    else {                                               
      seminfo->ts = ts;                                  
      return TK_NAME;                                    
    }                                                    
  }

原来的代码如下:

else if (isalpha(ls->current) || ls->current == '_') { 
    /* identifier or reserved word */                    
    TString *ts;                                         
    do {                                                 
      save_and_next(ls);                                 
    } while (isalnum(ls->current) || ls->current == '_');
    ts = luaX_newstring(ls, luaZ_buffer(ls->buff),       
                            luaZ_bufflen(ls->buff));     
    if (ts->tsv.reserved > 0)  /* reserved word? */      
      return ts->tsv.reserved - 1 + FIRST_RESERVED;      
    else {                                               
      seminfo->ts = ts;                                  
      return TK_NAME;                                    
    }                                                    
  }

另一种直接修改 lctype.c 文件中对字符编码属性的定义, 把第8行到第b行, 以及e行的全部从 0x00 修改为 0x010x05, 若修改为 0x05 表示可打印, 修改后代码如下:

  LUAI_DDEF const lu_byte luai_ctype_[UCHAR_MAX + 2] = {
    0x00,  /* EOZ */
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    /* 0. */
    0x00,  0x08,  0x08,  0x08,  0x08,  0x08,  0x00,  0x00,
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    /* 1. */
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
    0x0c,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,    /* 2. */
    0x04,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,
    0x16,  0x16,  0x16,  0x16,  0x16,  0x16,  0x16,  0x16,    /* 3. */
    0x16,  0x16,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,
    0x04,  0x15,  0x15,  0x15,  0x15,  0x15,  0x15,  0x05,    /* 4. */
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,    /* 5. */
    0x05,  0x05,  0x05,  0x04,  0x04,  0x04,  0x04,  0x05,
    0x04,  0x15,  0x15,  0x15,  0x15,  0x15,  0x15,  0x05,    /* 6. */
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,    /* 7. */
    0x05,  0x05,  0x05,  0x04,  0x04,  0x04,  0x04,  0x00,
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,    /* 8. */
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,    /* 9. */
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,    /* a. */
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,    /* b. */
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    /* c. */
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    /* d. */
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,    /* e. */
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    /* f. */
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
  };

原来的代码如下:

  LUAI_DDEF const lu_byte luai_ctype_[UCHAR_MAX + 2] = {
    0x00,  /* EOZ */
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    /* 0. */
    0x00,  0x08,  0x08,  0x08,  0x08,  0x08,  0x00,  0x00,
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    /* 1. */
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
    0x0c,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,    /* 2. */
    0x04,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,
    0x16,  0x16,  0x16,  0x16,  0x16,  0x16,  0x16,  0x16,    /* 3. */
    0x16,  0x16,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,
    0x04,  0x15,  0x15,  0x15,  0x15,  0x15,  0x15,  0x05,    /* 4. */
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,    /* 5. */
    0x05,  0x05,  0x05,  0x04,  0x04,  0x04,  0x04,  0x05,
    0x04,  0x15,  0x15,  0x15,  0x15,  0x15,  0x15,  0x05,    /* 6. */
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,
    0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,    /* 7. */
    0x05,  0x05,  0x05,  0x04,  0x04,  0x04,  0x04,  0x00,
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    /* 8. */
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    /* 9. */
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    /* a. */
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    /* b. */
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    /* c. */
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    /* d. */
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    /* e. */
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    /* f. */
    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
  };

修改完之后, 执行 sudo make linux test 重新编译一次, 再执行 sudo make install 安装一次.

然后就可以用中文变量名和函数名了, 如下:

pi@rpi /opt/software/lua-5.3.2 $ lua
Lua 5.3.2  Copyright (C) 1994-2015 Lua.org, PUC-Rio
> 你=1
> 打印=print
> 打印(你)
1
> function 你好() 打印(你) end
> 你好()
1
> 

说明: 这两种方式只适合 lua-5.2 和 lua-5.3.

参考了这两篇文档:

lua支持中文变量名
云风的 BLOG: 让 Lua 支持中文变量名

转载于:https://my.oschina.net/freeblues/blog/683011

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值