aboutsummaryrefslogtreecommitdiff
path: root/lparser.c
diff options
context:
space:
mode:
Diffstat (limited to 'lparser.c')
-rw-r--r--lparser.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/lparser.c b/lparser.c
index 62c88fdb..1d603544 100644
--- a/lparser.c
+++ b/lparser.c
@@ -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
673static void funcargs (LexState *ls, expdesc *f) { 673static 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) {
1346static int statement (LexState *ls) { 1346static 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;