lparser.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218
  1. /*
  2. ** $Id: lparser.c,v 1.83 2000/04/27 17:39:56 roberto Exp roberto $
  3. ** LL(1) Parser and code generator for Lua
  4. ** See Copyright Notice in lua.h
  5. */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #define LUA_REENTRANT
  9. #include "lcode.h"
  10. #include "ldo.h"
  11. #include "lfunc.h"
  12. #include "llex.h"
  13. #include "lmem.h"
  14. #include "lobject.h"
  15. #include "lopcodes.h"
  16. #include "lparser.h"
  17. #include "lstate.h"
  18. #include "lstring.h"
  19. /*
  20. ** Constructors descriptor:
  21. ** `n' indicates number of elements, and `k' signals whether
  22. ** it is a list constructor (k = 0) or a record constructor (k = 1)
  23. ** or empty (k = ';' or '}')
  24. */
  25. typedef struct Constdesc {
  26. int n;
  27. int k;
  28. } Constdesc;
  29. typedef struct Breaklabel {
  30. struct Breaklabel *previous; /* chain */
  31. TString *label;
  32. int breaklist;
  33. int stacklevel;
  34. } Breaklabel;
  35. /*
  36. ** prototypes for recursive non-terminal functions
  37. */
  38. static void body (LexState *ls, int needself, int line);
  39. static void chunk (LexState *ls);
  40. static void constructor (LexState *ls);
  41. static void expr (LexState *ls, expdesc *v);
  42. static void exp1 (LexState *ls);
  43. static void next (LexState *ls) {
  44. ls->token = luaX_lex(ls);
  45. }
  46. static void error_expected (LexState *ls, int token) {
  47. char buff[100], t[TOKEN_LEN];
  48. luaX_token2str(token, t);
  49. sprintf(buff, "`%.20s' expected", t);
  50. luaK_error(ls, buff);
  51. }
  52. static void error_unexpected (LexState *ls) {
  53. luaK_error(ls, "unexpected token");
  54. }
  55. static void check (LexState *ls, int c) {
  56. if (ls->token != c)
  57. error_expected(ls, c);
  58. next(ls);
  59. }
  60. static void checklimit (LexState *ls, int val, int limit, const char *msg) {
  61. if (val > limit) {
  62. char buff[100];
  63. sprintf(buff, "too many %.50s (limit=%d)", msg, limit);
  64. luaK_error(ls, buff);
  65. }
  66. }
  67. static void setline (LexState *ls) {
  68. FuncState *fs = ls->fs;
  69. if (ls->L->debug && ls->linenumber != fs->lastsetline) {
  70. checklimit(ls, ls->linenumber, MAXARG_U, "lines in a chunk");
  71. luaK_code1(fs, OP_SETLINE, ls->linenumber);
  72. fs->lastsetline = ls->linenumber;
  73. }
  74. }
  75. static int optional (LexState *ls, int c) {
  76. if (ls->token == c) {
  77. next(ls);
  78. return 1;
  79. }
  80. else return 0;
  81. }
  82. static void check_match (LexState *ls, int what, int who, int where) {
  83. if (ls->token != what) {
  84. if (where == ls->linenumber)
  85. error_expected(ls, what);
  86. else {
  87. char buff[100];
  88. char t_what[TOKEN_LEN], t_who[TOKEN_LEN];
  89. luaX_token2str(what, t_what);
  90. luaX_token2str(who, t_who);
  91. sprintf(buff, "`%.20s' expected (to close `%.20s' at line %d)",
  92. t_what, t_who, where);
  93. luaK_error(ls, buff);
  94. }
  95. }
  96. next(ls);
  97. }
  98. static void setline_and_next (LexState *ls) {
  99. setline(ls);
  100. next(ls);
  101. }
  102. static void check_END (LexState *ls, int who, int where) {
  103. setline(ls); /* setline for END */
  104. check_match(ls, TK_END, who, where);
  105. }
  106. static int string_constant (FuncState *fs, TString *s) {
  107. Proto *f = fs->f;
  108. int c = s->constindex;
  109. if (c >= f->nkstr || f->kstr[c] != s) {
  110. luaM_growvector(fs->L, f->kstr, f->nkstr, 1, TString *,
  111. constantEM, MAXARG_U);
  112. c = f->nkstr++;
  113. f->kstr[c] = s;
  114. s->constindex = c; /* hint for next time */
  115. }
  116. return c;
  117. }
  118. static void code_string (LexState *ls, TString *s) {
  119. luaK_kstr(ls, string_constant(ls->fs, s));
  120. }
  121. static int checkname (LexState *ls) {
  122. int sc;
  123. if (ls->token != TK_NAME)
  124. luaK_error(ls, "<name> expected");
  125. sc = string_constant(ls->fs, ls->seminfo.ts);
  126. next(ls);
  127. return sc;
  128. }
  129. static TString *str_checkname (LexState *ls) {
  130. int i = checkname(ls); /* this call may realloc `f->consts' */
  131. return ls->fs->f->kstr[i];
  132. }
  133. static TString *optionalname (LexState *ls) {
  134. if (ls->token == TK_NAME)
  135. return str_checkname(ls);
  136. else
  137. return NULL;
  138. }
  139. static void luaI_registerlocalvar (LexState *ls, TString *varname,
  140. int line) {
  141. FuncState *fs = ls->fs;
  142. if (fs->nvars != -1) { /* debug information? */
  143. Proto *f = fs->f;
  144. luaM_growvector(ls->L, f->locvars, fs->nvars, 1, LocVar, "", MAX_INT);
  145. f->locvars[fs->nvars].varname = varname;
  146. f->locvars[fs->nvars].line = line;
  147. fs->nvars++;
  148. }
  149. }
  150. static void luaI_unregisterlocalvar (LexState *ls, int line) {
  151. luaI_registerlocalvar(ls, NULL, line);
  152. }
  153. static void store_localvar (LexState *ls, TString *name, int n) {
  154. FuncState *fs = ls->fs;
  155. checklimit(ls, fs->nlocalvar+n+1, MAXLOCALS, "local variables");
  156. fs->localvar[fs->nlocalvar+n] = name;
  157. }
  158. static void adjustlocalvars (LexState *ls, int nvars, int line) {
  159. FuncState *fs = ls->fs;
  160. int i;
  161. fs->nlocalvar += nvars;
  162. for (i=fs->nlocalvar-nvars; i<fs->nlocalvar; i++)
  163. luaI_registerlocalvar(ls, fs->localvar[i], line);
  164. }
  165. static void removelocalvars (LexState *ls, int nvars, int line) {
  166. ls->fs->nlocalvar -= nvars;
  167. while (nvars--)
  168. luaI_unregisterlocalvar(ls, line);
  169. }
  170. static void add_localvar (LexState *ls, const char *name) {
  171. store_localvar(ls, luaS_newfixed(ls->L, name), 0);
  172. adjustlocalvars(ls, 1, 0);
  173. }
  174. static int aux_localname (FuncState *fs, TString *n) {
  175. int i;
  176. for (i=fs->nlocalvar-1; i >= 0; i--)
  177. if (n == fs->localvar[i]) return i; /* local var index */
  178. return -1; /* not found */
  179. }
  180. static void singlevar (LexState *ls, TString *n, expdesc *var, int prev) {
  181. FuncState *fs = prev ? ls->fs->prev : ls->fs;
  182. int i = aux_localname(fs, n);
  183. if (i >= 0) { /* local value? */
  184. var->k = VLOCAL;
  185. var->u.index = i;
  186. }
  187. else {
  188. FuncState *level = fs;
  189. while ((level = level->prev) != NULL) /* check shadowing */
  190. if (aux_localname(level, n) >= 0)
  191. luaX_syntaxerror(ls, "cannot access a variable in outer scope", n->str);
  192. var->k = VGLOBAL;
  193. var->u.index = string_constant(fs, n);
  194. }
  195. }
  196. static int indexupvalue (LexState *ls, TString *n) {
  197. FuncState *fs = ls->fs;
  198. expdesc v;
  199. int i;
  200. singlevar(ls, n, &v, 1);
  201. for (i=0; i<fs->nupvalues; i++) {
  202. if (fs->upvalues[i].k == v.k && fs->upvalues[i].u.index == v.u.index)
  203. return i;
  204. }
  205. /* new one */
  206. ++(fs->nupvalues);
  207. checklimit(ls, fs->nupvalues, MAXUPVALUES, "upvalues");
  208. fs->upvalues[i] = v; /* i = fs->nupvalues - 1 */
  209. return i;
  210. }
  211. static void pushupvalue (LexState *ls, TString *n) {
  212. FuncState *fs = ls->fs;
  213. if (fs->prev == NULL)
  214. luaX_syntaxerror(ls, "cannot access upvalue in main", n->str);
  215. if (aux_localname(ls->fs, n) >= 0)
  216. luaX_syntaxerror(ls, "cannot access an upvalue in current scope", n->str);
  217. luaK_code1(fs, OP_PUSHUPVALUE, indexupvalue(ls, n));
  218. }
  219. static void adjust_mult_assign (LexState *ls, int nvars, int nexps) {
  220. FuncState *fs = ls->fs;
  221. int diff = nexps - nvars;
  222. if (nexps == 0 || !luaK_lastisopen(fs)) { /* list is empty or closed */
  223. /* push or pop eventual difference between list lengths */
  224. luaK_adjuststack(fs, diff);
  225. }
  226. else { /* list ends in a function call; must correct it */
  227. diff--; /* do not count function call itself */
  228. if (diff <= 0) { /* more variables than values? */
  229. /* function call must provide extra values */
  230. luaK_setcallreturns(fs, -diff);
  231. }
  232. else { /* more values than variables */
  233. luaK_setcallreturns(fs, 0); /* call should provide no value */
  234. luaK_adjuststack(fs, diff); /* pop eventual extra values */
  235. }
  236. }
  237. }
  238. static void code_args (LexState *ls, int nparams, int dots) {
  239. FuncState *fs = ls->fs;
  240. adjustlocalvars(ls, nparams, 0);
  241. checklimit(ls, fs->nlocalvar, MAXPARAMS, "parameters");
  242. nparams = fs->nlocalvar; /* `self' could be there already */
  243. fs->f->numparams = nparams;
  244. fs->f->is_vararg = dots;
  245. if (!dots)
  246. luaK_deltastack(fs, nparams);
  247. else {
  248. luaK_deltastack(fs, nparams+1);
  249. add_localvar(ls, "arg");
  250. }
  251. }
  252. static int getvarname (LexState *ls, expdesc *var) {
  253. switch (var->k) {
  254. case VGLOBAL:
  255. return var->u.index;
  256. case VLOCAL:
  257. return string_constant(ls->fs, ls->fs->localvar[var->u.index]);
  258. default:
  259. error_unexpected(ls); /* there is no `var name' */
  260. return 0; /* to avoid warnings */
  261. }
  262. }
  263. static void enterbreak (FuncState *fs, Breaklabel *bl) {
  264. bl->stacklevel = fs->stacklevel;
  265. bl->label = NULL;
  266. bl->breaklist = NO_JUMP;
  267. bl->previous = fs->bl;
  268. fs->bl = bl;
  269. }
  270. static void leavebreak (FuncState *fs, Breaklabel *bl) {
  271. fs->bl = bl->previous;
  272. LUA_ASSERT(fs->L, bl->stacklevel == fs->stacklevel, "wrong levels");
  273. luaK_patchlist(fs, bl->breaklist, luaK_getlabel(fs));
  274. }
  275. static Breaklabel *findlabel (FuncState *fs, TString *name) {
  276. Breaklabel *bl;
  277. for (bl=fs->bl; bl; bl=bl->previous) {
  278. if (bl->label == name)
  279. return bl;
  280. }
  281. if (name) /* label not found: choose appropriate error message */
  282. luaX_syntaxerror(fs->ls, "break not inside given label", name->str);
  283. else
  284. luaK_error(fs->ls, "break not inside while or repeat loop");
  285. return NULL; /* to avoid warnings */
  286. }
  287. static void func_onstack (LexState *ls, FuncState *func) {
  288. FuncState *fs = ls->fs;
  289. Proto *f = fs->f;
  290. int i;
  291. for (i=0; i<func->nupvalues; i++)
  292. luaK_tostack(ls, &func->upvalues[i], 1);
  293. luaM_growvector(ls->L, f->kproto, f->nkproto, 1, Proto *,
  294. constantEM, MAXARG_A);
  295. f->kproto[f->nkproto++] = func->f;
  296. luaK_code2(fs, OP_CLOSURE, f->nkproto-1, func->nupvalues);
  297. }
  298. static void init_state (LexState *ls, FuncState *fs, TString *source) {
  299. lua_State *L = ls->L;
  300. Proto *f = luaF_newproto(ls->L);
  301. fs->prev = ls->fs; /* linked list of funcstates */
  302. fs->ls = ls;
  303. fs->L = ls->L;
  304. ls->fs = fs;
  305. fs->stacklevel = 0;
  306. fs->nlocalvar = 0;
  307. fs->nupvalues = 0;
  308. fs->lastsetline = 0;
  309. fs->bl = NULL;
  310. fs->f = f;
  311. f->source = source;
  312. fs->pc = 0;
  313. fs->lasttarget = 0;
  314. fs->jlt = NO_JUMP;
  315. f->code = NULL;
  316. f->maxstacksize = 0;
  317. f->numparams = 0; /* default for main chunk */
  318. f->is_vararg = 0; /* default for main chunk */
  319. fs->nvars = (L->debug) ? 0 : -1; /* flag no debug information? */
  320. }
  321. static void close_func (LexState *ls) {
  322. lua_State *L = ls->L;
  323. FuncState *fs = ls->fs;
  324. Proto *f = fs->f;
  325. luaK_code0(fs, OP_END);
  326. luaK_getlabel(fs); /* close eventual list of pending jumps */
  327. luaM_reallocvector(L, f->code, fs->pc, Instruction);
  328. luaM_reallocvector(L, f->kstr, f->nkstr, TString *);
  329. luaM_reallocvector(L, f->knum, f->nknum, Number);
  330. luaM_reallocvector(L, f->kproto, f->nkproto, Proto *);
  331. if (fs->nvars != -1) { /* debug information? */
  332. luaI_registerlocalvar(ls, NULL, -1); /* flag end of vector */
  333. luaM_reallocvector(L, f->locvars, fs->nvars, LocVar);
  334. }
  335. ls->fs = fs->prev;
  336. LUA_ASSERT(L, fs->bl == NULL, "wrong list end");
  337. }
  338. Proto *luaY_parser (lua_State *L, ZIO *z) {
  339. struct LexState lexstate;
  340. struct FuncState funcstate;
  341. luaX_setinput(L, &lexstate, z);
  342. init_state(&lexstate, &funcstate, luaS_new(L, zname(z)));
  343. next(&lexstate); /* read first token */
  344. chunk(&lexstate);
  345. if (lexstate.token != TK_EOS)
  346. luaK_error(&lexstate, "<eof> expected");
  347. close_func(&lexstate);
  348. LUA_ASSERT(L, funcstate.prev == NULL, "wrong list end");
  349. return funcstate.f;
  350. }
  351. /*============================================================*/
  352. /* GRAMAR RULES */
  353. /*============================================================*/
  354. static int explist1 (LexState *ls) {
  355. /* explist1 -> expr { ',' expr } */
  356. int n = 1; /* at least one expression */
  357. expdesc v;
  358. expr(ls, &v);
  359. while (ls->token == ',') {
  360. luaK_tostack(ls, &v, 1); /* gets only 1 value from previous expression */
  361. next(ls); /* skip comma */
  362. expr(ls, &v);
  363. n++;
  364. }
  365. luaK_tostack(ls, &v, 0); /* keep open number of values of last expression */
  366. return n;
  367. }
  368. static int explist (LexState *ls) {
  369. /* explist -> [ explist1 ] */
  370. switch (ls->token) {
  371. case TK_NUMBER: case TK_STRING: case TK_NIL: case '{':
  372. case TK_FUNCTION: case '(': case TK_NAME: case '%':
  373. case TK_NOT: case '-': /* first `expr' */
  374. return explist1(ls);
  375. default:
  376. return 0; /* empty list */
  377. }
  378. }
  379. static void funcargs (LexState *ls, int slf) {
  380. FuncState *fs = ls->fs;
  381. int slevel = fs->stacklevel - slf - 1; /* where is func in the stack */
  382. switch (ls->token) {
  383. case '(': { /* funcargs -> '(' explist ')' */
  384. int line = ls->linenumber;
  385. int nargs;
  386. next(ls);
  387. nargs = explist(ls);
  388. check_match(ls, ')', '(', line);
  389. #ifdef LUA_COMPAT_ARGRET
  390. if (nargs > 0) /* arg list is not empty? */
  391. luaK_setcallreturns(fs, 1); /* last call returns only 1 value */
  392. #else
  393. UNUSED(nargs); /* to avoid warnings */
  394. #endif
  395. break;
  396. }
  397. case '{': /* funcargs -> constructor */
  398. constructor(ls);
  399. break;
  400. case TK_STRING: /* funcargs -> STRING */
  401. code_string(ls, ls->seminfo.ts); /* must use `seminfo' before `next' */
  402. next(ls);
  403. break;
  404. default:
  405. luaK_error(ls, "function arguments expected");
  406. break;
  407. }
  408. fs->stacklevel = slevel; /* call will remove function and arguments */
  409. luaK_code2(fs, OP_CALL, slevel, MULT_RET);
  410. }
  411. static void var_or_func_tail (LexState *ls, expdesc *v) {
  412. for (;;) {
  413. switch (ls->token) {
  414. case '.': /* var_or_func_tail -> '.' NAME */
  415. next(ls);
  416. luaK_tostack(ls, v, 1); /* `v' must be on stack */
  417. luaK_kstr(ls, checkname(ls));
  418. v->k = VINDEXED;
  419. break;
  420. case '[': /* var_or_func_tail -> '[' exp1 ']' */
  421. next(ls);
  422. luaK_tostack(ls, v, 1); /* `v' must be on stack */
  423. v->k = VINDEXED;
  424. exp1(ls);
  425. check(ls, ']');
  426. break;
  427. case ':': { /* var_or_func_tail -> ':' NAME funcargs */
  428. int name;
  429. next(ls);
  430. name = checkname(ls);
  431. luaK_tostack(ls, v, 1); /* `v' must be on stack */
  432. luaK_code1(ls->fs, OP_PUSHSELF, name);
  433. funcargs(ls, 1);
  434. v->k = VEXP;
  435. v->u.l.t = v->u.l.f = NO_JUMP;
  436. break;
  437. }
  438. case '(': case TK_STRING: case '{': /* var_or_func_tail -> funcargs */
  439. luaK_tostack(ls, v, 1); /* `v' must be on stack */
  440. funcargs(ls, 0);
  441. v->k = VEXP;
  442. v->u.l.t = v->u.l.f = NO_JUMP;
  443. break;
  444. default: return; /* should be follow... */
  445. }
  446. }
  447. }
  448. static void var_or_func (LexState *ls, expdesc *v) {
  449. /* var_or_func -> ['%'] NAME var_or_func_tail */
  450. if (optional(ls, '%')) { /* upvalue? */
  451. pushupvalue(ls, str_checkname(ls));
  452. v->k = VEXP;
  453. v->u.l.t = v->u.l.f = NO_JUMP;
  454. }
  455. else /* variable name */
  456. singlevar(ls, str_checkname(ls), v, 0);
  457. var_or_func_tail(ls, v);
  458. }
  459. /*
  460. ** {======================================================================
  461. ** Rules for Constructors
  462. ** =======================================================================
  463. */
  464. static void recfield (LexState *ls) {
  465. /* recfield -> (NAME | '['exp1']') = exp1 */
  466. switch (ls->token) {
  467. case TK_NAME:
  468. luaK_kstr(ls, checkname(ls));
  469. break;
  470. case '[':
  471. next(ls);
  472. exp1(ls);
  473. check(ls, ']');
  474. break;
  475. default: luaK_error(ls, "<name> or `[' expected");
  476. }
  477. check(ls, '=');
  478. exp1(ls);
  479. }
  480. static int recfields (LexState *ls) {
  481. /* recfields -> { ',' recfield } [','] */
  482. FuncState *fs = ls->fs;
  483. int n = 1; /* one has been read before */
  484. int mod_n = 1; /* mod_n == n%RFIELDS_PER_FLUSH */
  485. while (ls->token == ',') {
  486. next(ls);
  487. if (ls->token == ';' || ls->token == '}')
  488. break;
  489. recfield(ls);
  490. n++;
  491. if (++mod_n == RFIELDS_PER_FLUSH) {
  492. luaK_code1(fs, OP_SETMAP, RFIELDS_PER_FLUSH-1);
  493. mod_n = 0;
  494. }
  495. }
  496. if (mod_n)
  497. luaK_code1(fs, OP_SETMAP, mod_n-1);
  498. return n;
  499. }
  500. static int listfields (LexState *ls) {
  501. /* listfields -> { ',' exp1 } [','] */
  502. FuncState *fs = ls->fs;
  503. int n = 1; /* one has been read before */
  504. int mod_n = 1; /* mod_n == n%LFIELDS_PER_FLUSH */
  505. while (ls->token == ',') {
  506. next(ls);
  507. if (ls->token == ';' || ls->token == '}')
  508. break;
  509. exp1(ls);
  510. n++;
  511. checklimit(ls, n, MAXARG_A*LFIELDS_PER_FLUSH,
  512. "items in a list initializer");
  513. if (++mod_n == LFIELDS_PER_FLUSH) {
  514. luaK_code2(fs, OP_SETLIST, n/LFIELDS_PER_FLUSH - 1, LFIELDS_PER_FLUSH-1);
  515. mod_n = 0;
  516. }
  517. }
  518. if (mod_n > 0)
  519. luaK_code2(fs, OP_SETLIST, n/LFIELDS_PER_FLUSH, mod_n-1);
  520. return n;
  521. }
  522. static void constructor_part (LexState *ls, Constdesc *cd) {
  523. switch (ls->token) {
  524. case ';': case '}': /* constructor_part -> empty */
  525. cd->n = 0;
  526. cd->k = ls->token;
  527. return;
  528. case TK_NAME: {
  529. expdesc v;
  530. expr(ls, &v);
  531. if (ls->token == '=') {
  532. luaK_kstr(ls, getvarname(ls, &v));
  533. next(ls); /* skip '=' */
  534. exp1(ls);
  535. cd->n = recfields(ls);
  536. cd->k = 1; /* record */
  537. }
  538. else {
  539. luaK_tostack(ls, &v, 0);
  540. cd->n = listfields(ls);
  541. cd->k = 0; /* list */
  542. }
  543. break;
  544. }
  545. case '[': /* constructor_part -> recfield recfields */
  546. recfield(ls);
  547. cd->n = recfields(ls);
  548. cd->k = 1; /* record */
  549. break;
  550. default: /* constructor_part -> exp1 listfields */
  551. exp1(ls);
  552. cd->n = listfields(ls);
  553. cd->k = 0; /* list */
  554. break;
  555. }
  556. }
  557. static void constructor (LexState *ls) {
  558. /* constructor -> '{' constructor_part [';' constructor_part] '}' */
  559. FuncState *fs = ls->fs;
  560. int line = ls->linenumber;
  561. int pc = luaK_code1(fs, OP_CREATETABLE, 0);
  562. int nelems;
  563. Constdesc cd;
  564. check(ls, '{');
  565. constructor_part(ls, &cd);
  566. nelems = cd.n;
  567. if (ls->token == ';') {
  568. Constdesc other_cd;
  569. next(ls);
  570. constructor_part(ls, &other_cd);
  571. if (cd.k == other_cd.k) /* repeated parts? */
  572. luaK_error(ls, "invalid constructor syntax");
  573. nelems += other_cd.n;
  574. }
  575. check_match(ls, '}', '{', line);
  576. /* set initial table size */
  577. SETARG_U(fs->f->code[pc], nelems);
  578. }
  579. /* }====================================================================== */
  580. /*
  581. ** {======================================================================
  582. ** Expression parsing
  583. ** =======================================================================
  584. */
  585. static void simpleexp (LexState *ls, expdesc *v) {
  586. FuncState *fs = ls->fs;
  587. setline(ls);
  588. switch (ls->token) {
  589. case TK_NUMBER: { /* simpleexp -> NUMBER */
  590. Number r = ls->seminfo.r;
  591. next(ls);
  592. luaK_number(fs, r);
  593. break;
  594. }
  595. case TK_STRING: /* simpleexp -> STRING */
  596. code_string(ls, ls->seminfo.ts); /* must use `seminfo' before `next' */
  597. next(ls);
  598. break;
  599. case TK_NIL: /* simpleexp -> NIL */
  600. luaK_adjuststack(fs, -1);
  601. next(ls);
  602. break;
  603. case '{': /* simpleexp -> constructor */
  604. constructor(ls);
  605. break;
  606. case TK_FUNCTION: /* simpleexp -> FUNCTION body */
  607. next(ls);
  608. body(ls, 0, ls->linenumber);
  609. break;
  610. case '(': /* simpleexp -> '(' expr ')' */
  611. next(ls);
  612. expr(ls, v);
  613. check(ls, ')');
  614. return;
  615. case TK_NAME: case '%':
  616. var_or_func(ls, v);
  617. return;
  618. default:
  619. luaK_error(ls, "<expression> expected");
  620. return;
  621. }
  622. v->k = VEXP;
  623. v->u.l.t = v->u.l.f = NO_JUMP;
  624. }
  625. static void exp1 (LexState *ls) {
  626. expdesc v;
  627. expr(ls, &v);
  628. luaK_tostack(ls, &v, 1);
  629. }
  630. /*
  631. ** gets priorities of an operator. Returns the priority to the left, and
  632. ** sets `rp' to the priority to the right.
  633. */
  634. static int get_priority (int op, int *rp) {
  635. switch (op) {
  636. case '^': *rp = 8; return 9; /* right associative */
  637. #define UNARY_PRIORITY 7
  638. case '*': case '/': *rp = 6; return 6;
  639. case '+': case '-': *rp = 5; return 5;
  640. case TK_CONCAT: *rp = 3; return 4; /* right associative (?) */
  641. case TK_EQ: case TK_NE: case '>': case '<': case TK_LE: case TK_GE:
  642. *rp = 2; return 2;
  643. case TK_AND: case TK_OR: *rp = 1; return 1;
  644. default: *rp = -1; return -1;
  645. }
  646. }
  647. /*
  648. ** subexpr -> (simplexep | (NOT | '-') subexpr) { binop subexpr }
  649. ** where `binop' is any binary operator with a priority higher than `limit'
  650. */
  651. static void subexpr (LexState *ls, expdesc *v, int limit) {
  652. int rp;
  653. if (ls->token == '-' || ls->token == TK_NOT) {
  654. int op = ls->token; /* operator */
  655. next(ls);
  656. subexpr(ls, v, UNARY_PRIORITY);
  657. luaK_prefix(ls, op, v);
  658. }
  659. else simpleexp(ls, v);
  660. /* expand while operators have priorities higher than `limit' */
  661. while (get_priority(ls->token, &rp) > limit) {
  662. expdesc v2;
  663. int op = ls->token; /* current operator (with priority == `rp') */
  664. next(ls);
  665. luaK_infix(ls, op, v);
  666. subexpr(ls, &v2, rp); /* read sub-expression with priority > `rp' */
  667. luaK_posfix(ls, op, v, &v2);
  668. }
  669. }
  670. static void expr (LexState *ls, expdesc *v) {
  671. subexpr(ls, v, -1);
  672. }
  673. /* }==================================================================== */
  674. /*
  675. ** {======================================================================
  676. ** Rules for Statements
  677. ** =======================================================================
  678. */
  679. static void block (LexState *ls) {
  680. /* block -> chunk */
  681. FuncState *fs = ls->fs;
  682. int nlocalvar = fs->nlocalvar;
  683. chunk(ls);
  684. luaK_adjuststack(fs, fs->nlocalvar - nlocalvar); /* remove local variables */
  685. removelocalvars(ls, fs->nlocalvar - nlocalvar, fs->lastsetline);
  686. }
  687. static int assignment (LexState *ls, expdesc *v, int nvars) {
  688. int left = 0;
  689. checklimit(ls, nvars, MAXVARSLH, "variables in a multiple assignment");
  690. if (ls->token == ',') { /* assignment -> ',' NAME assignment */
  691. expdesc nv;
  692. next(ls);
  693. var_or_func(ls, &nv);
  694. if (nv.k == VEXP)
  695. luaK_error(ls, "syntax error");
  696. left = assignment(ls, &nv, nvars+1);
  697. }
  698. else { /* assignment -> '=' explist1 */
  699. int nexps;;
  700. if (ls->token != '=')
  701. error_unexpected(ls);
  702. next(ls);
  703. nexps = explist1(ls);
  704. adjust_mult_assign(ls, nvars, nexps);
  705. }
  706. if (v->k != VINDEXED)
  707. luaK_storevar(ls, v);
  708. else { /* there may be garbage between table-index and value */
  709. luaK_code2(ls->fs, OP_SETTABLE, left+nvars+2, 1);
  710. left += 2;
  711. }
  712. return left;
  713. }
  714. static void whilestat (LexState *ls, int line) {
  715. /* whilestat -> WHILE exp1 DO block END */
  716. FuncState *fs = ls->fs;
  717. int while_init = luaK_getlabel(fs);
  718. expdesc v;
  719. Breaklabel bl;
  720. enterbreak(fs, &bl);
  721. setline_and_next(ls); /* trace WHILE when looping */
  722. expr(ls, &v); /* read condition */
  723. luaK_goiftrue(fs, &v, 0);
  724. check(ls, TK_DO);
  725. block(ls);
  726. luaK_patchlist(fs, luaK_jump(fs), while_init);
  727. luaK_patchlist(fs, v.u.l.f, luaK_getlabel(fs));
  728. check_END(ls, TK_WHILE, line); /* trace END when loop ends */
  729. leavebreak(fs, &bl);
  730. }
  731. static void repeatstat (LexState *ls, int line) {
  732. /* repeatstat -> REPEAT block UNTIL exp1 */
  733. FuncState *fs = ls->fs;
  734. int repeat_init = luaK_getlabel(fs);
  735. expdesc v;
  736. Breaklabel bl;
  737. enterbreak(fs, &bl);
  738. setline_and_next(ls); /* trace REPEAT when looping */
  739. block(ls);
  740. check_match(ls, TK_UNTIL, TK_REPEAT, line);
  741. expr(ls, &v);
  742. luaK_goiftrue(fs, &v, 0);
  743. luaK_patchlist(fs, v.u.l.f, repeat_init);
  744. leavebreak(fs, &bl);
  745. }
  746. static void forstat (LexState *ls, int line) {
  747. /* forstat -> FOR NAME '=' expr1 ',' expr1 [',' expr1] DO block END */
  748. FuncState *fs = ls->fs;
  749. int prep;
  750. int blockinit;
  751. Breaklabel bl;
  752. enterbreak(fs, &bl);
  753. setline_and_next(ls); /* skip for */
  754. store_localvar(ls, str_checkname(ls), 0); /* control variable */
  755. check(ls, '=');
  756. exp1(ls); /* initial value */
  757. check(ls, ',');
  758. exp1(ls); /* limit */
  759. if (optional(ls, ','))
  760. exp1(ls); /* optional step */
  761. else
  762. luaK_code1(fs, OP_PUSHINT, 1); /* default step */
  763. adjustlocalvars(ls, 1, 0); /* init scope for control variable */
  764. add_localvar(ls, " limit ");
  765. add_localvar(ls, " step ");
  766. prep = luaK_code0(fs, OP_FORPREP);
  767. blockinit = luaK_getlabel(fs);
  768. check(ls, TK_DO);
  769. block(ls);
  770. luaK_patchlist(fs, prep, luaK_getlabel(fs));
  771. luaK_patchlist(fs, luaK_code0(fs, OP_FORLOOP), blockinit);
  772. check_END(ls, TK_FOR, line);
  773. leavebreak(fs, &bl);
  774. removelocalvars(ls, 3, fs->lastsetline);
  775. }
  776. static void test_and_block (LexState *ls, expdesc *v) {
  777. /* test_and_block -> [IF | ELSEIF] cond THEN block */
  778. setline_and_next(ls); /* skip IF or ELSEIF */
  779. expr(ls, v); /* cond */
  780. luaK_goiftrue(ls->fs, v, 0);
  781. setline(ls); /* to trace the THEN */
  782. check(ls, TK_THEN);
  783. block(ls); /* `then' part */
  784. }
  785. static void ifstat (LexState *ls, int line) {
  786. /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */
  787. FuncState *fs = ls->fs;
  788. expdesc v;
  789. int escapelist = NO_JUMP;
  790. test_and_block(ls, &v); /* IF cond THEN block */
  791. while (ls->token == TK_ELSEIF) {
  792. luaK_concat(fs, &escapelist, luaK_jump(fs));
  793. luaK_patchlist(fs, v.u.l.f, luaK_getlabel(fs));
  794. test_and_block(ls, &v); /* ELSEIF cond THEN block */
  795. }
  796. if (ls->token == TK_ELSE) {
  797. luaK_concat(fs, &escapelist, luaK_jump(fs));
  798. luaK_patchlist(fs, v.u.l.f, luaK_getlabel(fs));
  799. setline_and_next(ls); /* skip ELSE */
  800. block(ls); /* `else' part */
  801. }
  802. else
  803. luaK_concat(fs, &escapelist, v.u.l.f);
  804. luaK_patchlist(fs, escapelist, luaK_getlabel(fs));
  805. check_END(ls, TK_IF, line);
  806. }
  807. static int localnamelist (LexState *ls) {
  808. /* localnamelist -> NAME {',' NAME} */
  809. int i = 1;
  810. store_localvar(ls, str_checkname(ls), 0);
  811. while (ls->token == ',') {
  812. next(ls);
  813. store_localvar(ls, str_checkname(ls), i++);
  814. }
  815. return i;
  816. }
  817. static int decinit (LexState *ls) {
  818. /* decinit -> ['=' explist1] */
  819. if (ls->token == '=') {
  820. next(ls);
  821. return explist1(ls);
  822. }
  823. else
  824. return 0; /* no initializations */
  825. }
  826. static void localstat (LexState *ls) {
  827. /* stat -> LOCAL localnamelist decinit */
  828. FuncState *fs = ls->fs;
  829. int nvars;
  830. int nexps;
  831. setline_and_next(ls); /* skip LOCAL */
  832. nvars = localnamelist(ls);
  833. nexps = decinit(ls);
  834. adjustlocalvars(ls, nvars, fs->lastsetline);
  835. adjust_mult_assign(ls, nvars, nexps);
  836. }
  837. static int funcname (LexState *ls, expdesc *v) {
  838. /* funcname -> NAME [':' NAME | '.' NAME] */
  839. int needself = 0;
  840. singlevar(ls, str_checkname(ls), v, 0);
  841. if (ls->token == ':' || ls->token == '.') {
  842. needself = (ls->token == ':');
  843. next(ls);
  844. luaK_tostack(ls, v, 1);
  845. luaK_kstr(ls, checkname(ls));
  846. v->k = VINDEXED;
  847. }
  848. return needself;
  849. }
  850. static void funcstat (LexState *ls, int line) {
  851. /* funcstat -> FUNCTION funcname body */
  852. int needself;
  853. expdesc v;
  854. if (ls->fs->prev) /* inside other function? */
  855. luaK_error(ls, "cannot nest this kind of function declaration");
  856. setline_and_next(ls); /* skip FUNCTION */
  857. needself = funcname(ls, &v);
  858. body(ls, needself, line);
  859. luaK_storevar(ls, &v);
  860. }
  861. static void namestat (LexState *ls) {
  862. /* stat -> func | ['%'] NAME assignment */
  863. FuncState *fs = ls->fs;
  864. expdesc v;
  865. setline(ls);
  866. var_or_func(ls, &v);
  867. if (v.k == VEXP) { /* stat -> func */
  868. if (!luaK_lastisopen(fs)) /* is just an upvalue? */
  869. luaK_error(ls, "syntax error");
  870. luaK_setcallreturns(fs, 0); /* call statement uses no results */
  871. }
  872. else { /* stat -> ['%'] NAME assignment */
  873. int left = assignment(ls, &v, 1);
  874. luaK_adjuststack(fs, left); /* remove eventual garbage left on stack */
  875. }
  876. }
  877. static void retstat (LexState *ls) {
  878. /* stat -> RETURN explist */
  879. FuncState *fs = ls->fs;
  880. setline_and_next(ls); /* skip RETURN */
  881. explist(ls);
  882. luaK_code1(fs, OP_RETURN, ls->fs->nlocalvar);
  883. fs->stacklevel = fs->nlocalvar; /* removes all temp values */
  884. }
  885. static void breakstat (LexState *ls) {
  886. /* stat -> BREAK [NAME] */
  887. FuncState *fs = ls->fs;
  888. Breaklabel *bl;
  889. int currentlevel = fs->stacklevel;
  890. setline_and_next(ls); /* skip BREAK */
  891. bl = findlabel(fs, optionalname(ls));
  892. luaK_adjuststack(fs, currentlevel - bl->stacklevel);
  893. luaK_concat(fs, &bl->breaklist, luaK_jump(fs));
  894. fs->stacklevel = currentlevel;
  895. }
  896. static int stat (LexState *ls) {
  897. int line = ls->linenumber; /* may be needed for error messages */
  898. switch (ls->token) {
  899. case TK_IF: /* stat -> ifstat */
  900. ifstat(ls, line);
  901. return 1;
  902. case TK_WHILE: /* stat -> whilestat */
  903. whilestat(ls, line);
  904. return 1;
  905. case TK_DO: /* stat -> DO block END */
  906. setline_and_next(ls); /* skip DO */
  907. block(ls);
  908. check_END(ls, TK_DO, line);
  909. return 1;
  910. case TK_FOR: /* stat -> forstat */
  911. forstat(ls, line);
  912. return 1;
  913. case TK_REPEAT: /* stat -> repeatstat */
  914. repeatstat(ls, line);
  915. return 1;
  916. case TK_FUNCTION: /* stat -> funcstat */
  917. funcstat(ls, line);
  918. return 1;
  919. case TK_LOCAL: /* stat -> localstat */
  920. localstat(ls);
  921. return 1;
  922. case TK_NAME: case '%': /* stat -> namestat */
  923. namestat(ls);
  924. return 1;
  925. case TK_RETURN: /* stat -> retstat */
  926. retstat(ls);
  927. return 2; /* must be last statement */
  928. case TK_BREAK: /* stat -> breakstat */
  929. breakstat(ls);
  930. return 2; /* must be last statement */
  931. default:
  932. return 0; /* no statement */
  933. }
  934. }
  935. static void parlist (LexState *ls) {
  936. int nparams = 0;
  937. int dots = 0;
  938. switch (ls->token) {
  939. case TK_DOTS: /* parlist -> DOTS */
  940. next(ls);
  941. dots = 1;
  942. break;
  943. case TK_NAME: /* parlist, tailparlist -> NAME [',' tailparlist] */
  944. init:
  945. store_localvar(ls, str_checkname(ls), nparams++);
  946. if (ls->token == ',') {
  947. next(ls);
  948. switch (ls->token) {
  949. case TK_DOTS: /* tailparlist -> DOTS */
  950. next(ls);
  951. dots = 1;
  952. break;
  953. case TK_NAME: /* tailparlist -> NAME [',' tailparlist] */
  954. goto init;
  955. default: luaK_error(ls, "<name> or `...' expected");
  956. }
  957. }
  958. break;
  959. case ')': break; /* parlist -> empty */
  960. default: luaK_error(ls, "<name> or `...' expected");
  961. }
  962. code_args(ls, nparams, dots);
  963. }
  964. static void body (LexState *ls, int needself, int line) {
  965. /* body -> '(' parlist ')' chunk END */
  966. FuncState new_fs;
  967. init_state(ls, &new_fs, ls->fs->f->source);
  968. new_fs.f->lineDefined = line;
  969. check(ls, '(');
  970. if (needself)
  971. add_localvar(ls, "self");
  972. parlist(ls);
  973. check(ls, ')');
  974. chunk(ls);
  975. check_END(ls, TK_FUNCTION, line);
  976. close_func(ls);
  977. func_onstack(ls, &new_fs);
  978. }
  979. /* }====================================================================== */
  980. static void label (LexState *ls, Breaklabel *bl) {
  981. /* label -> [ '|' NAME '|' ] */
  982. if (optional(ls, '|')) {
  983. enterbreak(ls->fs, bl);
  984. bl->label = str_checkname(ls);
  985. check(ls, '|');
  986. }
  987. else
  988. bl->label = NULL; /* there is no label */
  989. }
  990. static void chunk (LexState *ls) {
  991. /* chunk -> { [label] stat [';'] } */
  992. Breaklabel bl;
  993. int a;
  994. do {
  995. label(ls, &bl);
  996. a = stat(ls);
  997. if (a != 0)
  998. optional(ls, ';');
  999. else if (bl.label)
  1000. luaK_error(ls, "label without a statement");
  1001. LUA_ASSERT(ls->L, ls->fs->stacklevel == ls->fs->nlocalvar,
  1002. "stack size != # local vars");
  1003. if (bl.label)
  1004. leavebreak(ls->fs, &bl);
  1005. } while (a == 1);
  1006. }