2 ** $Id: lparser.c,v 1.3 1998/07/06 22:07:51 roberto Exp $
3 ** LL(1) Parser and code generator for Lua
4 ** See Copyright Notice in lua.h
24 /* for limit numbers in error messages */
25 #define MES_LIM(x) "(limit=" x ")"
28 /* size of a "normal" jump instruction: OpCode + 1 byte */
31 /* maximum number of local variables */
33 #define SMAXLOCALS "32"
36 /* maximum number of upvalues */
37 #define MAXUPVALUES 16
38 #define SMAXUPVALUES "16"
42 ** Variable descriptor:
43 ** must include a "exp" option because LL(1) cannot distinguish
44 ** between variables, upvalues and function calls on first sight.
45 ** VGLOBAL: info is constant index of global name
46 ** VLOCAL: info is stack index
47 ** VDOT: info is constant index of index name
48 ** VEXP: info is pc index of "nparam" of function call (or 0 if exp is closed)
50 typedef enum {VGLOBAL
, VLOCAL
, VDOT
, VINDEXED
, VEXP
} varkind
;
59 ** Expression List descriptor:
60 ** tells number of expressions in the list,
61 ** and, if last expression is open (a function call),
62 ** where is its pc index of "nparam"
66 int pc
; /* 0 if last expression is closed */
71 ** Constructors descriptor:
72 ** "n" indicates number of elements, and "k" signals whether
73 ** it is a list constructor (k = 0) or a record constructor (k = 1)
74 ** or empty (k = ';' or '}')
82 /* state needed to generate code for a given function */
83 typedef struct FuncState
{
84 TProtoFunc
*f
; /* current function header */
85 struct FuncState
*prev
; /* enclosuring function */
86 int pc
; /* next position to code */
87 int stacksize
; /* number of values on activation register */
88 int maxstacksize
; /* maximum number of values on activation register */
89 int nlocalvar
; /* number of active local variables */
90 int nupvalues
; /* number of upvalues */
91 int nvars
; /* number of entries in f->locvars */
92 int maxcode
; /* size of f->code */
93 int maxvars
; /* size of f->locvars (-1 if no debug information) */
94 int maxconsts
; /* size of f->consts */
95 int lastsetline
; /* line where last SETLINE was issued */
96 vardesc upvalues
[MAXUPVALUES
]; /* upvalues */
97 TaggedString
*localvar
[MAXLOCALS
]; /* store local variable names */
101 static int assignment (LexState
*ls
, vardesc
*v
, int nvars
);
102 static int cond (LexState
*ls
);
103 static int funcname (LexState
*ls
, vardesc
*v
);
104 static int funcparams (LexState
*ls
, int slf
);
105 static int listfields (LexState
*ls
);
106 static int localnamelist (LexState
*ls
);
107 static int optional (LexState
*ls
, int c
);
108 static int recfields (LexState
*ls
);
109 static int stat (LexState
*ls
);
110 static void block (LexState
*ls
);
111 static void body (LexState
*ls
, int needself
, int line
);
112 static void chunk (LexState
*ls
);
113 static void constructor (LexState
*ls
);
114 static void decinit (LexState
*ls
, listdesc
*d
);
115 static void exp0 (LexState
*ls
, vardesc
*v
);
116 static void exp1 (LexState
*ls
);
117 static void exp2 (LexState
*ls
, vardesc
*v
);
118 static void explist (LexState
*ls
, listdesc
*e
);
119 static void explist1 (LexState
*ls
, listdesc
*e
);
120 static void ifpart (LexState
*ls
);
121 static void parlist (LexState
*ls
);
122 static void part (LexState
*ls
, constdesc
*cd
);
123 static void recfield (LexState
*ls
);
124 static void ret (LexState
*ls
);
125 static void simpleexp (LexState
*ls
, vardesc
*v
);
126 static void statlist (LexState
*ls
);
127 static void var_or_func (LexState
*ls
, vardesc
*v
);
128 static void var_or_func_tail (LexState
*ls
, vardesc
*v
);
132 static void check_pc (FuncState
*fs
, int n
) {
133 if (fs
->pc
+n
> fs
->maxcode
)
134 fs
->maxcode
= luaM_growvector(&fs
->f
->code
, fs
->maxcode
,
135 Byte
, codeEM
, MAX_INT
);
139 static void code_byte (FuncState
*fs
, Byte c
) {
141 fs
->f
->code
[fs
->pc
++] = c
;
145 static void deltastack (LexState
*ls
, int delta
) {
146 FuncState
*fs
= ls
->fs
;
147 fs
->stacksize
+= delta
;
148 if (fs
->stacksize
> fs
->maxstacksize
) {
149 if (fs
->stacksize
> 255)
150 luaX_error(ls
, "function/expression too complex");
151 fs
->maxstacksize
= fs
->stacksize
;
156 static int code_oparg_at (LexState
*ls
, int pc
, OpCode op
, int builtin
,
157 int arg
, int delta
) {
158 Byte
*code
= ls
->fs
->f
->code
;
159 deltastack(ls
, delta
);
164 else if (arg
<= 255) {
169 else if (arg
<= MAX_WORD
) {
170 code
[pc
] = op
+1+builtin
;
172 code
[pc
+2] = arg
&0xFF;
175 else luaX_error(ls
, "code too long " MES_LIM("64K"));
176 return 0; /* to avoid warnings */
180 static int fix_opcode (LexState
*ls
, int pc
, OpCode op
, int builtin
, int arg
) {
181 FuncState
*fs
= ls
->fs
;
182 TProtoFunc
*f
= fs
->f
;
183 if (arg
< builtin
) { /* close space */
184 luaO_memdown(f
->code
+pc
+1, f
->code
+pc
+2, fs
->pc
-(pc
+2));
187 else if (arg
> 255) { /* open space */
189 luaO_memup(f
->code
+pc
+1, f
->code
+pc
, fs
->pc
-pc
);
192 return code_oparg_at(ls
, pc
, op
, builtin
, arg
, 0) - 2;
195 static void code_oparg (LexState
*ls
, OpCode op
, int builtin
, int arg
,
197 check_pc(ls
->fs
, 3); /* maximum code size */
198 ls
->fs
->pc
+= code_oparg_at(ls
, ls
->fs
->pc
, op
, builtin
, arg
, delta
);
202 static void code_opcode (LexState
*ls
, OpCode op
, int delta
) {
203 deltastack(ls
, delta
);
204 code_byte(ls
->fs
, op
);
208 static void code_constant (LexState
*ls
, int c
) {
209 code_oparg(ls
, PUSHCONSTANT
, 8, c
, 1);
213 static int next_constant (FuncState
*fs
) {
214 TProtoFunc
*f
= fs
->f
;
215 if (f
->nconsts
>= fs
->maxconsts
) {
216 fs
->maxconsts
= luaM_growvector(&f
->consts
, fs
->maxconsts
, TObject
,
217 constantEM
, MAX_WORD
);
223 static int string_constant (FuncState
*fs
, TaggedString
*s
) {
224 TProtoFunc
*f
= fs
->f
;
225 int c
= s
->constindex
;
226 if (!(c
< f
->nconsts
&&
227 ttype(&f
->consts
[c
]) == LUA_T_STRING
&& tsvalue(&f
->consts
[c
]) == s
)) {
228 c
= next_constant(fs
);
229 ttype(&f
->consts
[c
]) = LUA_T_STRING
;
230 tsvalue(&f
->consts
[c
]) = s
;
231 s
->constindex
= c
; /* hint for next time */
237 static void code_string (LexState
*ls
, TaggedString
*s
) {
238 code_constant(ls
, string_constant(ls
->fs
, s
));
243 static int real_constant (FuncState
*fs
, real r
) {
244 /* check whether 'r' has appeared within the last LIM entries */
245 TObject
*cnt
= fs
->f
->consts
;
246 int c
= fs
->f
->nconsts
;
247 int lim
= c
< LIM
? 0 : c
-LIM
;
249 if (ttype(&cnt
[c
]) == LUA_T_NUMBER
&& nvalue(&cnt
[c
]) == r
)
252 /* not found; create a luaM_new entry */
253 c
= next_constant(fs
);
254 cnt
= fs
->f
->consts
; /* 'next_constant' may reallocate this vector */
255 ttype(&cnt
[c
]) = LUA_T_NUMBER
;
261 static void code_number (LexState
*ls
, real f
) {
263 if (f
>= 0 && f
<= (real
)MAX_WORD
&& (real
)(i
=(int)f
) == f
)
264 code_oparg(ls
, PUSHNUMBER
, 3, i
, 1); /* f has a short integer value */
266 code_constant(ls
, real_constant(ls
->fs
, f
));
270 static void flush_record (LexState
*ls
, int n
) {
272 code_oparg(ls
, SETMAP
, 1, n
-1, -2*n
);
276 static void flush_list (LexState
*ls
, int m
, int n
) {
278 code_oparg(ls
, SETLIST
, 1, m
, -n
);
279 code_byte(ls
->fs
, n
);
283 static void luaI_registerlocalvar (FuncState
*fs
, TaggedString
*varname
,
285 if (fs
->maxvars
!= -1) { /* debug information? */
286 TProtoFunc
*f
= fs
->f
;
287 if (fs
->nvars
>= fs
->maxvars
)
288 fs
->maxvars
= luaM_growvector(&f
->locvars
, fs
->maxvars
,
289 LocVar
, "", MAX_WORD
);
290 f
->locvars
[fs
->nvars
].varname
= varname
;
291 f
->locvars
[fs
->nvars
].line
= line
;
297 static void luaI_unregisterlocalvar (FuncState
*fs
, int line
) {
298 luaI_registerlocalvar(fs
, NULL
, line
);
302 static void store_localvar (LexState
*ls
, TaggedString
*name
, int n
) {
303 FuncState
*fs
= ls
->fs
;
304 if (fs
->nlocalvar
+n
< MAXLOCALS
)
305 fs
->localvar
[fs
->nlocalvar
+n
] = name
;
307 luaX_error(ls
, "too many local variables " MES_LIM(SMAXLOCALS
));
308 luaI_registerlocalvar(fs
, name
, ls
->linenumber
);
312 static void add_localvar (LexState
*ls
, TaggedString
*name
) {
313 store_localvar(ls
, name
, 0);
318 static int aux_localname (FuncState
*fs
, TaggedString
*n
) {
320 for (i
=fs
->nlocalvar
-1; i
>= 0; i
--)
321 if (n
== fs
->localvar
[i
]) return i
; /* local var index */
322 return -1; /* not found */
326 static void singlevar (LexState
*ls
, TaggedString
*n
, vardesc
*var
, int prev
) {
327 FuncState
*fs
= prev
? ls
->fs
->prev
: ls
->fs
;
328 int i
= aux_localname(fs
, n
);
329 if (i
>= 0) { /* local value */
333 else { /* check shadowing */
334 FuncState
*level
= fs
;
335 while ((level
= level
->prev
) != NULL
)
336 if (aux_localname(level
, n
) >= 0)
337 luaX_syntaxerror(ls
, "cannot access a variable in outer scope", n
->str
);
339 var
->info
= string_constant(fs
, n
);
344 static int indexupvalue (LexState
*ls
, TaggedString
*n
) {
345 FuncState
*fs
= ls
->fs
;
348 singlevar(ls
, n
, &v
, 1);
349 for (i
=0; i
<fs
->nupvalues
; i
++) {
350 if (fs
->upvalues
[i
].k
== v
.k
&& fs
->upvalues
[i
].info
== v
.info
)
354 if (++(fs
->nupvalues
) > MAXUPVALUES
)
355 luaX_error(ls
, "too many upvalues in a single function "
356 MES_LIM(SMAXUPVALUES
));
357 fs
->upvalues
[i
] = v
; /* i = fs->nupvalues - 1 */
362 static void pushupvalue (LexState
*ls
, TaggedString
*n
) {
364 if (ls
->fs
->prev
== NULL
)
365 luaX_syntaxerror(ls
, "cannot access upvalue in main", n
->str
);
366 if (aux_localname(ls
->fs
, n
) >= 0)
367 luaX_syntaxerror(ls
, "cannot access an upvalue in current scope", n
->str
);
368 i
= indexupvalue(ls
, n
);
369 code_oparg(ls
, PUSHUPVALUE
, 2, i
, 1);
374 static void check_debugline (LexState
*ls
) {
375 if (lua_debug
&& ls
->linenumber
!= ls
->fs
->lastsetline
) {
376 code_oparg(ls
, SETLINE
, 0, ls
->linenumber
, 0);
377 ls
->fs
->lastsetline
= ls
->linenumber
;
382 static void adjuststack (LexState
*ls
, int n
) {
384 code_oparg(ls
, POP
, 2, n
-1, -n
);
386 code_oparg(ls
, PUSHNIL
, 1, (-n
)-1, -n
);
390 static void close_exp (LexState
*ls
, int pc
, int nresults
) {
391 if (pc
> 0) { /* expression is an open function call */
392 Byte
*code
= ls
->fs
->f
->code
;
393 int nparams
= code
[pc
]; /* save nparams */
394 pc
+= fix_opcode(ls
, pc
-2, CALLFUNC
, 2, nresults
);
395 code
[pc
] = nparams
; /* restore nparams */
396 if (nresults
!= MULT_RET
)
397 deltastack(ls
, nresults
); /* "push" results */
398 deltastack(ls
, -(nparams
+1)); /* "pop" params and function */
403 static void adjust_mult_assign (LexState
*ls
, int nvars
, listdesc
*d
) {
404 int diff
= d
->n
- nvars
;
405 if (d
->pc
== 0) { /* list is closed */
406 /* push or pop eventual difference between list lengths */
407 adjuststack(ls
, diff
);
409 else { /* must correct function call */
410 diff
--; /* do not count function call itself */
411 if (diff
< 0) { /* more variables than values */
412 /* function call must provide extra values */
413 close_exp(ls
, d
->pc
, -diff
);
415 else { /* more values than variables */
416 close_exp(ls
, d
->pc
, 0); /* call should provide no value */
417 adjuststack(ls
, diff
); /* pop eventual extra values */
423 static void code_args (LexState
*ls
, int nparams
, int dots
) {
424 FuncState
*fs
= ls
->fs
;
425 fs
->nlocalvar
+= nparams
; /* "self" may already be there */
426 nparams
= fs
->nlocalvar
;
428 fs
->f
->code
[1] = nparams
; /* fill-in arg information */
429 deltastack(ls
, nparams
);
432 fs
->f
->code
[1] = nparams
+ZEROVARARG
;
433 deltastack(ls
, nparams
+1);
434 add_localvar(ls
, luaS_new("arg"));
439 static void lua_pushvar (LexState
*ls
, vardesc
*var
) {
442 code_oparg(ls
, PUSHLOCAL
, 8, var
->info
, 1);
445 code_oparg(ls
, GETGLOBAL
, 8, var
->info
, 1);
448 code_oparg(ls
, GETDOTTED
, 8, var
->info
, 0);
451 code_opcode(ls
, GETTABLE
, -1);
454 close_exp(ls
, var
->info
, 1); /* function must return 1 value */
458 var
->info
= 0; /* now this is a closed expression */
462 static void storevar (LexState
*ls
, vardesc
*var
) {
465 code_oparg(ls
, SETLOCAL
, 8, var
->info
, -1);
468 code_oparg(ls
, SETGLOBAL
, 8, var
->info
, -1);
471 code_opcode(ls
, SETTABLE0
, -3);
474 LUA_INTERNALERROR("invalid var kind to store");
479 static int fix_jump (LexState
*ls
, int pc
, OpCode op
, int n
) {
480 /* jump is relative to position following jump instruction */
481 return fix_opcode(ls
, pc
, op
, 0, n
-(pc
+JMPSIZE
));
485 static void fix_upjmp (LexState
*ls
, OpCode op
, int pos
) {
486 int delta
= ls
->fs
->pc
+JMPSIZE
- pos
; /* jump is relative */
487 if (delta
> 255) delta
++;
488 code_oparg(ls
, op
, 0, delta
, 0);
492 static void codeIf (LexState
*ls
, int thenAdd
, int elseAdd
) {
493 FuncState
*fs
= ls
->fs
;
494 int elseinit
= elseAdd
+JMPSIZE
;
495 if (fs
->pc
== elseinit
) { /* no else part */
500 elseinit
+= fix_jump(ls
, elseAdd
, JMP
, fs
->pc
);
501 fix_jump(ls
, thenAdd
, IFFJMP
, elseinit
);
505 static void func_onstack (LexState
*ls
, FuncState
*func
) {
506 FuncState
*fs
= ls
->fs
;
508 int c
= next_constant(fs
);
509 ttype(&fs
->f
->consts
[c
]) = LUA_T_PROTO
;
510 fs
->f
->consts
[c
].value
.tf
= func
->f
;
511 if (func
->nupvalues
== 0)
512 code_constant(ls
, c
);
514 for (i
=0; i
<func
->nupvalues
; i
++)
515 lua_pushvar(ls
, &func
->upvalues
[i
]);
516 code_oparg(ls
, CLOSURE
, 0, c
, -func
->nupvalues
+1);
517 code_byte(fs
, func
->nupvalues
);
522 static void init_state (LexState
*ls
, FuncState
*fs
, TaggedString
*filename
) {
523 TProtoFunc
*f
= luaF_newproto();
524 fs
->prev
= ls
->fs
; /* linked list of funcstates */
527 fs
->maxstacksize
= 0;
532 f
->fileName
= filename
;
538 fs
->nvars
= fs
->maxvars
= 0;
540 fs
->maxvars
= -1; /* flag no debug information */
541 code_byte(fs
, 0); /* to be filled with stacksize */
542 code_byte(fs
, 0); /* to be filled with arg information */
546 static void close_func (LexState
*ls
) {
547 FuncState
*fs
= ls
->fs
;
548 TProtoFunc
*f
= fs
->f
;
549 code_opcode(ls
, ENDCODE
, 0);
550 f
->code
[0] = fs
->maxstacksize
;
551 f
->code
= luaM_reallocvector(f
->code
, fs
->pc
, Byte
);
552 f
->consts
= luaM_reallocvector(f
->consts
, f
->nconsts
, TObject
);
553 if (fs
->maxvars
!= -1) { /* debug information? */
554 luaI_registerlocalvar(fs
, NULL
, -1); /* flag end of vector */
555 f
->locvars
= luaM_reallocvector(f
->locvars
, fs
->nvars
, LocVar
);
562 static int expfollow
[] = {ELSE
, ELSEIF
, THEN
, IF
, WHILE
, REPEAT
, DO
, NAME
,
563 LOCAL
, FUNCTION
, END
, UNTIL
, RETURN
, ')', ']', '}', ';', EOS
, ',', 0};
565 static int is_in (int tok
, int *toks
) {
576 static void next (LexState
*ls
) {
577 ls
->token
= luaX_lex(ls
);
581 static void error_expected (LexState
*ls
, int token
) {
582 char buff
[100], t
[TOKEN_LEN
];
583 luaX_token2str(ls
, token
, t
);
584 sprintf(buff
, "`%s' expected", t
);
585 luaX_error(ls
, buff
);
588 static void error_unmatched (LexState
*ls
, int what
, int who
, int where
) {
589 if (where
== ls
->linenumber
)
590 error_expected(ls
, what
);
593 char t_what
[TOKEN_LEN
], t_who
[TOKEN_LEN
];
594 luaX_token2str(ls
, what
, t_what
);
595 luaX_token2str(ls
, who
, t_who
);
596 sprintf(buff
, "`%s' expected (to close `%s' at line %d)",
597 t_what
, t_who
, where
);
598 luaX_error(ls
, buff
);
602 static void check (LexState
*ls
, int c
) {
604 error_expected(ls
, c
);
608 static void check_match (LexState
*ls
, int what
, int who
, int where
) {
609 if (ls
->token
!= what
)
610 error_unmatched(ls
, what
, who
, where
);
611 check_debugline(ls
); /* to 'mark' the 'what' */
615 static TaggedString
*checkname (LexState
*ls
) {
617 if (ls
->token
!= NAME
)
618 luaX_error(ls
, "`NAME' expected");
625 static int optional (LexState
*ls
, int c
) {
626 if (ls
->token
== c
) {
634 TProtoFunc
*luaY_parser (ZIO
*z
) {
635 struct LexState lexstate
;
636 struct FuncState funcstate
;
637 luaX_setinput(&lexstate
, z
);
638 init_state(&lexstate
, &funcstate
, luaS_new(zname(z
)));
639 next(&lexstate
); /* read first token */
641 if (lexstate
.token
!= EOS
)
642 luaX_error(&lexstate
, "<eof> expected");
643 close_func(&lexstate
);
649 /*============================================================*/
651 /*============================================================*/
653 static void chunk (LexState
*ls
) {
654 /* chunk -> statlist ret */
659 static void statlist (LexState
*ls
) {
660 /* statlist -> { stat [;] } */
662 LUA_ASSERT(ls
->fs
->stacksize
== ls
->fs
->nlocalvar
,
663 "stack size != # local vars");
668 static int stat (LexState
*ls
) {
669 int line
= ls
->linenumber
; /* may be needed for error messages */
670 FuncState
*fs
= ls
->fs
;
672 case IF
: { /* stat -> IF ifpart END */
675 check_match(ls
, END
, IF
, line
);
679 case WHILE
: { /* stat -> WHILE cond DO block END */
680 TProtoFunc
*f
= fs
->f
;
681 int while_init
= fs
->pc
;
682 int cond_end
, cond_size
;
687 check_match(ls
, END
, WHILE
, line
);
688 cond_size
= cond_end
-while_init
;
689 check_pc(fs
, cond_size
);
690 memcpy(f
->code
+fs
->pc
, f
->code
+while_init
, cond_size
);
691 luaO_memdown(f
->code
+while_init
, f
->code
+cond_end
, fs
->pc
-while_init
);
692 while_init
+= JMPSIZE
+ fix_jump(ls
, while_init
, JMP
, fs
->pc
-cond_size
);
693 fix_upjmp(ls
, IFTUPJMP
, while_init
);
697 case DO
: { /* stat -> DO block END */
700 check_match(ls
, END
, DO
, line
);
704 case REPEAT
: { /* stat -> REPEAT block UNTIL exp1 */
705 int repeat_init
= fs
->pc
;
708 check_match(ls
, UNTIL
, REPEAT
, line
);
710 fix_upjmp(ls
, IFFUPJMP
, repeat_init
);
711 deltastack(ls
, -1); /* pops condition */
715 case FUNCTION
: { /* stat -> FUNCTION funcname body */
718 if (ls
->fs
->prev
) /* inside other function? */
722 needself
= funcname(ls
, &v
);
723 body(ls
, needself
, line
);
728 case LOCAL
: { /* stat -> LOCAL localnamelist decinit */
733 nvars
= localnamelist(ls
);
735 ls
->fs
->nlocalvar
+= nvars
;
736 adjust_mult_assign(ls
, nvars
, &d
);
740 case NAME
: case '%': { /* stat -> func | ['%'] NAME assignment */
744 if (v
.k
== VEXP
) { /* stat -> func */
745 if (v
.info
== 0) /* is just an upper value? */
746 luaX_error(ls
, "syntax error");
747 close_exp(ls
, v
.info
, 0);
750 int left
= assignment(ls
, &v
, 1); /* stat -> ['%'] NAME assignment */
751 adjuststack(ls
, left
); /* remove eventual 'garbage' left on stack */
756 case RETURN
: case ';': case ELSE
: case ELSEIF
:
757 case END
: case UNTIL
: case EOS
: /* 'stat' follow */
761 luaX_error(ls
, "<statement> expected");
762 return 0; /* to avoid warnings */
766 static int SaveWord (LexState
*ls
) {
767 int res
= ls
->fs
->pc
;
768 check_pc(ls
->fs
, JMPSIZE
);
769 ls
->fs
->pc
+= JMPSIZE
; /* open space */
773 static int SaveWordPop (LexState
*ls
) {
774 deltastack(ls
, -1); /* pop condition */
778 static int cond (LexState
*ls
) {
781 return SaveWordPop(ls
);
784 static void block (LexState
*ls
) {
786 FuncState
*fs
= ls
->fs
;
787 int nlocalvar
= fs
->nlocalvar
;
789 adjuststack(ls
, fs
->nlocalvar
- nlocalvar
);
790 for (; fs
->nlocalvar
> nlocalvar
; fs
->nlocalvar
--)
791 luaI_unregisterlocalvar(fs
, ls
->linenumber
);
794 static int funcname (LexState
*ls
, vardesc
*v
) {
795 /* funcname -> NAME [':' NAME | '.' NAME] */
797 singlevar(ls
, checkname(ls
), v
, 0);
798 if (ls
->token
== ':' || ls
->token
== '.') {
799 needself
= (ls
->token
== ':');
802 code_string(ls
, checkname(ls
));
808 static void body (LexState
*ls
, int needself
, int line
) {
809 /* body -> '(' parlist ')' chunk END */
811 init_state(ls
, &newfs
, ls
->fs
->f
->fileName
);
812 newfs
.f
->lineDefined
= line
;
815 add_localvar(ls
, luaS_new("self"));
819 check_match(ls
, END
, FUNCTION
, line
);
821 func_onstack(ls
, &newfs
);
824 static void ifpart (LexState
*ls
) {
825 /* ifpart -> cond THEN block [ELSE block | ELSEIF ifpart] */
845 static void ret (LexState
*ls
) {
846 /* ret -> [RETURN explist sc] */
847 if (ls
->token
== RETURN
) {
852 close_exp(ls
, e
.pc
, MULT_RET
);
853 code_oparg(ls
, RETCODE
, 0, ls
->fs
->nlocalvar
, 0);
854 ls
->fs
->stacksize
= ls
->fs
->nlocalvar
; /* removes all temp values */
861 ** For parsing expressions, we use a classic stack with priorities.
862 ** Each binary operator is represented by its index in "binop" + FIRSTBIN
863 ** (EQ=2, NE=3, ... '^'=13). The unary NOT is 0 and UNMINUS is 1.
866 /* code of first binary operator */
869 /* code for power operator (last operator)
870 ** '^' needs special treatment because it is right associative
874 static int binop
[] = {EQ
, NE
, '>', '<', LE
, GE
, CONC
,
875 '+', '-', '*', '/', '^', 0};
877 static int priority
[POW
+1] = {5, 5, 1, 1, 1, 1, 1, 1, 2, 3, 3, 4, 4, 6};
879 static OpCode opcodes
[POW
+1] = {NOTOP
, MINUSOP
, EQOP
, NEQOP
, GTOP
, LTOP
,
880 LEOP
, GEOP
, CONCOP
, ADDOP
, SUBOP
, MULTOP
, DIVOP
, POWOP
};
890 static void exp1 (LexState
*ls
) {
894 if (is_in(ls
->token
, expfollow
) < 0)
895 luaX_error(ls
, "ill formed expression");
899 static void exp0 (LexState
*ls
, vardesc
*v
) {
901 while (ls
->token
== AND
|| ls
->token
== OR
) {
902 int is_and
= (ls
->token
== AND
);
906 pc
= SaveWordPop(ls
);
909 fix_jump(ls
, pc
, (is_and
?ONFJMP
:ONTJMP
), ls
->fs
->pc
);
914 static void push (LexState
*ls
, stack_op
*s
, int op
) {
915 if (s
->top
== MAXOPS
)
916 luaX_error(ls
, "expression too complex");
917 s
->ops
[s
->top
++] = op
;
921 static void prefix (LexState
*ls
, stack_op
*s
) {
922 while (ls
->token
== NOT
|| ls
->token
== '-') {
923 push(ls
, s
, ls
->token
==NOT
?0:1);
928 static void pop_to (LexState
*ls
, stack_op
*s
, int prio
) {
930 while (s
->top
> 0 && priority
[(op
=s
->ops
[s
->top
-1])] >= prio
) {
931 code_opcode(ls
, opcodes
[op
], op
<FIRSTBIN
?0:-1);
936 static void exp2 (LexState
*ls
, vardesc
*v
) {
942 while ((op
= is_in(ls
->token
, binop
)) >= 0) {
945 /* '^' is right associative, so must 'simulate' a higher priority */
946 pop_to(ls
, &s
, (op
== POW
)?priority
[op
]+1:priority
[op
]);
960 static void simpleexp (LexState
*ls
, vardesc
*v
) {
963 case '(': /* simpleexp -> '(' exp0 ')' */
969 case NUMBER
: /* simpleexp -> NUMBER */
970 code_number(ls
, ls
->seminfo
.r
);
972 v
->k
= VEXP
; v
->info
= 0;
975 case STRING
: /* simpleexp -> STRING */
976 code_string(ls
, ls
->seminfo
.ts
);
978 v
->k
= VEXP
; v
->info
= 0;
981 case NIL
: /* simpleexp -> NIL */
984 v
->k
= VEXP
; v
->info
= 0;
987 case '{': /* simpleexp -> constructor */
989 v
->k
= VEXP
; v
->info
= 0;
992 case FUNCTION
: { /* simpleexp -> FUNCTION body */
993 int line
= ls
->linenumber
;
996 v
->k
= VEXP
; v
->info
= 0;
1000 case NAME
: case '%':
1005 luaX_error(ls
, "<expression> expected");
1010 static void var_or_func (LexState
*ls
, vardesc
*v
) {
1011 /* var_or_func -> ['%'] NAME var_or_func_tail */
1012 if (optional(ls
, '%')) { /* upvalue? */
1013 pushupvalue(ls
, checkname(ls
));
1015 v
->info
= 0; /* closed expression */
1017 else /* variable name */
1018 singlevar(ls
, checkname(ls
), v
, 0);
1019 var_or_func_tail(ls
, v
);
1022 static void var_or_func_tail (LexState
*ls
, vardesc
*v
) {
1024 switch (ls
->token
) {
1025 case '.': /* var_or_func_tail -> '.' NAME */
1027 lua_pushvar(ls
, v
); /* 'v' must be on stack */
1029 v
->info
= string_constant(ls
->fs
, checkname(ls
));
1032 case '[': /* var_or_func_tail -> '[' exp1 ']' */
1034 lua_pushvar(ls
, v
); /* 'v' must be on stack */
1040 case ':': /* var_or_func_tail -> ':' NAME funcparams */
1042 lua_pushvar(ls
, v
); /* 'v' must be on stack */
1043 code_oparg(ls
, PUSHSELF
, 8, string_constant(ls
->fs
, checkname(ls
)), 1);
1045 v
->info
= funcparams(ls
, 1);
1048 case '(': case STRING
: case '{': /* var_or_func_tail -> funcparams */
1049 lua_pushvar(ls
, v
); /* 'v' must be on stack */
1051 v
->info
= funcparams(ls
, 0);
1054 default: return; /* should be follow... */
1059 static int funcparams (LexState
*ls
, int slf
) {
1060 FuncState
*fs
= ls
->fs
;
1061 int nparams
= 1; /* default value */
1062 switch (ls
->token
) {
1063 case '(': { /* funcparams -> '(' explist ')' */
1068 close_exp(ls
, e
.pc
, 1);
1073 case '{': /* funcparams -> constructor */
1077 case STRING
: /* funcparams -> STRING */
1078 code_string(ls
, ls
->seminfo
.ts
);
1083 luaX_error(ls
, "function arguments expected");
1086 code_byte(fs
, 0); /* save space for opcode */
1087 code_byte(fs
, 0); /* and nresult */
1088 code_byte(fs
, nparams
+slf
);
1092 static void explist (LexState
*ls
, listdesc
*d
) {
1093 switch (ls
->token
) {
1094 case ELSE
: case ELSEIF
: case END
: case UNTIL
:
1095 case EOS
: case ';': case ')':
1105 static void explist1 (LexState
*ls
, listdesc
*d
) {
1109 while (ls
->token
== ',') {
1111 lua_pushvar(ls
, &v
);
1118 lua_pushvar(ls
, &v
);
1123 static void parlist (LexState
*ls
) {
1126 switch (ls
->token
) {
1127 case DOTS
: /* parlist -> DOTS */
1132 case NAME
: /* parlist, tailparlist -> NAME [',' tailparlist] */
1134 store_localvar(ls
, checkname(ls
), nparams
++);
1135 if (ls
->token
== ',') {
1137 switch (ls
->token
) {
1138 case DOTS
: /* tailparlist -> DOTS */
1143 case NAME
: /* tailparlist -> NAME [',' tailparlist] */
1146 default: luaX_error(ls
, "NAME or `...' expected");
1151 case ')': break; /* parlist -> empty */
1153 default: luaX_error(ls
, "NAME or `...' expected");
1155 code_args(ls
, nparams
, dots
);
1158 static int localnamelist (LexState
*ls
) {
1159 /* localnamelist -> NAME {',' NAME} */
1161 store_localvar(ls
, checkname(ls
), 0);
1162 while (ls
->token
== ',') {
1164 store_localvar(ls
, checkname(ls
), i
++);
1169 static void decinit (LexState
*ls
, listdesc
*d
) {
1170 /* decinit -> ['=' explist1] */
1171 if (ls
->token
== '=') {
1181 static int assignment (LexState
*ls
, vardesc
*v
, int nvars
) {
1183 /* dotted variables <a.x> must be stored like regular indexed vars <a["x"]> */
1185 code_constant(ls
, v
->info
);
1188 if (ls
->token
== ',') { /* assignment -> ',' NAME assignment */
1191 var_or_func(ls
, &nv
);
1193 luaX_error(ls
, "syntax error");
1194 left
= assignment(ls
, &nv
, nvars
+1);
1196 else { /* assignment -> '=' explist1 */
1200 adjust_mult_assign(ls
, nvars
, &d
);
1202 if (v
->k
!= VINDEXED
|| left
+(nvars
-1) == 0) {
1203 /* global/local var or indexed var without values in between */
1206 else { /* indexed var with values in between*/
1207 code_oparg(ls
, SETTABLE
, 0, left
+(nvars
-1), -1);
1208 left
+= 2; /* table/index are not popped, because they aren't on top */
1213 static void constructor (LexState
*ls
) {
1214 /* constructor -> '{' part [';' part] '}' */
1215 int line
= ls
->linenumber
;
1216 int pc
= SaveWord(ls
);
1223 if (ls
->token
== ';') {
1226 part(ls
, &other_cd
);
1227 if (cd
.k
== other_cd
.k
) /* repeated parts? */
1228 luaX_error(ls
, "invalid constructor syntax");
1229 nelems
+= other_cd
.n
;
1231 check_match(ls
, '}', '{', line
);
1232 fix_opcode(ls
, pc
, CREATEARRAY
, 2, nelems
);
1235 static void part (LexState
*ls
, constdesc
*cd
) {
1236 switch (ls
->token
) {
1237 case ';': case '}': /* part -> empty */
1245 if (ls
->token
== '=') {
1248 code_constant(ls
, v
.info
);
1251 code_string(ls
, ls
->fs
->localvar
[v
.info
]);
1254 luaX_error(ls
, "`=' unexpected");
1258 cd
->n
= recfields(ls
);
1259 cd
->k
= 1; /* record */
1262 lua_pushvar(ls
, &v
);
1263 cd
->n
= listfields(ls
);
1264 cd
->k
= 0; /* list */
1269 case '[': /* part -> recfield recfields */
1271 cd
->n
= recfields(ls
);
1272 cd
->k
= 1; /* record */
1275 default: /* part -> exp1 listfields */
1277 cd
->n
= listfields(ls
);
1278 cd
->k
= 0; /* list */
1283 static int recfields (LexState
*ls
) {
1284 /* recfields -> { ',' recfield } [','] */
1285 int n
= 1; /* one has been read before */
1286 while (ls
->token
== ',') {
1288 if (ls
->token
== ';' || ls
->token
== '}')
1292 if (n
%RFIELDS_PER_FLUSH
== 0)
1293 flush_record(ls
, RFIELDS_PER_FLUSH
);
1295 flush_record(ls
, n
%RFIELDS_PER_FLUSH
);
1299 static int listfields (LexState
*ls
) {
1300 /* listfields -> { ',' exp1 } [','] */
1301 int n
= 1; /* one has been read before */
1302 while (ls
->token
== ',') {
1304 if (ls
->token
== ';' || ls
->token
== '}')
1308 if (n
%LFIELDS_PER_FLUSH
== 0)
1309 flush_list(ls
, n
/LFIELDS_PER_FLUSH
- 1, LFIELDS_PER_FLUSH
);
1311 flush_list(ls
, n
/LFIELDS_PER_FLUSH
, n
%LFIELDS_PER_FLUSH
);
1315 static void recfield (LexState
*ls
) {
1316 /* recfield -> (NAME | '['exp1']') = exp1 */
1317 switch (ls
->token
) {
1319 code_string(ls
, checkname(ls
));
1328 default: luaX_error(ls
, "NAME or `[' expected");