diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-02-11 14:52:54 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-02-11 14:52:54 -0200 |
commit | 52aad0ab5937d4df6fe07aedbf9987f2f792698c (patch) | |
tree | 9598361f6d635751fe3eb93c66acd1520f2619af /lparser.c | |
parent | 74f1c3d025c6d8a714454470a953f383a1c6a641 (diff) | |
download | lua-52aad0ab5937d4df6fe07aedbf9987f2f792698c.tar.gz lua-52aad0ab5937d4df6fe07aedbf9987f2f792698c.tar.bz2 lua-52aad0ab5937d4df6fe07aedbf9987f2f792698c.zip |
removing implementation for better error messages (must rethink it...)
Diffstat (limited to 'lparser.c')
-rw-r--r-- | lparser.c | 45 |
1 files changed, 4 insertions, 41 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lparser.c,v 1.56 2000/01/25 18:44:21 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 1.57 2000/01/28 16:53:00 roberto Exp roberto $ |
3 | ** LL(1) Parser and code generator for Lua | 3 | ** LL(1) Parser and code generator for Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -63,8 +63,6 @@ typedef enum { | |||
63 | typedef struct vardesc { | 63 | typedef struct vardesc { |
64 | varkind k; | 64 | varkind k; |
65 | int info; | 65 | int info; |
66 | varkind prev_k; /* for debug information (NAMEs) */ | ||
67 | int prev_info; | ||
68 | } vardesc; | 66 | } vardesc; |
69 | 67 | ||
70 | 68 | ||
@@ -386,31 +384,6 @@ static void check_debugline (LexState *ls) { | |||
386 | } | 384 | } |
387 | 385 | ||
388 | 386 | ||
389 | static void code_setname (LexState *ls, const vardesc *v) { | ||
390 | if (ls->L->debug) { | ||
391 | switch (v->prev_k) { | ||
392 | case VGLOBAL: | ||
393 | code_oparg(ls, SETNAME, v->prev_info, 0); | ||
394 | code_byte(ls, -LUA_T_NGLOBAL); | ||
395 | break; | ||
396 | case VLOCAL: { | ||
397 | TaggedString *varname = ls->fs->localvar[v->prev_info]; | ||
398 | code_oparg(ls, SETNAME, string_constant(ls, ls->fs, varname), 0); | ||
399 | code_byte(ls, -LUA_T_NLOCAL); | ||
400 | break; | ||
401 | } | ||
402 | case VDOT: | ||
403 | code_oparg(ls, SETNAME, v->prev_info, 0); | ||
404 | code_byte(ls, -LUA_T_NDOT); | ||
405 | break; | ||
406 | default: /* VINDEXED or VEXP: no debug information */ | ||
407 | code_oparg(ls, SETNAME, 0, 0); | ||
408 | code_byte(ls, -LUA_T_NIL); | ||
409 | } | ||
410 | } | ||
411 | } | ||
412 | |||
413 | |||
414 | static void adjuststack (LexState *ls, int n) { | 387 | static void adjuststack (LexState *ls, int n) { |
415 | if (n > 0) | 388 | if (n > 0) |
416 | code_oparg(ls, POP, n, -n); | 389 | code_oparg(ls, POP, n, -n); |
@@ -485,19 +458,15 @@ static void lua_pushvar (LexState *ls, vardesc *var) { | |||
485 | assertglobal(ls, var->info); /* make sure that there is a global */ | 458 | assertglobal(ls, var->info); /* make sure that there is a global */ |
486 | break; | 459 | break; |
487 | case VDOT: | 460 | case VDOT: |
488 | code_setname(ls, var); | ||
489 | code_oparg(ls, GETDOTTED, var->info, 0); | 461 | code_oparg(ls, GETDOTTED, var->info, 0); |
490 | break; | 462 | break; |
491 | case VINDEXED: | 463 | case VINDEXED: |
492 | code_setname(ls, var); | ||
493 | code_opcode(ls, GETTABLE, -1); | 464 | code_opcode(ls, GETTABLE, -1); |
494 | break; | 465 | break; |
495 | case VEXP: | 466 | case VEXP: |
496 | close_exp(ls, var->info, 1); /* function must return 1 value */ | 467 | close_exp(ls, var->info, 1); /* function must return 1 value */ |
497 | break; | 468 | break; |
498 | } | 469 | } |
499 | var->prev_k = var->k; /* save previous var kind and info */ | ||
500 | var->prev_info = var->info; | ||
501 | var->k = VEXP; | 470 | var->k = VEXP; |
502 | var->info = 0; /* now this is a closed expression */ | 471 | var->info = 0; /* now this is a closed expression */ |
503 | } | 472 | } |
@@ -513,7 +482,6 @@ static void storevar (LexState *ls, const vardesc *var) { | |||
513 | assertglobal(ls, var->info); /* make sure that there is a global */ | 482 | assertglobal(ls, var->info); /* make sure that there is a global */ |
514 | break; | 483 | break; |
515 | case VINDEXED: | 484 | case VINDEXED: |
516 | code_setname(ls, var); | ||
517 | code_opcode(ls, SETTABLEPOP, -3); | 485 | code_opcode(ls, SETTABLEPOP, -3); |
518 | break; | 486 | break; |
519 | default: | 487 | default: |
@@ -749,7 +717,7 @@ static void explist (LexState *ls, listdesc *d) { | |||
749 | } | 717 | } |
750 | 718 | ||
751 | 719 | ||
752 | static int funcparams (LexState *ls, int slf, vardesc *v) { | 720 | static int funcparams (LexState *ls, int slf) { |
753 | FuncState *fs = ls->fs; | 721 | FuncState *fs = ls->fs; |
754 | int slevel = fs->stacksize - slf - 1; /* where is func in the stack */ | 722 | int slevel = fs->stacksize - slf - 1; /* where is func in the stack */ |
755 | switch (ls->token) { | 723 | switch (ls->token) { |
@@ -776,7 +744,6 @@ static int funcparams (LexState *ls, int slf, vardesc *v) { | |||
776 | luaY_error(ls, "function arguments expected"); | 744 | luaY_error(ls, "function arguments expected"); |
777 | break; | 745 | break; |
778 | } | 746 | } |
779 | code_setname(ls, v); | ||
780 | code_byte(ls, CALL); | 747 | code_byte(ls, CALL); |
781 | code_byte(ls, 0); /* save space for nresult */ | 748 | code_byte(ls, 0); /* save space for nresult */ |
782 | code_byte(ls, (Byte)slevel); | 749 | code_byte(ls, (Byte)slevel); |
@@ -808,19 +775,16 @@ static void var_or_func_tail (LexState *ls, vardesc *v) { | |||
808 | next(ls); | 775 | next(ls); |
809 | name = checkname(ls); | 776 | name = checkname(ls); |
810 | lua_pushvar(ls, v); /* `v' must be on stack */ | 777 | lua_pushvar(ls, v); /* `v' must be on stack */ |
811 | code_setname(ls, v); | ||
812 | code_oparg(ls, PUSHSELF, name, 1); | 778 | code_oparg(ls, PUSHSELF, name, 1); |
813 | v->prev_k = VDOT; /* ':' is syntactic sugar for '.' */ | ||
814 | v->prev_info = name; | ||
815 | v->k = VEXP; | 779 | v->k = VEXP; |
816 | v->info = funcparams(ls, 1, v); | 780 | v->info = funcparams(ls, 1); |
817 | break; | 781 | break; |
818 | } | 782 | } |
819 | 783 | ||
820 | case '(': case STRING: case '{': /* var_or_func_tail -> funcparams */ | 784 | case '(': case STRING: case '{': /* var_or_func_tail -> funcparams */ |
821 | lua_pushvar(ls, v); /* `v' must be on stack */ | 785 | lua_pushvar(ls, v); /* `v' must be on stack */ |
822 | v->k = VEXP; | 786 | v->k = VEXP; |
823 | v->info = funcparams(ls, 0, v); | 787 | v->info = funcparams(ls, 0); |
824 | break; | 788 | break; |
825 | 789 | ||
826 | default: return; /* should be follow... */ | 790 | default: return; /* should be follow... */ |
@@ -1203,7 +1167,6 @@ static int assignment (LexState *ls, vardesc *v, int nvars) { | |||
1203 | storevar(ls, v); | 1167 | storevar(ls, v); |
1204 | } | 1168 | } |
1205 | else { /* indexed var with values in between*/ | 1169 | else { /* indexed var with values in between*/ |
1206 | code_setname(ls, v); | ||
1207 | code_oparg(ls, SETTABLE, left+(nvars-1), -1); | 1170 | code_oparg(ls, SETTABLE, left+(nvars-1), -1); |
1208 | left += 2; /* table&index are not popped, because they aren't on top */ | 1171 | left += 2; /* table&index are not popped, because they aren't on top */ |
1209 | } | 1172 | } |