lua/lparser.c

Go to the documentation of this file.
00001 /*
00002 ** $Id: lparser.c,v 1.3 2004/03/23 05:09:14 jbj Exp $
00003 ** Lua Parser
00004 ** See Copyright Notice in lua.h
00005 */
00006 
00007 
00008 #include <string.h>
00009 
00010 #define lparser_c
00011 
00012 #include "lua.h"
00013 
00014 #include "lcode.h"
00015 #include "ldebug.h"
00016 #include "lfunc.h"
00017 #include "llex.h"
00018 #include "lmem.h"
00019 #include "lobject.h"
00020 #include "lopcodes.h"
00021 #include "lparser.h"
00022 #include "lstate.h"
00023 #include "lstring.h"
00024 
00025 
00026 
00027 
00028 #define getlocvar(fs, i)        ((fs)->f->locvars[(fs)->actvar[i]])
00029 
00030 
00031 #define enterlevel(ls)  if (++(ls)->nestlevel > LUA_MAXPARSERLEVEL) \
00032                 luaX_syntaxerror(ls, "too many syntax levels");
00033 #define leavelevel(ls)  ((ls)->nestlevel--)
00034 
00035 
00036 /*
00037 ** nodes for block list (list of active blocks)
00038 */
00039 typedef struct BlockCnt {
00040 /*@null@*/
00041   struct BlockCnt *previous;  /* chain */
00042   int breaklist;  /* list of jumps out of this loop */
00043   int nactvar;  /* # active local variables outside the breakable structure */
00044   int upval;  /* true if some variable in the block is an upvalue */
00045   int isbreakable;  /* true if `block' is a loop */
00046 } BlockCnt;
00047 
00048 
00049 
00050 /*
00051 ** prototypes for recursive non-terminal functions
00052 */
00053 static void chunk (LexState *ls)
00054         /*@modifies ls @*/;
00055 static void expr (LexState *ls, expdesc *v)
00056         /*@modifies ls, v @*/;
00057 
00058 
00059 
00060 static void next (LexState *ls)
00061         /*@modifies ls @*/
00062 {
00063   ls->lastline = ls->linenumber;
00064   if (ls->lookahead.token != TK_EOS) {  /* is there a look-ahead token? */
00065     ls->t = ls->lookahead;  /* use this one */
00066     ls->lookahead.token = TK_EOS;  /* and discharge it */
00067   }
00068   else
00069     ls->t.token = luaX_lex(ls, &ls->t.seminfo);  /* read next token */
00070 }
00071 
00072 
00073 static void lookahead (LexState *ls)
00074         /*@modifies ls @*/
00075 {
00076   lua_assert(ls->lookahead.token == TK_EOS);
00077   ls->lookahead.token = luaX_lex(ls, &ls->lookahead.seminfo);
00078 }
00079 
00080 
00081 static void error_expected (LexState *ls, int token)
00082         /*@modifies ls @*/
00083 {
00084   luaX_syntaxerror(ls,
00085          luaO_pushfstring(ls->L, "`%s' expected", luaX_token2str(ls, token)));
00086 }
00087 
00088 
00089 static int testnext (LexState *ls, int c)
00090         /*@modifies ls @*/
00091 {
00092   if (ls->t.token == c) {
00093     next(ls);
00094     return 1;
00095   }
00096   else return 0;
00097 }
00098 
00099 
00100 static void check (LexState *ls, int c)
00101         /*@modifies ls @*/
00102 {
00103   if (!testnext(ls, c))
00104     error_expected(ls, c);
00105 }
00106 
00107 
00108 #define check_condition(ls,c,msg)       { if (!(c)) luaX_syntaxerror(ls, msg); }
00109 
00110 
00111 
00112 static void check_match (LexState *ls, int what, int who, int where)
00113         /*@modifies ls @*/
00114 {
00115   if (!testnext(ls, what)) {
00116     if (where == ls->linenumber)
00117       error_expected(ls, what);
00118     else {
00119       luaX_syntaxerror(ls, luaO_pushfstring(ls->L,
00120              "`%s' expected (to close `%s' at line %d)",
00121               luaX_token2str(ls, what), luaX_token2str(ls, who), where));
00122     }
00123   }
00124 }
00125 
00126 
00127 static TString *str_checkname (LexState *ls)
00128         /*@modifies ls @*/
00129 {
00130   TString *ts;
00131   check_condition(ls, (ls->t.token == TK_NAME), "<name> expected");
00132   ts = ls->t.seminfo.ts;
00133   next(ls);
00134   return ts;
00135 }
00136 
00137 
00138 static void init_exp (expdesc *e, expkind k, int i)
00139         /*@modifies e @*/
00140 {
00141   e->f = e->t = NO_JUMP;
00142   e->k = k;
00143   e->info = i;
00144 }
00145 
00146 
00147 static void codestring (LexState *ls, expdesc *e, TString *s)
00148         /*@modifies ls, e @*/
00149 {
00150   init_exp(e, VK, luaK_stringK(ls->fs, s));
00151 }
00152 
00153 
00154 static void checkname(LexState *ls, expdesc *e)
00155         /*@modifies ls, e @*/
00156 {
00157   codestring(ls, e, str_checkname(ls));
00158 }
00159 
00160 
00161 static int luaI_registerlocalvar (LexState *ls, TString *varname)
00162         /*@modifies ls @*/
00163 {
00164   FuncState *fs = ls->fs;
00165   Proto *f = fs->f;
00166   luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars,
00167                   LocVar, MAX_INT, "");
00168   f->locvars[fs->nlocvars].varname = varname;
00169   return fs->nlocvars++;
00170 }
00171 
00172 
00173 static void new_localvar (LexState *ls, TString *name, int n)
00174         /*@modifies ls @*/
00175 {
00176   FuncState *fs = ls->fs;
00177   luaX_checklimit(ls, fs->nactvar+n+1, MAXVARS, "local variables");
00178   fs->actvar[fs->nactvar+n] = luaI_registerlocalvar(ls, name);
00179 }
00180 
00181 
00182 static void adjustlocalvars (LexState *ls, int nvars)
00183         /*@modifies ls @*/
00184 {
00185   FuncState *fs = ls->fs;
00186   fs->nactvar += nvars;
00187   for (; nvars; nvars--) {
00188     getlocvar(fs, fs->nactvar - nvars).startpc = fs->pc;
00189   }
00190 }
00191 
00192 
00193 static void removevars (LexState *ls, int tolevel)
00194         /*@modifies ls @*/
00195 {
00196   FuncState *fs = ls->fs;
00197   while (fs->nactvar > tolevel)
00198     getlocvar(fs, --fs->nactvar).endpc = fs->pc;
00199 }
00200 
00201 
00202 static void new_localvarstr (LexState *ls, const char *name, int n)
00203         /*@modifies ls @*/
00204 {
00205   new_localvar(ls, luaS_new(ls->L, name), n);
00206 }
00207 
00208 
00209 static void create_local (LexState *ls, const char *name)
00210         /*@modifies ls @*/
00211 {
00212   new_localvarstr(ls, name, 0);
00213   adjustlocalvars(ls, 1);
00214 }
00215 
00216 
00217 static int indexupvalue (FuncState *fs, TString *name, expdesc *v)
00218         /*@modifies fs @*/
00219 {
00220   int i;
00221   Proto *f = fs->f;
00222   for (i=0; i<f->nups; i++) {
00223     if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->info) {
00224       lua_assert(fs->f->upvalues[i] == name);
00225       return i;
00226     }
00227   }
00228   /* new one */
00229   luaX_checklimit(fs->ls, f->nups + 1, MAXUPVALUES, "upvalues");
00230   luaM_growvector(fs->L, fs->f->upvalues, f->nups, fs->f->sizeupvalues,
00231                   TString *, MAX_INT, "");
00232   fs->f->upvalues[f->nups] = name;
00233   fs->upvalues[f->nups] = *v;
00234   return f->nups++;
00235 }
00236 
00237 
00238 static int searchvar (FuncState *fs, TString *n)
00239         /*@*/
00240 {
00241   int i;
00242   for (i=fs->nactvar-1; i >= 0; i--) {
00243     if (n == getlocvar(fs, i).varname)
00244       return i;
00245   }
00246   return -1;  /* not found */
00247 }
00248 
00249 
00250 static void markupval (FuncState *fs, int level)
00251         /*@modifies fs @*/
00252 {
00253   BlockCnt *bl = fs->bl;
00254   while (bl && bl->nactvar > level) bl = bl->previous;
00255   if (bl) bl->upval = 1;
00256 }
00257 
00258 
00259 static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base)
00260         /*@modifies fs, var @*/
00261 {
00262   if (fs == NULL)  /* no more levels? */
00263     init_exp(var, VGLOBAL, NO_REG);  /* default is global variable */
00264   else {
00265     int v = searchvar(fs, n);  /* look up at current level */
00266     if (v >= 0) {
00267       init_exp(var, VLOCAL, v);
00268       if (!base)
00269         markupval(fs, v);  /* local will be used as an upval */
00270     }
00271     else {  /* not found at current level; try upper one */
00272       singlevaraux(fs->prev, n, var, 0);
00273       if (var->k == VGLOBAL) {
00274         if (base)
00275           var->info = luaK_stringK(fs, n);  /* info points to global name */
00276       }
00277       else {  /* LOCAL or UPVAL */
00278         var->info = indexupvalue(fs, n, var);
00279         var->k = VUPVAL;  /* upvalue in this level */
00280       }
00281     }
00282   }
00283 }
00284 
00285 
00286 static TString *singlevar (LexState *ls, expdesc *var, int base)
00287         /*@modifies ls, var @*/
00288 {
00289   TString *varname = str_checkname(ls);
00290   singlevaraux(ls->fs, varname, var, base);
00291   return varname;
00292 }
00293 
00294 
00295 static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e)
00296         /*@modifies ls, e @*/
00297 {
00298   FuncState *fs = ls->fs;
00299   int extra = nvars - nexps;
00300   if (e->k == VCALL) {
00301     extra++;  /* includes call itself */
00302     if (extra <= 0) extra = 0;
00303     else luaK_reserveregs(fs, extra-1);
00304     luaK_setcallreturns(fs, e, extra);  /* call provides the difference */
00305   }
00306   else {
00307     if (e->k != VVOID) luaK_exp2nextreg(fs, e);  /* close last expression */
00308     if (extra > 0) {
00309       int reg = fs->freereg;
00310       luaK_reserveregs(fs, extra);
00311       luaK_nil(fs, reg, extra);
00312     }
00313   }
00314 }
00315 
00316 
00317 static void code_params (LexState *ls, int nparams, int dots)
00318         /*@modifies ls @*/
00319 {
00320   FuncState *fs = ls->fs;
00321   adjustlocalvars(ls, nparams);
00322   luaX_checklimit(ls, fs->nactvar, MAXPARAMS, "parameters");
00323   fs->f->numparams = cast(lu_byte, fs->nactvar);
00324   fs->f->is_vararg = cast(lu_byte, dots);
00325   if (dots)
00326     create_local(ls, "arg");
00327   luaK_reserveregs(fs, fs->nactvar);  /* reserve register for parameters */
00328 }
00329 
00330 
00331 static void enterblock (FuncState *fs, BlockCnt *bl, int isbreakable)
00332         /*@modifies fs, bl @*/
00333 {
00334   bl->breaklist = NO_JUMP;
00335   bl->isbreakable = isbreakable;
00336   bl->nactvar = fs->nactvar;
00337   bl->upval = 0;
00338   bl->previous = fs->bl;
00339   fs->bl = bl;
00340   lua_assert(fs->freereg == fs->nactvar);
00341 }
00342 
00343 
00344 static void leaveblock (FuncState *fs)
00345         /*@modifies fs @*/
00346 {
00347   BlockCnt *bl = fs->bl;
00348   fs->bl = bl->previous;
00349   removevars(fs->ls, bl->nactvar);
00350   if (bl->upval)
00351     luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0);
00352   lua_assert(bl->nactvar == fs->nactvar);
00353   fs->freereg = fs->nactvar;  /* free registers */
00354   luaK_patchtohere(fs, bl->breaklist);
00355 }
00356 
00357 
00358 static void pushclosure (LexState *ls, FuncState *func, expdesc *v)
00359         /*@modifies ls, v @*/
00360 {
00361   FuncState *fs = ls->fs;
00362   Proto *f = fs->f;
00363   int i;
00364   luaM_growvector(ls->L, f->p, fs->np, f->sizep, Proto *,
00365                   MAXARG_Bx, "constant table overflow");
00366 /*@-onlytrans@*/
00367   f->p[fs->np++] = func->f;
00368 /*@=onlytrans@*/
00369   init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1));
00370   for (i=0; i<func->f->nups; i++) {
00371     OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL;
00372     luaK_codeABC(fs, o, 0, func->upvalues[i].info, 0);
00373   }
00374 }
00375 
00376 
00377 static void open_func (LexState *ls, FuncState *fs)
00378         /*@modifies ls, fs @*/
00379 {
00380   Proto *f = luaF_newproto(ls->L);
00381   fs->f = f;
00382   fs->prev = ls->fs;  /* linked list of funcstates */
00383   fs->ls = ls;
00384   fs->L = ls->L;
00385   ls->fs = fs;
00386   fs->pc = 0;
00387   fs->lasttarget = 0;
00388   fs->jpc = NO_JUMP;
00389   fs->freereg = 0;
00390   fs->nk = 0;
00391   fs->h = luaH_new(ls->L, 0, 0);
00392   fs->np = 0;
00393   fs->nlocvars = 0;
00394   fs->nactvar = 0;
00395   fs->bl = NULL;
00396   f->source = ls->source;
00397   f->maxstacksize = 2;  /* registers 0/1 are always valid */
00398 }
00399 
00400 
00401 static void close_func (LexState *ls)
00402         /*@modifies ls @*/
00403 {
00404   lua_State *L = ls->L;
00405   FuncState *fs = ls->fs;
00406   Proto *f = fs->f;
00407   removevars(ls, 0);
00408   luaK_codeABC(fs, OP_RETURN, 0, 1, 0);  /* final return */
00409   luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction);
00410   f->sizecode = fs->pc;
00411   luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int);
00412   f->sizelineinfo = fs->pc;
00413   luaM_reallocvector(L, f->k, f->sizek, fs->nk, TObject);
00414   f->sizek = fs->nk;
00415   luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *);
00416   f->sizep = fs->np;
00417   luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar);
00418   f->sizelocvars = fs->nlocvars;
00419   luaM_reallocvector(L, f->upvalues, f->sizeupvalues, f->nups, TString *);
00420   f->sizeupvalues = f->nups;
00421   lua_assert(luaG_checkcode(f));
00422   lua_assert(fs->bl == NULL);
00423   ls->fs = fs->prev;
00424 }
00425 
00426 
00427 Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff) {
00428   struct LexState lexstate;
00429   struct FuncState funcstate;
00430   lexstate.buff = buff;
00431   lexstate.nestlevel = 0;
00432   luaX_setinput(L, &lexstate, z, luaS_new(L, zname(z)));
00433   open_func(&lexstate, &funcstate);
00434   next(&lexstate);  /* read first token */
00435   chunk(&lexstate);
00436   check_condition(&lexstate, (lexstate.t.token == TK_EOS), "<eof> expected");
00437   close_func(&lexstate);
00438   lua_assert(funcstate.prev == NULL);
00439   lua_assert(funcstate.f->nups == 0);
00440   lua_assert(lexstate.nestlevel == 0);
00441   return funcstate.f;
00442 }
00443 
00444 
00445 
00446 /*============================================================*/
00447 /* GRAMMAR RULES */
00448 /*============================================================*/
00449 
00450 
00451 static void luaY_field (LexState *ls, expdesc *v)
00452         /*@modifies ls, v @*/
00453 {
00454   /* field -> ['.' | ':'] NAME */
00455   FuncState *fs = ls->fs;
00456   expdesc key;
00457   luaK_exp2anyreg(fs, v);
00458   next(ls);  /* skip the dot or colon */
00459   checkname(ls, &key);
00460   luaK_indexed(fs, v, &key);
00461 }
00462 
00463 
00464 static void luaY_index (LexState *ls, expdesc *v)
00465         /*@modifies ls, v @*/
00466 {
00467   /* index -> '[' expr ']' */
00468   next(ls);  /* skip the '[' */
00469   expr(ls, v);
00470   luaK_exp2val(ls->fs, v);
00471   check(ls, ']');
00472 }
00473 
00474 
00475 /*
00476 ** {======================================================================
00477 ** Rules for Constructors
00478 ** =======================================================================
00479 */
00480 
00481 
00482 struct ConsControl {
00483   expdesc v;  /* last list item read */
00484   expdesc *t;  /* table descriptor */
00485   int nh;  /* total number of `record' elements */
00486   int na;  /* total number of array elements */
00487   int tostore;  /* number of array elements pending to be stored */
00488 };
00489 
00490 
00491 static void recfield (LexState *ls, struct ConsControl *cc)
00492         /*@modifies ls, cc @*/
00493 {
00494   /* recfield -> (NAME | `['exp1`]') = exp1 */
00495   FuncState *fs = ls->fs;
00496   int reg = ls->fs->freereg;
00497   expdesc key, val;
00498   if (ls->t.token == TK_NAME) {
00499     luaX_checklimit(ls, cc->nh, MAX_INT, "items in a constructor");
00500     cc->nh++;
00501     checkname(ls, &key);
00502   }
00503   else  /* ls->t.token == '[' */
00504     luaY_index(ls, &key);
00505   check(ls, '=');
00506   luaK_exp2RK(fs, &key);
00507   expr(ls, &val);
00508   luaK_codeABC(fs, OP_SETTABLE, cc->t->info, luaK_exp2RK(fs, &key),
00509                                              luaK_exp2RK(fs, &val));
00510   fs->freereg = reg;  /* free registers */
00511 }
00512 
00513 
00514 static void closelistfield (FuncState *fs, struct ConsControl *cc)
00515         /*@modifies fs, cc @*/
00516 {
00517   if (cc->v.k == VVOID) return;  /* there is no list item */
00518   luaK_exp2nextreg(fs, &cc->v);
00519   cc->v.k = VVOID;
00520   if (cc->tostore == LFIELDS_PER_FLUSH) {
00521     luaK_codeABx(fs, OP_SETLIST, cc->t->info, cc->na-1);  /* flush */
00522     cc->tostore = 0;  /* no more items pending */
00523     fs->freereg = cc->t->info + 1;  /* free registers */
00524   }
00525 }
00526 
00527 
00528 static void lastlistfield (FuncState *fs, struct ConsControl *cc)
00529         /*@modifies fs, cc @*/
00530 {
00531   if (cc->tostore == 0) return;
00532   if (cc->v.k == VCALL) {
00533     luaK_setcallreturns(fs, &cc->v, LUA_MULTRET);
00534     luaK_codeABx(fs, OP_SETLISTO, cc->t->info, cc->na-1);
00535   }
00536   else {
00537     if (cc->v.k != VVOID)
00538       luaK_exp2nextreg(fs, &cc->v);
00539     luaK_codeABx(fs, OP_SETLIST, cc->t->info, cc->na-1);
00540   }
00541   fs->freereg = cc->t->info + 1;  /* free registers */
00542 }
00543 
00544 
00545 static void listfield (LexState *ls, struct ConsControl *cc)
00546         /*@modifies ls, cc @*/
00547 {
00548   expr(ls, &cc->v);
00549   luaX_checklimit(ls, cc->na, MAXARG_Bx, "items in a constructor");
00550   cc->na++;
00551   cc->tostore++;
00552 }
00553 
00554 
00555 static void constructor (LexState *ls, expdesc *t)
00556         /*@modifies ls, t @*/
00557 {
00558   /* constructor -> ?? */
00559   FuncState *fs = ls->fs;
00560   int line = ls->linenumber;
00561   int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0);
00562   struct ConsControl cc;
00563   cc.na = cc.nh = cc.tostore = 0;
00564   cc.t = t;
00565   init_exp(t, VRELOCABLE, pc);
00566   init_exp(&cc.v, VVOID, 0);  /* no value (yet) */
00567   luaK_exp2nextreg(ls->fs, t);  /* fix it at stack top (for gc) */
00568   check(ls, '{');
00569   do {
00570     lua_assert(cc.v.k == VVOID || cc.tostore > 0);
00571     testnext(ls, ';');  /* compatibility only */
00572     if (ls->t.token == '}') break;
00573     closelistfield(fs, &cc);
00574     switch(ls->t.token) {
00575       case TK_NAME: {  /* may be listfields or recfields */
00576         lookahead(ls);
00577         if (ls->lookahead.token != '=')  /* expression? */
00578           listfield(ls, &cc);
00579         else
00580           recfield(ls, &cc);
00581         break;
00582       }
00583       case '[': {  /* constructor_item -> recfield */
00584         recfield(ls, &cc);
00585         break;
00586       }
00587       default: {  /* constructor_part -> listfield */
00588         listfield(ls, &cc);
00589         break;
00590       }
00591     }
00592   } while (testnext(ls, ',') || testnext(ls, ';'));
00593   check_match(ls, '}', '{', line);
00594   lastlistfield(fs, &cc);
00595   SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */
00596   SETARG_C(fs->f->code[pc], luaO_log2(cc.nh)+1);  /* set initial table size */
00597 }
00598 
00599 /* }====================================================================== */
00600 
00601 
00602 
00603 static void parlist (LexState *ls)
00604         /*@modifies ls @*/
00605 {
00606   /* parlist -> [ param { `,' param } ] */
00607   int nparams = 0;
00608   int dots = 0;
00609   if (ls->t.token != ')') {  /* is `parlist' not empty? */
00610     do {
00611       switch (ls->t.token) {
00612         case TK_DOTS: dots = 1; next(ls); break;
00613         case TK_NAME: new_localvar(ls, str_checkname(ls), nparams++); break;
00614         default: luaX_syntaxerror(ls, "<name> or `...' expected");
00615       }
00616     } while (!dots && testnext(ls, ','));
00617   }
00618   code_params(ls, nparams, dots);
00619 }
00620 
00621 
00622 static void body (LexState *ls, expdesc *e, int needself, int line)
00623         /*@modifies ls, e @*/
00624 {
00625   /* body ->  `(' parlist `)' chunk END */
00626   FuncState new_fs;
00627   open_func(ls, &new_fs);
00628   new_fs.f->lineDefined = line;
00629   check(ls, '(');
00630   if (needself)
00631     create_local(ls, "self");
00632   parlist(ls);
00633   check(ls, ')');
00634   chunk(ls);
00635   check_match(ls, TK_END, TK_FUNCTION, line);
00636   close_func(ls);
00637   pushclosure(ls, &new_fs, e);
00638 }
00639 
00640 
00641 static int explist1 (LexState *ls, expdesc *v)
00642         /*@modifies ls, v @*/
00643 {
00644   /* explist1 -> expr { `,' expr } */
00645   int n = 1;  /* at least one expression */
00646   expr(ls, v);
00647   while (testnext(ls, ',')) {
00648     luaK_exp2nextreg(ls->fs, v);
00649     expr(ls, v);
00650     n++;
00651   }
00652   return n;
00653 }
00654 
00655 
00656 static void funcargs (LexState *ls, expdesc *f)
00657         /*@modifies ls, f @*/
00658 {
00659   FuncState *fs = ls->fs;
00660   expdesc args;
00661   int base, nparams;
00662   int line = ls->linenumber;
00663   switch (ls->t.token) {
00664     case '(': {  /* funcargs -> `(' [ explist1 ] `)' */
00665       if (line != ls->lastline)
00666         luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)");
00667       next(ls);
00668       if (ls->t.token == ')')  /* arg list is empty? */
00669         args.k = VVOID;
00670       else {
00671         explist1(ls, &args);
00672         luaK_setcallreturns(fs, &args, LUA_MULTRET);
00673       }
00674       check_match(ls, ')', '(', line);
00675       break;
00676     }
00677     case '{': {  /* funcargs -> constructor */
00678       constructor(ls, &args);
00679       break;
00680     }
00681     case TK_STRING: {  /* funcargs -> STRING */
00682       codestring(ls, &args, ls->t.seminfo.ts);
00683       next(ls);  /* must use `seminfo' before `next' */
00684       break;
00685     }
00686     default: {
00687       luaX_syntaxerror(ls, "function arguments expected");
00688       return;
00689     }
00690   }
00691   lua_assert(f->k == VNONRELOC);
00692   base = f->info;  /* base register for call */
00693   if (args.k == VCALL)
00694     nparams = LUA_MULTRET;  /* open call */
00695   else {
00696     if (args.k != VVOID)
00697       luaK_exp2nextreg(fs, &args);  /* close last argument */
00698     nparams = fs->freereg - (base+1);
00699   }
00700   init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2));
00701   luaK_fixline(fs, line);
00702   fs->freereg = base+1;  /* call remove function and arguments and leaves
00703                             (unless changed) one result */
00704 }
00705 
00706 
00707 
00708 
00709 /*
00710 ** {======================================================================
00711 ** Expression parsing
00712 ** =======================================================================
00713 */
00714 
00715 
00716 static void prefixexp (LexState *ls, expdesc *v)
00717         /*@modifies ls, v @*/
00718 {
00719   /* prefixexp -> NAME | '(' expr ')' */
00720   switch (ls->t.token) {
00721     case '(': {
00722       int line = ls->linenumber;
00723       next(ls);
00724       expr(ls, v);
00725       check_match(ls, ')', '(', line);
00726       luaK_dischargevars(ls->fs, v);
00727       return;
00728     }
00729     case TK_NAME: {
00730       singlevar(ls, v, 1);
00731       return;
00732     }
00733 #ifdef LUA_COMPATUPSYNTAX
00734     case '%': {  /* for compatibility only */
00735       TString *varname;
00736       int line = ls->linenumber;
00737       next(ls);  /* skip `%' */
00738       varname = singlevar(ls, v, 1);
00739       if (v->k != VUPVAL)
00740         luaX_errorline(ls, "global upvalues are obsolete",
00741                            getstr(varname), line);
00742       return;
00743     }
00744 #endif
00745     default: {
00746       luaX_syntaxerror(ls, "unexpected symbol");
00747       return;
00748     }
00749   }
00750 }
00751 
00752 
00753 static void primaryexp (LexState *ls, expdesc *v)
00754         /*@modifies ls, v @*/
00755 {
00756   /* primaryexp ->
00757         prefixexp { `.' NAME | `[' exp `]' | `:' NAME funcargs | funcargs } */
00758   FuncState *fs = ls->fs;
00759   prefixexp(ls, v);
00760   for (;;) {
00761     switch (ls->t.token) {
00762       case '.': {  /* field */
00763         luaY_field(ls, v);
00764         break;
00765       }
00766       case '[': {  /* `[' exp1 `]' */
00767         expdesc key;
00768         luaK_exp2anyreg(fs, v);
00769         luaY_index(ls, &key);
00770         luaK_indexed(fs, v, &key);
00771         break;
00772       }
00773       case ':': {  /* `:' NAME funcargs */
00774         expdesc key;
00775         next(ls);
00776         checkname(ls, &key);
00777         luaK_self(fs, v, &key);
00778         funcargs(ls, v);
00779         break;
00780       }
00781       case '(': case TK_STRING: case '{': {  /* funcargs */
00782         luaK_exp2nextreg(fs, v);
00783         funcargs(ls, v);
00784         break;
00785       }
00786       default: return;
00787     }
00788   }
00789 }
00790 
00791 
00792 static void simpleexp (LexState *ls, expdesc *v)
00793         /*@modifies ls, v @*/
00794 {
00795   /* simpleexp -> NUMBER | STRING | NIL | constructor | FUNCTION body
00796                | primaryexp */
00797   switch (ls->t.token) {
00798     case TK_NUMBER: {
00799       init_exp(v, VK, luaK_numberK(ls->fs, ls->t.seminfo.r));
00800       next(ls);  /* must use `seminfo' before `next' */
00801       break;
00802     }
00803     case TK_STRING: {
00804       codestring(ls, v, ls->t.seminfo.ts);
00805       next(ls);  /* must use `seminfo' before `next' */
00806       break;
00807     }
00808     case TK_NIL: {
00809       init_exp(v, VNIL, 0);
00810       next(ls);
00811       break;
00812     }
00813     case TK_TRUE: {
00814       init_exp(v, VTRUE, 0);
00815       next(ls);
00816       break;
00817     }
00818     case TK_FALSE: {
00819       init_exp(v, VFALSE, 0);
00820       next(ls);
00821       break;
00822     }
00823     case '{': {  /* constructor */
00824       constructor(ls, v);
00825       break;
00826     }
00827     case TK_FUNCTION: {
00828       next(ls);
00829       body(ls, v, 0, ls->linenumber);
00830       break;
00831     }
00832     default: {
00833       primaryexp(ls, v);
00834       break;
00835     }
00836   }
00837 }
00838 
00839 
00840 static UnOpr getunopr (int op)
00841         /*@*/
00842 {
00843   switch (op) {
00844     case TK_NOT: return OPR_NOT;
00845     case '-': return OPR_MINUS;
00846     default: return OPR_NOUNOPR;
00847   }
00848 }
00849 
00850 
00851 static BinOpr getbinopr (int op)
00852         /*@*/
00853 {
00854   switch (op) {
00855     case '+': return OPR_ADD;
00856     case '-': return OPR_SUB;
00857     case '*': return OPR_MULT;
00858     case '/': return OPR_DIV;
00859     case '^': return OPR_POW;
00860     case TK_CONCAT: return OPR_CONCAT;
00861     case