diff options
Diffstat (limited to 'lparser.c')
-rw-r--r-- | lparser.c | 21 |
1 files changed, 12 insertions, 9 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lparser.c,v 2.81 2010/04/05 16:26:37 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 2.82 2010/04/05 16:35:37 roberto Exp roberto $ |
3 | ** Lua Parser | 3 | ** Lua Parser |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -670,15 +670,12 @@ static int explist1 (LexState *ls, expdesc *v) { | |||
670 | } | 670 | } |
671 | 671 | ||
672 | 672 | ||
673 | static void funcargs (LexState *ls, expdesc *f) { | 673 | static void funcargs (LexState *ls, expdesc *f, int line) { |
674 | FuncState *fs = ls->fs; | 674 | FuncState *fs = ls->fs; |
675 | expdesc args; | 675 | expdesc args; |
676 | int base, nparams; | 676 | int base, nparams; |
677 | int line = ls->linenumber; | ||
678 | switch (ls->t.token) { | 677 | switch (ls->t.token) { |
679 | case '(': { /* funcargs -> `(' [ explist1 ] `)' */ | 678 | case '(': { /* funcargs -> `(' [ explist1 ] `)' */ |
680 | if (line != ls->lastline) | ||
681 | luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)"); | ||
682 | luaX_next(ls); | 679 | luaX_next(ls); |
683 | if (ls->t.token == ')') /* arg list is empty? */ | 680 | if (ls->t.token == ')') /* arg list is empty? */ |
684 | args.k = VVOID; | 681 | args.k = VVOID; |
@@ -755,6 +752,7 @@ static void primaryexp (LexState *ls, expdesc *v) { | |||
755 | /* primaryexp -> | 752 | /* primaryexp -> |
756 | prefixexp { `.' NAME | `[' exp `]' | `:' NAME funcargs | funcargs } */ | 753 | prefixexp { `.' NAME | `[' exp `]' | `:' NAME funcargs | funcargs } */ |
757 | FuncState *fs = ls->fs; | 754 | FuncState *fs = ls->fs; |
755 | int line = ls->linenumber; | ||
758 | prefixexp(ls, v); | 756 | prefixexp(ls, v); |
759 | for (;;) { | 757 | for (;;) { |
760 | switch (ls->t.token) { | 758 | switch (ls->t.token) { |
@@ -774,12 +772,12 @@ static void primaryexp (LexState *ls, expdesc *v) { | |||
774 | luaX_next(ls); | 772 | luaX_next(ls); |
775 | checkname(ls, &key); | 773 | checkname(ls, &key); |
776 | luaK_self(fs, v, &key); | 774 | luaK_self(fs, v, &key); |
777 | funcargs(ls, v); | 775 | funcargs(ls, v, line); |
778 | break; | 776 | break; |
779 | } | 777 | } |
780 | case '(': case TK_STRING: case '{': { /* funcargs */ | 778 | case '(': case TK_STRING: case '{': { /* funcargs */ |
781 | luaK_exp2nextreg(fs, v); | 779 | luaK_exp2nextreg(fs, v); |
782 | funcargs(ls, v); | 780 | funcargs(ls, v, line); |
783 | break; | 781 | break; |
784 | } | 782 | } |
785 | default: return; | 783 | default: return; |
@@ -894,9 +892,10 @@ static BinOpr subexpr (LexState *ls, expdesc *v, unsigned int limit) { | |||
894 | enterlevel(ls); | 892 | enterlevel(ls); |
895 | uop = getunopr(ls->t.token); | 893 | uop = getunopr(ls->t.token); |
896 | if (uop != OPR_NOUNOPR) { | 894 | if (uop != OPR_NOUNOPR) { |
895 | int line = ls->linenumber; | ||
897 | luaX_next(ls); | 896 | luaX_next(ls); |
898 | subexpr(ls, v, UNARY_PRIORITY); | 897 | subexpr(ls, v, UNARY_PRIORITY); |
899 | luaK_prefix(ls->fs, uop, v); | 898 | luaK_prefix(ls->fs, uop, v, line); |
900 | } | 899 | } |
901 | else simpleexp(ls, v); | 900 | else simpleexp(ls, v); |
902 | /* expand while operators have priorities higher than `limit' */ | 901 | /* expand while operators have priorities higher than `limit' */ |
@@ -904,11 +903,12 @@ static BinOpr subexpr (LexState *ls, expdesc *v, unsigned int limit) { | |||
904 | while (op != OPR_NOBINOPR && priority[op].left > limit) { | 903 | while (op != OPR_NOBINOPR && priority[op].left > limit) { |
905 | expdesc v2; | 904 | expdesc v2; |
906 | BinOpr nextop; | 905 | BinOpr nextop; |
906 | int line = ls->linenumber; | ||
907 | luaX_next(ls); | 907 | luaX_next(ls); |
908 | luaK_infix(ls->fs, op, v); | 908 | luaK_infix(ls->fs, op, v); |
909 | /* read sub-expression with higher priority */ | 909 | /* read sub-expression with higher priority */ |
910 | nextop = subexpr(ls, &v2, priority[op].right); | 910 | nextop = subexpr(ls, &v2, priority[op].right); |
911 | luaK_posfix(ls->fs, op, v, &v2); | 911 | luaK_posfix(ls->fs, op, v, &v2, line); |
912 | op = nextop; | 912 | op = nextop; |
913 | } | 913 | } |
914 | leavelevel(ls); | 914 | leavelevel(ls); |
@@ -1346,6 +1346,9 @@ static void retstat (LexState *ls) { | |||
1346 | static int statement (LexState *ls) { | 1346 | static int statement (LexState *ls) { |
1347 | int line = ls->linenumber; /* may be needed for error messages */ | 1347 | int line = ls->linenumber; /* may be needed for error messages */ |
1348 | switch (ls->t.token) { | 1348 | switch (ls->t.token) { |
1349 | case ';': { /* stat -> <empty statement> */ | ||
1350 | return 0; | ||
1351 | } | ||
1349 | case TK_IF: { /* stat -> ifstat */ | 1352 | case TK_IF: { /* stat -> ifstat */ |
1350 | ifstat(ls, line); | 1353 | ifstat(ls, line); |
1351 | return 0; | 1354 | return 0; |