lua-users home
lua-l archive

Re: Why not allow local s = "abc":reverse()

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


modify 3 functions of lparser, is it right?
/*
** {======================================================================
** Expression parsing
** =======================================================================
*/
static void prefixexp (LexState *ls, expdesc *v) {
 /* prefixexp -> NAME | '(' expr ')' */
 switch (ls->t.token) {
 case '(': {
 int line = ls->linenumber;
 luaX_next(ls);
 expr(ls, v);
 check_match(ls, ')', '(', line);
 luaK_dischargevars(ls->fs, v);
 return;
 }
 case TK_NAME: {
 singlevar(ls, v);
 return;
 }
 case TK_NUMBER: {
 init_exp(v, VKNUM, 0);
 v->u.nval = ls->t.seminfo.r;
 break;
 }
 case TK_STRING: {
 codestring(ls, v, ls->t.seminfo.ts);
 break;
 }
 case TK_NIL: {
 init_exp(v, VNIL, 0);
 break;
 }
 case TK_TRUE: {
 init_exp(v, VTRUE, 0);
 break;
 }
 case TK_FALSE: {
 init_exp(v, VFALSE, 0);
 break;
 }
 case '[': {
 listconstructor(ls, v);
 return;
 }
 case '{': { /* constructor */
 constructor(ls, v);
 return;
 }
 case TK_FUNCTION: {
 luaX_next(ls);
 body(ls, v, 0, ls->linenumber);
 return;
 }
 default: {
 luaX_syntaxerror(ls, "unexpected symbol");
 return;
 }
 }
 luaX_next(ls);
}
static void primaryexp (LexState *ls, expdesc *v) {
 /* primaryexp ->
 prefixexp { `.' NAME | `[' exp `]' | `:' NAME funcargs | funcargs } */
 FuncState *fs = ls->fs;
 prefixexp(ls, v);
 for (;;) {
 switch (ls->t.token) {
 case '.': { /* field */
 field(ls, v);
 break;
 }
 case '[': { /* `[' exp1 `]' */
 expdesc key;
 luaK_exp2anyreg(fs, v);
 yindex(ls, &key);
 luaK_indexed(fs, v, &key);
 break;
 }
 case ':': { /* `:' NAME funcargs */
 expdesc key;
 luaX_next(ls);
 checkname(ls, &key);
 luaK_self(fs, v, &key);
 funcargs(ls, v);
 break;
 }
 case '(': case TK_STRING: case '{': { /* funcargs */
 luaK_exp2nextreg(fs, v);
 funcargs(ls, v);
 break;
 }
 default: return;
 }
 }
}
static void simpleexp (LexState *ls, expdesc *v) {
 /* simpleexp -> NUMBER | STRING | NIL | true | false | ... |
 constructor | FUNCTION body | primaryexp */
 switch (ls->t.token) {
 case TK_DOTS: { /* vararg */
 FuncState *fs = ls->fs;
 check_condition(ls, fs->f->is_vararg,
 "cannot use " LUA_QL("...") " outside a vararg function");
 fs->f->is_vararg &= ~VARARG_NEEDSARG; /* don't need 'arg' */
 init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0));
 break;
 }
 default: {
 primaryexp(ls, v);
 return;
 }
 }
 luaX_next(ls);
}

AltStyle によって変換されたページ (->オリジナル) /