aboutsummaryrefslogtreecommitdiff
path: root/lparser.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-02-05 15:48:52 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-02-05 15:48:52 -0200
commitd1fc6244f0bb4d042bb48a4121255f87692afd15 (patch)
tree31f31b96ce5ff1c07b8990e92bfaee49887def23 /lparser.c
parent7e3d3e1f70b75f0d5d8b5e3b240404a9f9adbcf1 (diff)
downloadlua-d1fc6244f0bb4d042bb48a4121255f87692afd15.tar.gz
lua-d1fc6244f0bb4d042bb48a4121255f87692afd15.tar.bz2
lua-d1fc6244f0bb4d042bb48a4121255f87692afd15.zip
extended syntax to allow function a.b.c (x)
Diffstat (limited to 'lparser.c')
-rw-r--r--lparser.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/lparser.c b/lparser.c
index e1b9b3a1..b5d0c76d 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 1.127 2001/01/29 15:26:40 roberto Exp roberto $ 2** $Id: lparser.c,v 1.128 2001/01/31 13:13:17 roberto Exp roberto $
3** LL(1) Parser and code generator for Lua 3** LL(1) Parser and code generator for Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -383,8 +383,8 @@ static int explist1 (LexState *ls) {
383 expdesc v; 383 expdesc v;
384 expr(ls, &v); 384 expr(ls, &v);
385 while (ls->t.token == ',') { 385 while (ls->t.token == ',') {
386 luaK_tostack(ls, &v, 1); /* gets only 1 value from previous expression */
387 next(ls); /* skip comma */ 386 next(ls); /* skip comma */
387 luaK_tostack(ls, &v, 1); /* gets only 1 value from previous expression */
388 expr(ls, &v); 388 expr(ls, &v);
389 n++; 389 n++;
390 } 390 }
@@ -450,11 +450,9 @@ static void var_or_func_tail (LexState *ls, expdesc *v) {
450 break; 450 break;
451 } 451 }
452 case ':': { /* var_or_func_tail -> ':' NAME funcargs */ 452 case ':': { /* var_or_func_tail -> ':' NAME funcargs */
453 int name;
454 next(ls); 453 next(ls);
455 name = checkname(ls);
456 luaK_tostack(ls, v, 1); /* `v' must be on stack */ 454 luaK_tostack(ls, v, 1); /* `v' must be on stack */
457 luaK_code1(ls->fs, OP_PUSHSELF, name); 455 luaK_code1(ls->fs, OP_PUSHSELF, checkname(ls));
458 funcargs(ls, 1); 456 funcargs(ls, 1);
459 v->k = VEXP; 457 v->k = VEXP;
460 v->u.l.t = v->u.l.f = NO_JUMP; 458 v->u.l.t = v->u.l.f = NO_JUMP;
@@ -966,11 +964,17 @@ static void localstat (LexState *ls) {
966 964
967 965
968static int funcname (LexState *ls, expdesc *v) { 966static int funcname (LexState *ls, expdesc *v) {
969 /* funcname -> NAME [':' NAME | '.' NAME] */ 967 /* funcname -> NAME {'.' NAME} [':' NAME] */
970 int needself = 0; 968 int needself = 0;
971 singlevar(ls, str_checkname(ls), v); 969 singlevar(ls, str_checkname(ls), v);
972 if (ls->t.token == ':' || ls->t.token == '.') { 970 while (ls->t.token == '.') {
973 needself = (ls->t.token == ':'); 971 next(ls);
972 luaK_tostack(ls, v, 1);
973 luaK_kstr(ls, checkname(ls));
974 v->k = VINDEXED;
975 }
976 if (ls->t.token == ':') {
977 needself = 1;
974 next(ls); 978 next(ls);
975 luaK_tostack(ls, v, 1); 979 luaK_tostack(ls, v, 1);
976 luaK_kstr(ls, checkname(ls)); 980 luaK_kstr(ls, checkname(ls));