有时候希望在lua中加入自定义风格的代码,例如将某个经常用的函数简化为一个符号,在开发某个GAL引擎时,因为需要大量的用到回显文字的命令,所以希望将该命令简化,可以极大地提升写脚本的效率.例如:
//原有脚本实现
echo("这真是一个糟糕的事情","人物1");
echo("这真是一个糟糕的事情","人物2");
echo("这真是一个糟糕的事情","人物3");
echo("这真是一个糟糕的事情","人物4");
...
//修改后的实现
@人物1:"这真是一个不错的事情"
@人物2:"这真是一个不错的事情"
@人物3:"这真是一个不错的事情"
@人物4:"这真是一个不错的事情"
...
这看起来是一件不错的事,^_^想象一下一个文字游戏,基本上都是文字回显的命令,简化后的效率提升不言而喻.
当然,这就要拿lua(遵循GPL协议)的源码开刀,lua的脚本解析主要在llex.c文件中,通过分析每个字符,提取出关键字,符号,变量等传递给lparser.c检查语法.
而在llex.c中最主要的函数是static int llex (LexState *ls, SemInfo *seminfo),该函数负责分割并解析每个WORD,然后返回给语法检查器,我们需要在这里动手将lua中没有定义的符号@解析为echo命令并将两个参数返回.
//翻译并传递echo命令
char *str_echo=0,*str_rolename=0;
int len_echo=0,len_rolename=0;
int trans_echo_command_step = -1;
static int llex (LexState *ls, SemInfo *seminfo) {
luaZ_resetbuffer(ls->buff);
if(trans_echo_command_step!=-1)
{
switch(trans_echo_command_step)
{
case 1: //返回左括号
trans_echo_command_step++;
return 40;
case 2: //返回echo字符串
trans_echo_command_step++;
seminfo->ts = luaX_newstring(ls, str