cgoxpx's blog

SingingRivuletProject
Powered by TanTa

在源码中找到llex.c文件,在其中添加函数

static int getUTF8Len(unsigned char pre){
  if((pre>>3)==0x1e){
    return 4;
  }else
  if((pre>>4)==0x0e){
    return 3;
  }else
  if((pre>>5)==0x06){
    return 2;
  }else
    return 1;
}

然后找到

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;
      }
    }

将其改为

else if (isalpha(ls->current) || ls->current == '_' || ls->current > 0x80) {
      /* identifier or reserved word */
      TString *ts;
      do {
        if(ls->current > 0x80){
          int l = getUTF8Len(ls->current);
          for(int il = 0;il<l;++il){
            save_and_next(ls);
          }
        }else{
          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;
      }
    }

然后编译即可

cgoxopx
lua