2003/07/07 04:44:17
[org.ibex.core.git] / src / org / xwt / js / Parser.java
index 9183c94..782c756 100644 (file)
@@ -311,21 +311,15 @@ class Parser extends Lexer implements ByteCodes {
         case ASSIGN_ADD: case ASSIGN_SUB: case ASSIGN_MUL: case ASSIGN_DIV: case ASSIGN_MOD: {
             b.add(parserLine, GET_PRESERVE);
             startExpr(b, -1);
-            b.add(parserLine, tok - 1);
+            // tok-1 is always s/^ASSIGN_// (0 is BITOR, 1 is ASSIGN_BITOR, etc) 
+            b.add(parserLine, tok - 1, tok-1==ADD ? new Integer(2) : null);
             b.add(parserLine, PUT);
             b.add(parserLine, SWAP);
             b.add(parserLine, POP);
             break;
         }
         case INC: case DEC: { // postfix
-            b.add(parserLine, GET_PRESERVE);
-            b.add(parserLine, LITERAL, new Integer(1));
-            b.add(parserLine, tok == INC ? ADD : SUB);
-            b.add(parserLine, PUT);
-            b.add(parserLine, SWAP);
-            b.add(parserLine, POP);
-            b.add(parserLine, LITERAL, new Integer(1));
-            b.add(parserLine, tok == INC ? SUB : ADD);
+            b.add(parserLine, tok, Boolean.FALSE);
             break;
         }
         case ASSIGN: {
@@ -384,12 +378,24 @@ class Parser extends Lexer implements ByteCodes {
             break;
         }
         case BITOR: case BITXOR: case BITAND: case SHEQ: case SHNE: case LSH:
-        case RSH: case URSH: case ADD: case MUL: case DIV: case MOD:
+        case RSH: case URSH: case MUL: case DIV: case MOD:
         case GT: case GE: case EQ: case NE: case LT: case LE: case SUB: {
             startExpr(b, precedence[tok]);
             b.add(parserLine, tok);
             break;
         }
+        case ADD: {
+            int count=1;
+            int nextTok;
+            do {
+                startExpr(b,precedence[tok]);
+                count++;
+                nextTok = getToken();
+            } while(nextTok == tok);
+            pushBackToken();
+            b.add(parserLine, tok, new Integer(count));
+            break;
+        }
         case OR: case AND: {
             b.add(parserLine, tok == AND ? b.JF : b.JT, new Integer(0));       // test to see if we can short-circuit
             int size = b.size();