Skip to content
Permalink
Browse files
lua: Optional commas.
From: http://lua-users.org/lists/lua-l/2012-03/msg00175.html
Allows optional commas for consecutive "key" = value fields. This is common in Configi promise bodies.
file.touch {
  path = "/tmp/test"
  comment = "touching file"
}
  • Loading branch information
tongson committed Apr 7, 2015
1 parent 1436f4a commit c5f7354
Showing 1 changed file with 39 additions and 10 deletions.
@@ -637,18 +637,30 @@ struct ConsControl {
};


static void recfield (LexState *ls, struct ConsControl *cc) {
/* recfield -> (NAME | '['exp1']') = exp1 */
static void namedfield (LexState *ls, struct ConsControl *cc) {
/* namedfield -> (NAME '=' exp) */
FuncState *fs = ls->fs;
int reg = ls->fs->freereg;
expdesc key, val;
int rkkey;
if (ls->t.token == TK_NAME) {
checklimit(fs, cc->nh, MAX_INT, "items in a constructor");
checkname(ls, &key);
}
else /* ls->t.token == '[' */
yindex(ls, &key);
checklimit(fs, cc->nh, MAX_INT, "items in a constructor");
checkname(ls, &key);
cc->nh++;
checknext(ls, '=');
rkkey = luaK_exp2RK(fs, &key);
expr(ls, &val);
luaK_codeABC(fs, OP_SETTABLE, cc->t->u.info, rkkey, luaK_exp2RK(fs, &val));
fs->freereg = reg; /* free registers */
}


static void kfield (LexState *ls, struct ConsControl *cc) {
/* kfield -> ('[' exp ']' '=' exp) */
FuncState *fs = ls->fs;
int reg = ls->fs->freereg;
expdesc key, val;
int rkkey;
yindex(ls, &key);
cc->nh++;
checknext(ls, '=');
rkkey = luaK_exp2RK(fs, &key);
@@ -658,6 +670,23 @@ static void recfield (LexState *ls, struct ConsControl *cc) {
}


static void recfields (LexState *ls, struct ConsControl *cc) {
/* recfields -> (`['exp`] = exp' | NAME = exp {NAME = exp})*/
if(ls->t.token == '[')
kfield(ls, cc);
else if(ls->t.token == TK_NAME) {
do {
namedfield(ls, cc);
} while(ls->t.token == TK_NAME);
} else {
lua_assert(0); /* not entirely sure this can be reached */
}
check_condition(ls,
ls->t.token == '}' | ls->t.token == ',' | ls->t.token == ';',
"expected separator (',' | ';') or '}'");
}


static void closelistfield (FuncState *fs, struct ConsControl *cc) {
if (cc->v.k == VVOID) return; /* there is no list item */
luaK_exp2nextreg(fs, &cc->v);
@@ -700,11 +729,11 @@ static void field (LexState *ls, struct ConsControl *cc) {
if (luaX_lookahead(ls) != '=') /* expression? */
listfield(ls, cc);
else
recfield(ls, cc);
recfields(ls, cc);
break;
}
case '[': {
recfield(ls, cc);
kfield(ls, cc);
break;
}
default: {

0 comments on commit c5f7354

Please sign in to comment.