From b998d5e22da7a422a7eb9d2ccd2740621ab94c4d Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Fri, 6 Sep 2013 10:51:56 +0200 Subject: [PATCH] Add support for bizarro behavior Issue #62 --- acorn.js | 38 ++++++++---- index.html | 162 +++++++++++++++++++++++++++----------------------- test/tests.js | 65 ++++++++++++++++++++ 3 files changed, 179 insertions(+), 86 deletions(-) diff --git a/acorn.js b/acorn.js index 3be5cecb39..375d44b09e 100644 --- a/acorn.js +++ b/acorn.js @@ -534,7 +534,7 @@ } else if (ch > 8 && ch < 14) { ++tokPos; } else if (ch === 47) { // '/' - var next = input.charCodeAt(tokPos+1); + var next = input.charCodeAt(tokPos + 1); if (next === 42) { // '*' skipBlockComment(); } else if (next === 47) { // '/' @@ -563,60 +563,76 @@ // `tokRegexpAllowed` trick does not work. See `parseStatement`. function readToken_dot() { - var next = input.charCodeAt(tokPos+1); + var next = input.charCodeAt(tokPos + 1); if (next >= 48 && next <= 57) return readNumber(true); ++tokPos; return finishToken(_dot); } function readToken_slash() { // '/' - var next = input.charCodeAt(tokPos+1); + var next = input.charCodeAt(tokPos + 1); if (tokRegexpAllowed) {++tokPos; return readRegexp();} if (next === 61) return finishOp(_assign, 2); return finishOp(_slash, 1); } function readToken_mult_modulo() { // '%*' - var next = input.charCodeAt(tokPos+1); + var next = input.charCodeAt(tokPos + 1); if (next === 61) return finishOp(_assign, 2); return finishOp(_bin10, 1); } function readToken_pipe_amp(code) { // '|&' - var next = input.charCodeAt(tokPos+1); + var next = input.charCodeAt(tokPos + 1); if (next === code) return finishOp(code === 124 ? _bin1 : _bin2, 2); if (next === 61) return finishOp(_assign, 2); return finishOp(code === 124 ? _bin3 : _bin5, 1); } function readToken_caret() { // '^' - var next = input.charCodeAt(tokPos+1); + var next = input.charCodeAt(tokPos + 1); if (next === 61) return finishOp(_assign, 2); return finishOp(_bin4, 1); } function readToken_plus_min(code) { // '+-' - var next = input.charCodeAt(tokPos+1); - if (next === code) return finishOp(_incdec, 2); + var next = input.charCodeAt(tokPos + 1); + if (next === code) { + if (next == 45 && input.charCodeAt(tokPos + 2) == 62 && lastEnd < tokLineStart) { + // A '-->' line comment + tokPos += 3; + skipLineComment(); + skipSpace(); + return readToken(); + } + return finishOp(_incdec, 2); + } if (next === 61) return finishOp(_assign, 2); return finishOp(_plusmin, 1); } function readToken_lt_gt(code) { // '<>' - var next = input.charCodeAt(tokPos+1); + var next = input.charCodeAt(tokPos + 1); var size = 1; if (next === code) { size = code === 62 && input.charCodeAt(tokPos+2) === 62 ? 3 : 2; if (input.charCodeAt(tokPos + size) === 61) return finishOp(_assign, size + 1); return finishOp(_bin8, size); } + if (next == 33 && code == 60 && input.charCodeAt(tokPos + 2) == 45 && input.charCodeAt(tokPos + 3) == 45) { + // '' line comment

        tokPos += 3;
+        skipLineComment();
+        skipSpace();
+        return readToken();
+      }
+      return finishOp(_incdec, 2);
+    }
     if (next === 61) return finishOp(_assign, 2);
     return finishOp(_plusmin, 1);
   }
 
   function readToken_lt_gt(code) { // '<>'
-    var next = input.charCodeAt(tokPos+1);
+    var next = input.charCodeAt(tokPos + 1);
     var size = 1;
     if (next === code) {
       size = code === 62 && input.charCodeAt(tokPos+2) === 62 ? 3 : 2;
       if (input.charCodeAt(tokPos + size) === 61) return finishOp(_assign, size + 1);
       return finishOp(_bin8, size);
     }
+    if (next == 33 && code == 60 && input.charCodeAt(tokPos + 2) == 45 && input.charCodeAt(tokPos + 3) == 45) {

'10;\n --> nothing", { + type: "Program", + body: [ + { + type: "ExpressionStatement", + expression: { + type: "AssignmentExpression", + operator: "=", + left: { + type: "Identifier", + name: "x" + }, + right: { + type: "BinaryExpression", + left: { + type: "UpdateExpression", + operator: "--", + prefix: false, + argument: { + type: "Identifier", + name: "y" + } + }, + operator: ">", + right: { + type: "Literal", + value: 10 + } + } + } + } + ] +}); + // Failure tests testFail("{",