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("{",
|