From 7922f818b7c1c9d72f92e3ebe95401752b67a180 Mon Sep 17 00:00:00 2001 From: Johnathan Leppert Date: Tue, 22 May 2012 17:02:56 -0700 Subject: [PATCH] Fixes #28 --- lib/parser.js | 968 +++++++++++++++++++++++++------------------------- src/build.js | 9 +- 2 files changed, 491 insertions(+), 486 deletions(-) diff --git a/lib/parser.js b/lib/parser.js index a7c6baad..869a614d 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -77,9 +77,9 @@ var parser = (function(){ startRule = "body"; } - var pos = 0; + var pos = { offset: 0, line: 1, column: 1, seenCR: false }; var reportFailures = 0; - var rightmostFailuresPos = 0; + var rightmostFailuresPos = { offset: 0, line: 1, column: 1, seenCR: false }; var rightmostFailuresExpected = []; function padLeft(input, padding, length) { @@ -109,13 +109,43 @@ var parser = (function(){ return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length); } + function clone(object) { + var result = {}; + for (var key in object) { + result[key] = object[key]; + } + return result; + } + + function advance(pos, n) { + var endOffset = pos.offset + n; + + for (var offset = pos.offset; offset < endOffset; offset++) { + var ch = input.charAt(offset); + if (ch === "\n") { + if (!pos.seenCR) { pos.line++; } + pos.column = 1; + pos.seenCR = false; + } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") { + pos.line++; + pos.column = 1; + pos.seenCR = true; + } else { + pos.column++; + pos.seenCR = false; + } + } + + pos.offset += n; + } + function matchFailed(failure) { - if (pos < rightmostFailuresPos) { + if (pos.offset < rightmostFailuresPos.offset) { return; } - if (pos > rightmostFailuresPos) { - rightmostFailuresPos = pos; + if (pos.offset > rightmostFailuresPos.offset) { + rightmostFailuresPos = clone(pos); rightmostFailuresExpected = []; } @@ -126,7 +156,7 @@ var parser = (function(){ var result0, result1; var pos0; - pos0 = pos; + pos0 = clone(pos); result0 = []; result1 = parse_part(); while (result1 !== null) { @@ -134,10 +164,10 @@ var parser = (function(){ result1 = parse_part(); } if (result0 !== null) { - result0 = (function(offset, p) { return ["body"].concat(p) })(pos0, result0); + result0 = (function(offset, line, column, p) { return ["body"].concat(p) })(pos0.offset, pos0.line, pos0.column, result0); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } return result0; } @@ -169,8 +199,8 @@ var parser = (function(){ var pos0, pos1; reportFailures++; - pos0 = pos; - pos1 = pos; + pos0 = clone(pos); + pos1 = clone(pos); result0 = parse_sec_tag_start(); if (result0 !== null) { result1 = []; @@ -188,46 +218,46 @@ var parser = (function(){ if (result4 !== null) { result5 = parse_end_tag(); if (result5 !== null) { - result6 = (function(offset, t, b, e, n) { return t[1].text === n.text;})(pos, result0, result3, result4, result5) ? "" : null; + result6 = (function(offset, line, column, t, b, e, n) { return t[1].text === n.text;})(pos.offset, pos.line, pos.column, result0, result3, result4, result5) ? "" : null; if (result6 !== null) { result0 = [result0, result1, result2, result3, result4, result5, result6]; } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, t, b, e, n) { e.push(["param", ["literal", "block"], b]); t.push(e); return t })(pos0, result0[0], result0[3], result0[4], result0[5]); + result0 = (function(offset, line, column, t, b, e, n) { e.push(["param", ["literal", "block"], b]); t.push(e); return t })(pos0.offset, pos0.line, pos0.column, result0[0], result0[3], result0[4], result0[5]); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } if (result0 === null) { - pos0 = pos; - pos1 = pos; + pos0 = clone(pos); + pos1 = clone(pos); result0 = parse_sec_tag_start(); if (result0 !== null) { result1 = []; @@ -237,9 +267,9 @@ var parser = (function(){ result2 = parse_ws(); } if (result1 !== null) { - if (input.charCodeAt(pos) === 47) { + if (input.charCodeAt(pos.offset) === 47) { result2 = "/"; - pos++; + advance(pos, 1); } else { result2 = null; if (reportFailures === 0) { @@ -252,25 +282,25 @@ var parser = (function(){ result0 = [result0, result1, result2, result3]; } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, t) { t.push(["bodies"]); return t })(pos0, result0[0]); + result0 = (function(offset, line, column, t) { t.push(["bodies"]); return t })(pos0.offset, pos0.line, pos0.column, result0[0]); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } } reportFailures--; @@ -284,13 +314,13 @@ var parser = (function(){ var result0, result1, result2, result3, result4, result5; var pos0, pos1; - pos0 = pos; - pos1 = pos; + pos0 = clone(pos); + pos1 = clone(pos); result0 = parse_ld(); if (result0 !== null) { - if (/^[#?^<+@%]/.test(input.charAt(pos))) { - result1 = input.charAt(pos); - pos++; + if (/^[#?^<+@%]/.test(input.charAt(pos.offset))) { + result1 = input.charAt(pos.offset); + advance(pos, 1); } else { result1 = null; if (reportFailures === 0) { @@ -314,33 +344,33 @@ var parser = (function(){ result0 = [result0, result1, result2, result3, result4, result5]; } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, t, n, c, p) { return [t, n, c, p] })(pos0, result0[1], result0[3], result0[4], result0[5]); + result0 = (function(offset, line, column, t, n, c, p) { return [t, n, c, p] })(pos0.offset, pos0.line, pos0.column, result0[1], result0[3], result0[4], result0[5]); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } return result0; } @@ -350,13 +380,13 @@ var parser = (function(){ var pos0, pos1; reportFailures++; - pos0 = pos; - pos1 = pos; + pos0 = clone(pos); + pos1 = clone(pos); result0 = parse_ld(); if (result0 !== null) { - if (input.charCodeAt(pos) === 47) { + if (input.charCodeAt(pos.offset) === 47) { result1 = "/"; - pos++; + advance(pos, 1); } else { result1 = null; if (reportFailures === 0) { @@ -385,33 +415,33 @@ var parser = (function(){ result0 = [result0, result1, result2, result3, result4, result5]; } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, n) { return n })(pos0, result0[3]); + result0 = (function(offset, line, column, n) { return n })(pos0.offset, pos0.line, pos0.column, result0[3]); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } reportFailures--; if (reportFailures === 0 && result0 === null) { @@ -424,12 +454,12 @@ var parser = (function(){ var result0, result1; var pos0, pos1, pos2; - pos0 = pos; - pos1 = pos; - pos2 = pos; - if (input.charCodeAt(pos) === 58) { + pos0 = clone(pos); + pos1 = clone(pos); + pos2 = clone(pos); + if (input.charCodeAt(pos.offset) === 58) { result0 = ":"; - pos++; + advance(pos, 1); } else { result0 = null; if (reportFailures === 0) { @@ -442,24 +472,24 @@ var parser = (function(){ result0 = [result0, result1]; } else { result0 = null; - pos = pos2; + pos = clone(pos2); } } else { result0 = null; - pos = pos2; + pos = clone(pos2); } if (result0 !== null) { - result0 = (function(offset, n) {return n})(pos1, result0[1]); + result0 = (function(offset, line, column, n) {return n})(pos1.offset, pos1.line, pos1.column, result0[1]); } if (result0 === null) { - pos = pos1; + pos = clone(pos1); } result0 = result0 !== null ? result0 : ""; if (result0 !== null) { - result0 = (function(offset, n) { return n ? ["context", n] : ["context"] })(pos0, result0); + result0 = (function(offset, line, column, n) { return n ? ["context", n] : ["context"] })(pos0.offset, pos0.line, pos0.column, result0); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } return result0; } @@ -469,10 +499,10 @@ var parser = (function(){ var pos0, pos1, pos2; reportFailures++; - pos0 = pos; + pos0 = clone(pos); result0 = []; - pos1 = pos; - pos2 = pos; + pos1 = clone(pos); + pos2 = clone(pos); result2 = parse_ws(); if (result2 !== null) { result1 = []; @@ -486,9 +516,9 @@ var parser = (function(){ if (result1 !== null) { result2 = parse_key(); if (result2 !== null) { - if (input.charCodeAt(pos) === 61) { + if (input.charCodeAt(pos.offset) === 61) { result3 = "="; - pos++; + advance(pos, 1); } else { result3 = null; if (reportFailures === 0) { @@ -504,30 +534,30 @@ var parser = (function(){ result1 = [result1, result2, result3, result4]; } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } if (result1 !== null) { - result1 = (function(offset, k, v) {return ["param", ["literal", k], v]})(pos1, result1[1], result1[3]); + result1 = (function(offset, line, column, k, v) {return ["param", ["literal", k], v]})(pos1.offset, pos1.line, pos1.column, result1[1], result1[3]); } if (result1 === null) { - pos = pos1; + pos = clone(pos1); } while (result1 !== null) { result0.push(result1); - pos1 = pos; - pos2 = pos; + pos1 = clone(pos); + pos2 = clone(pos); result2 = parse_ws(); if (result2 !== null) { result1 = []; @@ -541,9 +571,9 @@ var parser = (function(){ if (result1 !== null) { result2 = parse_key(); if (result2 !== null) { - if (input.charCodeAt(pos) === 61) { + if (input.charCodeAt(pos.offset) === 61) { result3 = "="; - pos++; + advance(pos, 1); } else { result3 = null; if (reportFailures === 0) { @@ -559,32 +589,32 @@ var parser = (function(){ result1 = [result1, result2, result3, result4]; } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } if (result1 !== null) { - result1 = (function(offset, k, v) {return ["param", ["literal", k], v]})(pos1, result1[1], result1[3]); + result1 = (function(offset, line, column, k, v) {return ["param", ["literal", k], v]})(pos1.offset, pos1.line, pos1.column, result1[1], result1[3]); } if (result1 === null) { - pos = pos1; + pos = clone(pos1); } } if (result0 !== null) { - result0 = (function(offset, p) { return ["params"].concat(p) })(pos0, result0); + result0 = (function(offset, line, column, p) { return ["params"].concat(p) })(pos0.offset, pos0.line, pos0.column, result0); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } reportFailures--; if (reportFailures === 0 && result0 === null) { @@ -598,15 +628,15 @@ var parser = (function(){ var pos0, pos1, pos2; reportFailures++; - pos0 = pos; + pos0 = clone(pos); result0 = []; - pos1 = pos; - pos2 = pos; + pos1 = clone(pos); + pos2 = clone(pos); result1 = parse_ld(); if (result1 !== null) { - if (input.charCodeAt(pos) === 58) { + if (input.charCodeAt(pos.offset) === 58) { result2 = ":"; - pos++; + advance(pos, 1); } else { result2 = null; if (reportFailures === 0) { @@ -623,39 +653,39 @@ var parser = (function(){ result1 = [result1, result2, result3, result4, result5]; } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } if (result1 !== null) { - result1 = (function(offset, k, v) {return ["param", ["literal", k], v]})(pos1, result1[2], result1[4]); + result1 = (function(offset, line, column, k, v) {return ["param", ["literal", k], v]})(pos1.offset, pos1.line, pos1.column, result1[2], result1[4]); } if (result1 === null) { - pos = pos1; + pos = clone(pos1); } while (result1 !== null) { result0.push(result1); - pos1 = pos; - pos2 = pos; + pos1 = clone(pos); + pos2 = clone(pos); result1 = parse_ld(); if (result1 !== null) { - if (input.charCodeAt(pos) === 58) { + if (input.charCodeAt(pos.offset) === 58) { result2 = ":"; - pos++; + advance(pos, 1); } else { result2 = null; if (reportFailures === 0) { @@ -672,36 +702,36 @@ var parser = (function(){ result1 = [result1, result2, result3, result4, result5]; } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } if (result1 !== null) { - result1 = (function(offset, k, v) {return ["param", ["literal", k], v]})(pos1, result1[2], result1[4]); + result1 = (function(offset, line, column, k, v) {return ["param", ["literal", k], v]})(pos1.offset, pos1.line, pos1.column, result1[2], result1[4]); } if (result1 === null) { - pos = pos1; + pos = clone(pos1); } } if (result0 !== null) { - result0 = (function(offset, p) { return ["bodies"].concat(p) })(pos0, result0); + result0 = (function(offset, line, column, p) { return ["bodies"].concat(p) })(pos0.offset, pos0.line, pos0.column, result0); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } reportFailures--; if (reportFailures === 0 && result0 === null) { @@ -715,8 +745,8 @@ var parser = (function(){ var pos0, pos1; reportFailures++; - pos0 = pos; - pos1 = pos; + pos0 = clone(pos); + pos1 = clone(pos); result0 = parse_ld(); if (result0 !== null) { result1 = parse_identifier(); @@ -728,25 +758,25 @@ var parser = (function(){ result0 = [result0, result1, result2, result3]; } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, n, f) { return ["reference", n, f] })(pos0, result0[1], result0[2]); + result0 = (function(offset, line, column, n, f) { return ["reference", n, f] })(pos0.offset, pos0.line, pos0.column, result0[1], result0[2]); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } reportFailures--; if (reportFailures === 0 && result0 === null) { @@ -760,13 +790,13 @@ var parser = (function(){ var pos0, pos1, pos2; reportFailures++; - pos0 = pos; - pos1 = pos; + pos0 = clone(pos); + pos1 = clone(pos); result0 = parse_ld(); if (result0 !== null) { - if (input.charCodeAt(pos) === 62) { + if (input.charCodeAt(pos.offset) === 62) { result1 = ">"; - pos++; + advance(pos, 1); } else { result1 = null; if (reportFailures === 0) { @@ -774,13 +804,13 @@ var parser = (function(){ } } if (result1 !== null) { - pos2 = pos; + pos2 = clone(pos); result2 = parse_key(); if (result2 !== null) { - result2 = (function(offset, k) {return ["literal", k]})(pos2, result2); + result2 = (function(offset, line, column, k) {return ["literal", k]})(pos2.offset, pos2.line, pos2.column, result2); } if (result2 === null) { - pos = pos2; + pos = clone(pos2); } if (result2 === null) { result2 = parse_inline(); @@ -797,9 +827,9 @@ var parser = (function(){ result6 = parse_ws(); } if (result5 !== null) { - if (input.charCodeAt(pos) === 47) { + if (input.charCodeAt(pos.offset) === 47) { result6 = "/"; - pos++; + advance(pos, 1); } else { result6 = null; if (reportFailures === 0) { @@ -812,41 +842,41 @@ var parser = (function(){ result0 = [result0, result1, result2, result3, result4, result5, result6, result7]; } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, n, c, p) { return ["partial", n, c, p] })(pos0, result0[2], result0[3], result0[4]); + result0 = (function(offset, line, column, n, c, p) { return ["partial", n, c, p] })(pos0.offset, pos0.line, pos0.column, result0[2], result0[3], result0[4]); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } reportFailures--; if (reportFailures === 0 && result0 === null) { @@ -860,13 +890,13 @@ var parser = (function(){ var pos0, pos1, pos2; reportFailures++; - pos0 = pos; + pos0 = clone(pos); result0 = []; - pos1 = pos; - pos2 = pos; - if (input.charCodeAt(pos) === 124) { + pos1 = clone(pos); + pos2 = clone(pos); + if (input.charCodeAt(pos.offset) === 124) { result1 = "|"; - pos++; + advance(pos, 1); } else { result1 = null; if (reportFailures === 0) { @@ -879,25 +909,25 @@ var parser = (function(){ result1 = [result1, result2]; } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } if (result1 !== null) { - result1 = (function(offset, n) {return n})(pos1, result1[1]); + result1 = (function(offset, line, column, n) {return n})(pos1.offset, pos1.line, pos1.column, result1[1]); } if (result1 === null) { - pos = pos1; + pos = clone(pos1); } while (result1 !== null) { result0.push(result1); - pos1 = pos; - pos2 = pos; - if (input.charCodeAt(pos) === 124) { + pos1 = clone(pos); + pos2 = clone(pos); + if (input.charCodeAt(pos.offset) === 124) { result1 = "|"; - pos++; + advance(pos, 1); } else { result1 = null; if (reportFailures === 0) { @@ -910,24 +940,24 @@ var parser = (function(){ result1 = [result1, result2]; } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } if (result1 !== null) { - result1 = (function(offset, n) {return n})(pos1, result1[1]); + result1 = (function(offset, line, column, n) {return n})(pos1.offset, pos1.line, pos1.column, result1[1]); } if (result1 === null) { - pos = pos1; + pos = clone(pos1); } } if (result0 !== null) { - result0 = (function(offset, f) { return ["filters"].concat(f) })(pos0, result0); + result0 = (function(offset, line, column, f) { return ["filters"].concat(f) })(pos0.offset, pos0.line, pos0.column, result0); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } reportFailures--; if (reportFailures === 0 && result0 === null) { @@ -941,13 +971,13 @@ var parser = (function(){ var pos0, pos1; reportFailures++; - pos0 = pos; - pos1 = pos; + pos0 = clone(pos); + pos1 = clone(pos); result0 = parse_ld(); if (result0 !== null) { - if (input.charCodeAt(pos) === 126) { + if (input.charCodeAt(pos.offset) === 126) { result1 = "~"; - pos++; + advance(pos, 1); } else { result1 = null; if (reportFailures === 0) { @@ -962,25 +992,25 @@ var parser = (function(){ result0 = [result0, result1, result2, result3]; } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, k) { return ["special", k] })(pos0, result0[2]); + result0 = (function(offset, line, column, k) { return ["special", k] })(pos0.offset, pos0.line, pos0.column, result0[2]); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } reportFailures--; if (reportFailures === 0 && result0 === null) { @@ -994,22 +1024,22 @@ var parser = (function(){ var pos0; reportFailures++; - pos0 = pos; + pos0 = clone(pos); result0 = parse_path(); if (result0 !== null) { - result0 = (function(offset, p) { var arr = ["path"].concat(p); arr.text = p[1].join('.'); return arr; })(pos0, result0); + result0 = (function(offset, line, column, p) { var arr = ["path"].concat(p); arr.text = p[1].join('.'); return arr; })(pos0.offset, pos0.line, pos0.column, result0); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } if (result0 === null) { - pos0 = pos; + pos0 = clone(pos); result0 = parse_key(); if (result0 !== null) { - result0 = (function(offset, k) { var arr = ["key", k]; arr.text = k; return arr; })(pos0, result0); + result0 = (function(offset, line, column, k) { var arr = ["key", k]; arr.text = k; return arr; })(pos0.offset, pos0.line, pos0.column, result0); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } } reportFailures--; @@ -1024,8 +1054,8 @@ var parser = (function(){ var pos0, pos1; reportFailures++; - pos0 = pos; - pos1 = pos; + pos0 = clone(pos); + pos1 = clone(pos); result0 = parse_key(); result0 = result0 !== null ? result0 : ""; if (result0 !== null) { @@ -1043,30 +1073,30 @@ var parser = (function(){ result0 = [result0, result1]; } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, k, d) { + result0 = (function(offset, line, column, k, d) { d = d[0]; if (k && d) { d.unshift(k); return [false, d];; } return [true, d]; - })(pos0, result0[0], result0[1]); + })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } if (result0 === null) { - pos0 = pos; - if (input.charCodeAt(pos) === 46) { + pos0 = clone(pos); + if (input.charCodeAt(pos.offset) === 46) { result0 = "."; - pos++; + advance(pos, 1); } else { result0 = null; if (reportFailures === 0) { @@ -1074,10 +1104,10 @@ var parser = (function(){ } } if (result0 !== null) { - result0 = (function(offset) { return [true, []] })(pos0); + result0 = (function(offset, line, column) { return [true, []] })(pos0.offset, pos0.line, pos0.column); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } } reportFailures--; @@ -1092,11 +1122,11 @@ var parser = (function(){ var pos0, pos1; reportFailures++; - pos0 = pos; - pos1 = pos; - if (/^[a-zA-Z_$]/.test(input.charAt(pos))) { - result0 = input.charAt(pos); - pos++; + pos0 = clone(pos); + pos1 = clone(pos); + if (/^[a-zA-Z_$]/.test(input.charAt(pos.offset))) { + result0 = input.charAt(pos.offset); + advance(pos, 1); } else { result0 = null; if (reportFailures === 0) { @@ -1105,9 +1135,9 @@ var parser = (function(){ } if (result0 !== null) { result1 = []; - if (/^[0-9a-zA-Z_$]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; + if (/^[0-9a-zA-Z_$]/.test(input.charAt(pos.offset))) { + result2 = input.charAt(pos.offset); + advance(pos, 1); } else { result2 = null; if (reportFailures === 0) { @@ -1116,9 +1146,9 @@ var parser = (function(){ } while (result2 !== null) { result1.push(result2); - if (/^[0-9a-zA-Z_$]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; + if (/^[0-9a-zA-Z_$]/.test(input.charAt(pos.offset))) { + result2 = input.charAt(pos.offset); + advance(pos, 1); } else { result2 = null; if (reportFailures === 0) { @@ -1130,17 +1160,17 @@ var parser = (function(){ result0 = [result0, result1]; } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, h, t) { return h + t.join('') })(pos0, result0[0], result0[1]); + result0 = (function(offset, line, column, h, t) { return h + t.join('') })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } reportFailures--; if (reportFailures === 0 && result0 === null) { @@ -1154,13 +1184,13 @@ var parser = (function(){ var pos0, pos1, pos2, pos3; reportFailures++; - pos0 = pos; - pos1 = pos; - pos2 = pos; - pos3 = pos; - if (input.charCodeAt(pos) === 46) { + pos0 = clone(pos); + pos1 = clone(pos); + pos2 = clone(pos); + pos3 = clone(pos); + if (input.charCodeAt(pos.offset) === 46) { result1 = "."; - pos++; + advance(pos, 1); } else { result1 = null; if (reportFailures === 0) { @@ -1173,27 +1203,27 @@ var parser = (function(){ result1 = [result1, result2]; } else { result1 = null; - pos = pos3; + pos = clone(pos3); } } else { result1 = null; - pos = pos3; + pos = clone(pos3); } if (result1 !== null) { - result1 = (function(offset, k) {return k})(pos2, result1[1]); + result1 = (function(offset, line, column, k) {return k})(pos2.offset, pos2.line, pos2.column, result1[1]); } if (result1 === null) { - pos = pos2; + pos = clone(pos2); } if (result1 !== null) { result0 = []; while (result1 !== null) { result0.push(result1); - pos2 = pos; - pos3 = pos; - if (input.charCodeAt(pos) === 46) { + pos2 = clone(pos); + pos3 = clone(pos); + if (input.charCodeAt(pos.offset) === 46) { result1 = "."; - pos++; + advance(pos, 1); } else { result1 = null; if (reportFailures === 0) { @@ -1206,17 +1236,17 @@ var parser = (function(){ result1 = [result1, result2]; } else { result1 = null; - pos = pos3; + pos = clone(pos3); } } else { result1 = null; - pos = pos3; + pos = clone(pos3); } if (result1 !== null) { - result1 = (function(offset, k) {return k})(pos2, result1[1]); + result1 = (function(offset, line, column, k) {return k})(pos2.offset, pos2.line, pos2.column, result1[1]); } if (result1 === null) { - pos = pos2; + pos = clone(pos2); } } } else { @@ -1229,17 +1259,17 @@ var parser = (function(){ result0 = [result0, result1]; } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, d, a) { if (a) { return d.concat(a); } else { return d; } })(pos0, result0[0], result0[1]); + result0 = (function(offset, line, column, d, a) { if (a) { return d.concat(a); } else { return d; } })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } reportFailures--; if (reportFailures === 0 && result0 === null) { @@ -1253,13 +1283,13 @@ var parser = (function(){ var pos0, pos1, pos2, pos3; reportFailures++; - pos0 = pos; - pos1 = pos; - pos2 = pos; - pos3 = pos; - if (input.charCodeAt(pos) === 91) { + pos0 = clone(pos); + pos1 = clone(pos); + pos2 = clone(pos); + pos3 = clone(pos); + if (input.charCodeAt(pos.offset) === 91) { result0 = "["; - pos++; + advance(pos, 1); } else { result0 = null; if (reportFailures === 0) { @@ -1267,9 +1297,9 @@ var parser = (function(){ } } if (result0 !== null) { - if (/^[0-9]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; + if (/^[0-9]/.test(input.charAt(pos.offset))) { + result2 = input.charAt(pos.offset); + advance(pos, 1); } else { result2 = null; if (reportFailures === 0) { @@ -1280,9 +1310,9 @@ var parser = (function(){ result1 = []; while (result2 !== null) { result1.push(result2); - if (/^[0-9]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; + if (/^[0-9]/.test(input.charAt(pos.offset))) { + result2 = input.charAt(pos.offset); + advance(pos, 1); } else { result2 = null; if (reportFailures === 0) { @@ -1294,9 +1324,9 @@ var parser = (function(){ result1 = null; } if (result1 !== null) { - if (input.charCodeAt(pos) === 93) { + if (input.charCodeAt(pos.offset) === 93) { result2 = "]"; - pos++; + advance(pos, 1); } else { result2 = null; if (reportFailures === 0) { @@ -1307,21 +1337,21 @@ var parser = (function(){ result0 = [result0, result1, result2]; } else { result0 = null; - pos = pos3; + pos = clone(pos3); } } else { result0 = null; - pos = pos3; + pos = clone(pos3); } } else { result0 = null; - pos = pos3; + pos = clone(pos3); } if (result0 !== null) { - result0 = (function(offset, a) {return a.join('')})(pos2, result0[1]); + result0 = (function(offset, line, column, a) {return a.join('')})(pos2.offset, pos2.line, pos2.column, result0[1]); } if (result0 === null) { - pos = pos2; + pos = clone(pos2); } if (result0 !== null) { result1 = parse_nestedKey(); @@ -1330,17 +1360,17 @@ var parser = (function(){ result0 = [result0, result1]; } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, i, nk) { if(nk) { nk.unshift(i); } else {nk = [i] } return nk; })(pos0, result0[0], result0[1]); + result0 = (function(offset, line, column, i, nk) { if(nk) { nk.unshift(i); } else {nk = [i] } return nk; })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } reportFailures--; if (reportFailures === 0 && result0 === null) { @@ -1354,11 +1384,11 @@ var parser = (function(){ var pos0, pos1; reportFailures++; - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 34) { + pos0 = clone(pos); + pos1 = clone(pos); + if (input.charCodeAt(pos.offset) === 34) { result0 = "\""; - pos++; + advance(pos, 1); } else { result0 = null; if (reportFailures === 0) { @@ -1366,9 +1396,9 @@ var parser = (function(){ } } if (result0 !== null) { - if (input.charCodeAt(pos) === 34) { + if (input.charCodeAt(pos.offset) === 34) { result1 = "\""; - pos++; + advance(pos, 1); } else { result1 = null; if (reportFailures === 0) { @@ -1379,24 +1409,24 @@ var parser = (function(){ result0 = [result0, result1]; } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset) { return ["literal", ""] })(pos0); + result0 = (function(offset, line, column) { return ["literal", ""] })(pos0.offset, pos0.line, pos0.column); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } if (result0 === null) { - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 34) { + pos0 = clone(pos); + pos1 = clone(pos); + if (input.charCodeAt(pos.offset) === 34) { result0 = "\""; - pos++; + advance(pos, 1); } else { result0 = null; if (reportFailures === 0) { @@ -1406,9 +1436,9 @@ var parser = (function(){ if (result0 !== null) { result1 = parse_literal(); if (result1 !== null) { - if (input.charCodeAt(pos) === 34) { + if (input.charCodeAt(pos.offset) === 34) { result2 = "\""; - pos++; + advance(pos, 1); } else { result2 = null; if (reportFailures === 0) { @@ -1419,28 +1449,28 @@ var parser = (function(){ result0 = [result0, result1, result2]; } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, l) { return ["literal", l] })(pos0, result0[1]); + result0 = (function(offset, line, column, l) { return ["literal", l] })(pos0.offset, pos0.line, pos0.column, result0[1]); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } if (result0 === null) { - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 34) { + pos0 = clone(pos); + pos1 = clone(pos); + if (input.charCodeAt(pos.offset) === 34) { result0 = "\""; - pos++; + advance(pos, 1); } else { result0 = null; if (reportFailures === 0) { @@ -1459,9 +1489,9 @@ var parser = (function(){ result1 = null; } if (result1 !== null) { - if (input.charCodeAt(pos) === 34) { + if (input.charCodeAt(pos.offset) === 34) { result2 = "\""; - pos++; + advance(pos, 1); } else { result2 = null; if (reportFailures === 0) { @@ -1472,21 +1502,21 @@ var parser = (function(){ result0 = [result0, result1, result2]; } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, p) { return ["body"].concat(p) })(pos0, result0[1]); + result0 = (function(offset, line, column, p) { return ["body"].concat(p) })(pos0.offset, pos0.line, pos0.column, result0[1]); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } } } @@ -1505,13 +1535,13 @@ var parser = (function(){ if (result0 === null) { result0 = parse_reference(); if (result0 === null) { - pos0 = pos; + pos0 = clone(pos); result0 = parse_literal(); if (result0 !== null) { - result0 = (function(offset, l) { return ["buffer", l] })(pos0, result0); + result0 = (function(offset, line, column, l) { return ["buffer", l] })(pos0.offset, pos0.line, pos0.column, result0); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } } } @@ -1523,8 +1553,8 @@ var parser = (function(){ var pos0, pos1, pos2, pos3; reportFailures++; - pos0 = pos; - pos1 = pos; + pos0 = clone(pos); + pos1 = clone(pos); result0 = parse_eol(); if (result0 !== null) { result1 = []; @@ -1537,23 +1567,23 @@ var parser = (function(){ result0 = [result0, result1]; } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, e, w) { return ["format", e, w.join('')] })(pos0, result0[0], result0[1]); + result0 = (function(offset, line, column, e, w) { return ["format", e, w.join('')] })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } if (result0 === null) { - pos0 = pos; - pos1 = pos; - pos2 = pos; - pos3 = pos; + pos0 = clone(pos); + pos1 = clone(pos); + pos2 = clone(pos); + pos3 = clone(pos); reportFailures++; result1 = parse_tag(); reportFailures--; @@ -1561,10 +1591,10 @@ var parser = (function(){ result1 = ""; } else { result1 = null; - pos = pos3; + pos = clone(pos3); } if (result1 !== null) { - pos3 = pos; + pos3 = clone(pos); reportFailures++; result2 = parse_eol(); reportFailures--; @@ -1572,10 +1602,10 @@ var parser = (function(){ result2 = ""; } else { result2 = null; - pos = pos3; + pos = clone(pos3); } if (result2 !== null) { - pos3 = pos; + pos3 = clone(pos); reportFailures++; result3 = parse_comment(); reportFailures--; @@ -1583,12 +1613,12 @@ var parser = (function(){ result3 = ""; } else { result3 = null; - pos = pos3; + pos = clone(pos3); } if (result3 !== null) { - if (input.length > pos) { - result4 = input.charAt(pos); - pos++; + if (input.length > pos.offset) { + result4 = input.charAt(pos.offset); + advance(pos, 1); } else { result4 = null; if (reportFailures === 0) { @@ -1599,33 +1629,33 @@ var parser = (function(){ result1 = [result1, result2, result3, result4]; } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } if (result1 !== null) { - result1 = (function(offset, c) {return c})(pos1, result1[3]); + result1 = (function(offset, line, column, c) {return c})(pos1.offset, pos1.line, pos1.column, result1[3]); } if (result1 === null) { - pos = pos1; + pos = clone(pos1); } if (result1 !== null) { result0 = []; while (result1 !== null) { result0.push(result1); - pos1 = pos; - pos2 = pos; - pos3 = pos; + pos1 = clone(pos); + pos2 = clone(pos); + pos3 = clone(pos); reportFailures++; result1 = parse_tag(); reportFailures--; @@ -1633,10 +1663,10 @@ var parser = (function(){ result1 = ""; } else { result1 = null; - pos = pos3; + pos = clone(pos3); } if (result1 !== null) { - pos3 = pos; + pos3 = clone(pos); reportFailures++; result2 = parse_eol(); reportFailures--; @@ -1644,10 +1674,10 @@ var parser = (function(){ result2 = ""; } else { result2 = null; - pos = pos3; + pos = clone(pos3); } if (result2 !== null) { - pos3 = pos; + pos3 = clone(pos); reportFailures++; result3 = parse_comment(); reportFailures--; @@ -1655,12 +1685,12 @@ var parser = (function(){ result3 = ""; } else { result3 = null; - pos = pos3; + pos = clone(pos3); } if (result3 !== null) { - if (input.length > pos) { - result4 = input.charAt(pos); - pos++; + if (input.length > pos.offset) { + result4 = input.charAt(pos.offset); + advance(pos, 1); } else { result4 = null; if (reportFailures === 0) { @@ -1671,35 +1701,35 @@ var parser = (function(){ result1 = [result1, result2, result3, result4]; } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } if (result1 !== null) { - result1 = (function(offset, c) {return c})(pos1, result1[3]); + result1 = (function(offset, line, column, c) {return c})(pos1.offset, pos1.line, pos1.column, result1[3]); } if (result1 === null) { - pos = pos1; + pos = clone(pos1); } } } else { result0 = null; } if (result0 !== null) { - result0 = (function(offset, b) { return ["buffer", b.join('')] })(pos0, result0); + result0 = (function(offset, line, column, b) { return ["buffer", b.join('')] })(pos0.offset, pos0.line, pos0.column, result0); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } } reportFailures--; @@ -1714,10 +1744,10 @@ var parser = (function(){ var pos0, pos1, pos2, pos3; reportFailures++; - pos0 = pos; - pos1 = pos; - pos2 = pos; - pos3 = pos; + pos0 = clone(pos); + pos1 = clone(pos); + pos2 = clone(pos); + pos3 = clone(pos); reportFailures++; result1 = parse_tag(); reportFailures--; @@ -1725,10 +1755,10 @@ var parser = (function(){ result1 = ""; } else { result1 = null; - pos = pos3; + pos = clone(pos3); } if (result1 !== null) { - pos3 = pos; + pos3 = clone(pos); reportFailures++; result2 = parse_eol(); reportFailures--; @@ -1736,14 +1766,14 @@ var parser = (function(){ result2 = ""; } else { result2 = null; - pos = pos3; + pos = clone(pos3); } if (result2 !== null) { result3 = parse_esc(); if (result3 === null) { - if (/^[^"]/.test(input.charAt(pos))) { - result3 = input.charAt(pos); - pos++; + if (/^[^"]/.test(input.charAt(pos.offset))) { + result3 = input.charAt(pos.offset); + advance(pos, 1); } else { result3 = null; if (reportFailures === 0) { @@ -1755,29 +1785,29 @@ var parser = (function(){ result1 = [result1, result2, result3]; } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } if (result1 !== null) { - result1 = (function(offset, c) {return c})(pos1, result1[2]); + result1 = (function(offset, line, column, c) {return c})(pos1.offset, pos1.line, pos1.column, result1[2]); } if (result1 === null) { - pos = pos1; + pos = clone(pos1); } if (result1 !== null) { result0 = []; while (result1 !== null) { result0.push(result1); - pos1 = pos; - pos2 = pos; - pos3 = pos; + pos1 = clone(pos); + pos2 = clone(pos); + pos3 = clone(pos); reportFailures++; result1 = parse_tag(); reportFailures--; @@ -1785,10 +1815,10 @@ var parser = (function(){ result1 = ""; } else { result1 = null; - pos = pos3; + pos = clone(pos3); } if (result1 !== null) { - pos3 = pos; + pos3 = clone(pos); reportFailures++; result2 = parse_eol(); reportFailures--; @@ -1796,14 +1826,14 @@ var parser = (function(){ result2 = ""; } else { result2 = null; - pos = pos3; + pos = clone(pos3); } if (result2 !== null) { result3 = parse_esc(); if (result3 === null) { - if (/^[^"]/.test(input.charAt(pos))) { - result3 = input.charAt(pos); - pos++; + if (/^[^"]/.test(input.charAt(pos.offset))) { + result3 = input.charAt(pos.offset); + advance(pos, 1); } else { result3 = null; if (reportFailures === 0) { @@ -1815,31 +1845,31 @@ var parser = (function(){ result1 = [result1, result2, result3]; } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } } else { result1 = null; - pos = pos2; + pos = clone(pos2); } if (result1 !== null) { - result1 = (function(offset, c) {return c})(pos1, result1[2]); + result1 = (function(offset, line, column, c) {return c})(pos1.offset, pos1.line, pos1.column, result1[2]); } if (result1 === null) { - pos = pos1; + pos = clone(pos1); } } } else { result0 = null; } if (result0 !== null) { - result0 = (function(offset, b) { return b.join('') })(pos0, result0); + result0 = (function(offset, line, column, b) { return b.join('') })(pos0.offset, pos0.line, pos0.column, result0); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } reportFailures--; if (reportFailures === 0 && result0 === null) { @@ -1852,10 +1882,10 @@ var parser = (function(){ var result0; var pos0; - pos0 = pos; - if (input.substr(pos, 2) === "\\\"") { + pos0 = clone(pos); + if (input.substr(pos.offset, 2) === "\\\"") { result0 = "\\\""; - pos += 2; + advance(pos, 2); } else { result0 = null; if (reportFailures === 0) { @@ -1863,10 +1893,10 @@ var parser = (function(){ } } if (result0 !== null) { - result0 = (function(offset) { return '"' })(pos0); + result0 = (function(offset, line, column) { return '"' })(pos0.offset, pos0.line, pos0.column); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } return result0; } @@ -1876,11 +1906,11 @@ var parser = (function(){ var pos0, pos1, pos2, pos3, pos4; reportFailures++; - pos0 = pos; - pos1 = pos; - if (input.substr(pos, 2) === "{!") { + pos0 = clone(pos); + pos1 = clone(pos); + if (input.substr(pos.offset, 2) === "{!") { result0 = "{!"; - pos += 2; + advance(pos, 2); } else { result0 = null; if (reportFailures === 0) { @@ -1889,13 +1919,13 @@ var parser = (function(){ } if (result0 !== null) { result1 = []; - pos2 = pos; - pos3 = pos; - pos4 = pos; + pos2 = clone(pos); + pos3 = clone(pos); + pos4 = clone(pos); reportFailures++; - if (input.substr(pos, 2) === "!}") { + if (input.substr(pos.offset, 2) === "!}") { result2 = "!}"; - pos += 2; + advance(pos, 2); } else { result2 = null; if (reportFailures === 0) { @@ -1907,12 +1937,12 @@ var parser = (function(){ result2 = ""; } else { result2 = null; - pos = pos4; + pos = clone(pos4); } if (result2 !== null) { - if (input.length > pos) { - result3 = input.charAt(pos); - pos++; + if (input.length > pos.offset) { + result3 = input.charAt(pos.offset); + advance(pos, 1); } else { result3 = null; if (reportFailures === 0) { @@ -1923,27 +1953,27 @@ var parser = (function(){ result2 = [result2, result3]; } else { result2 = null; - pos = pos3; + pos = clone(pos3); } } else { result2 = null; - pos = pos3; + pos = clone(pos3); } if (result2 !== null) { - result2 = (function(offset, c) {return c})(pos2, result2[1]); + result2 = (function(offset, line, column, c) {return c})(pos2.offset, pos2.line, pos2.column, result2[1]); } if (result2 === null) { - pos = pos2; + pos = clone(pos2); } while (result2 !== null) { result1.push(result2); - pos2 = pos; - pos3 = pos; - pos4 = pos; + pos2 = clone(pos); + pos3 = clone(pos); + pos4 = clone(pos); reportFailures++; - if (input.substr(pos, 2) === "!}") { + if (input.substr(pos.offset, 2) === "!}") { result2 = "!}"; - pos += 2; + advance(pos, 2); } else { result2 = null; if (reportFailures === 0) { @@ -1955,12 +1985,12 @@ var parser = (function(){ result2 = ""; } else { result2 = null; - pos = pos4; + pos = clone(pos4); } if (result2 !== null) { - if (input.length > pos) { - result3 = input.charAt(pos); - pos++; + if (input.length > pos.offset) { + result3 = input.charAt(pos.offset); + advance(pos, 1); } else { result3 = null; if (reportFailures === 0) { @@ -1971,23 +2001,23 @@ var parser = (function(){ result2 = [result2, result3]; } else { result2 = null; - pos = pos3; + pos = clone(pos3); } } else { result2 = null; - pos = pos3; + pos = clone(pos3); } if (result2 !== null) { - result2 = (function(offset, c) {return c})(pos2, result2[1]); + result2 = (function(offset, line, column, c) {return c})(pos2.offset, pos2.line, pos2.column, result2[1]); } if (result2 === null) { - pos = pos2; + pos = clone(pos2); } } if (result1 !== null) { - if (input.substr(pos, 2) === "!}") { + if (input.substr(pos.offset, 2) === "!}") { result2 = "!}"; - pos += 2; + advance(pos, 2); } else { result2 = null; if (reportFailures === 0) { @@ -1998,21 +2028,21 @@ var parser = (function(){ result0 = [result0, result1, result2]; } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } } else { result0 = null; - pos = pos1; + pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, c) { return ["comment", c.join('')] })(pos0, result0[1]); + result0 = (function(offset, line, column, c) { return ["comment", c.join('')] })(pos0.offset, pos0.line, pos0.column, result0[1]); } if (result0 === null) { - pos = pos0; + pos = clone(pos0); } reportFailures--; if (reportFailures === 0 && result0 === null) { @@ -2025,12 +2055,12 @@ var parser = (function(){ var result0, result1, result2, result3, result4, result5, result6; var pos0, pos1, pos2; - pos0 = pos; + pos0 = clone(pos); result0 = parse_ld(); if (result0 !== null) { - if (/^[#?^><+%:@\/~%]/.test(input.charAt(pos))) { - result1 = input.charAt(pos); - pos++; + if (/^[#?^><+%:@\/~%]/.test(input.charAt(pos.offset))) { + result1 = input.charAt(pos.offset); + advance(pos, 1); } else { result1 = null; if (reportFailures === 0) { @@ -2045,8 +2075,8 @@ var parser = (function(){ result3 = parse_ws(); } if (result2 !== null) { - pos1 = pos; - pos2 = pos; + pos1 = clone(pos); + pos2 = clone(pos); reportFailures++; result4 = parse_rd(); reportFailures--; @@ -2054,10 +2084,10 @@ var parser = (function(){ result4 = ""; } else { result4 = null; - pos = pos2; + pos = clone(pos2); } if (result4 !== null) { - pos2 = pos; + pos2 = clone(pos); reportFailures++; result5 = parse_eol(); reportFailures--; @@ -2065,12 +2095,12 @@ var parser = (function(){ result5 = ""; } else { result5 = null; - pos = pos2; + pos = clone(pos2); } if (result5 !== null) { - if (input.length > pos) { - result6 = input.charAt(pos); - pos++; + if (input.length > pos.offset) { + result6 = input.charAt(pos.offset); + advance(pos, 1); } else { result6 = null; if (reportFailures === 0) { @@ -2081,22 +2111,22 @@ var parser = (function(){ result4 = [result4, result5, result6]; } else { result4 = null; - pos = pos1; + pos = clone(pos1); } } else { result4 = null; - pos = pos1; + pos = clone(pos1); } } else { result4 = null; - pos = pos1; + pos = clone(pos1); } if (result4 !== null) { result3 = []; while (result4 !== null) { result3.push(result4); - pos1 = pos; - pos2 = pos; + pos1 = clone(pos); + pos2 = clone(pos); reportFailures++; result4 = parse_rd(); reportFailures--; @@ -2104,10 +2134,10 @@ var parser = (function(){ result4 = ""; } else { result4 = null; - pos = pos2; + pos = clone(pos2); } if (result4 !== null) { - pos2 = pos; + pos2 = clone(pos); reportFailures++; result5 = parse_eol(); reportFailures--; @@ -2115,12 +2145,12 @@ var parser = (function(){ result5 = ""; } else { result5 = null; - pos = pos2; + pos = clone(pos2); } if (result5 !== null) { - if (input.length > pos) { - result6 = input.charAt(pos); - pos++; + if (input.length > pos.offset) { + result6 = input.charAt(pos.offset); + advance(pos, 1); } else { result6 = null; if (reportFailures === 0) { @@ -2131,15 +2161,15 @@ var parser = (function(){ result4 = [result4, result5, result6]; } else { result4 = null; - pos = pos1; + pos = clone(pos1); } } else { result4 = null; - pos = pos1; + pos = clone(pos1); } } else { result4 = null; - pos = pos1; + pos = clone(pos1); } } } else { @@ -2158,27 +2188,27 @@ var parser = (function(){ result0 = [result0, result1, result2, result3, result4, result5]; } else { result0 = null; - pos = pos0; + pos = clone(pos0); } } else { result0 = null; - pos = pos0; + pos = clone(pos0); } } else { result0 = null; - pos = pos0; + pos = clone(pos0); } } else { result0 = null; - pos = pos0; + pos = clone(pos0); } } else { result0 = null; - pos = pos0; + pos = clone(pos0); } } else { result0 = null; - pos = pos0; + pos = clone(pos0); } if (result0 === null) { result0 = parse_reference(); @@ -2189,9 +2219,9 @@ var parser = (function(){ function parse_ld() { var result0; - if (input.charCodeAt(pos) === 123) { + if (input.charCodeAt(pos.offset) === 123) { result0 = "{"; - pos++; + advance(pos, 1); } else { result0 = null; if (reportFailures === 0) { @@ -2204,9 +2234,9 @@ var parser = (function(){ function parse_rd() { var result0; - if (input.charCodeAt(pos) === 125) { + if (input.charCodeAt(pos.offset) === 125) { result0 = "}"; - pos++; + advance(pos, 1); } else { result0 = null; if (reportFailures === 0) { @@ -2219,9 +2249,9 @@ var parser = (function(){ function parse_eol() { var result0; - if (input.charCodeAt(pos) === 10) { + if (input.charCodeAt(pos.offset) === 10) { result0 = "\n"; - pos++; + advance(pos, 1); } else { result0 = null; if (reportFailures === 0) { @@ -2229,9 +2259,9 @@ var parser = (function(){ } } if (result0 === null) { - if (input.substr(pos, 2) === "\r\n") { + if (input.substr(pos.offset, 2) === "\r\n") { result0 = "\r\n"; - pos += 2; + advance(pos, 2); } else { result0 = null; if (reportFailures === 0) { @@ -2239,9 +2269,9 @@ var parser = (function(){ } } if (result0 === null) { - if (input.charCodeAt(pos) === 13) { + if (input.charCodeAt(pos.offset) === 13) { result0 = "\r"; - pos++; + advance(pos, 1); } else { result0 = null; if (reportFailures === 0) { @@ -2249,9 +2279,9 @@ var parser = (function(){ } } if (result0 === null) { - if (input.charCodeAt(pos) === 8232) { + if (input.charCodeAt(pos.offset) === 8232) { result0 = "\u2028"; - pos++; + advance(pos, 1); } else { result0 = null; if (reportFailures === 0) { @@ -2259,9 +2289,9 @@ var parser = (function(){ } } if (result0 === null) { - if (input.charCodeAt(pos) === 8233) { + if (input.charCodeAt(pos.offset) === 8233) { result0 = "\u2029"; - pos++; + advance(pos, 1); } else { result0 = null; if (reportFailures === 0) { @@ -2278,9 +2308,9 @@ var parser = (function(){ function parse_ws() { var result0; - if (/^[\t\x0B\f \xA0\uFEFF]/.test(input.charAt(pos))) { - result0 = input.charAt(pos); - pos++; + if (/^[\t\x0B\f \xA0\uFEFF]/.test(input.charAt(pos.offset))) { + result0 = input.charAt(pos.offset); + advance(pos, 1); } else { result0 = null; if (reportFailures === 0) { @@ -2305,36 +2335,6 @@ var parser = (function(){ return cleanExpected; } - function computeErrorPosition() { - /* - * The first idea was to use |String.split| to break the input up to the - * error position along newlines and derive the line and column from - * there. However IE's |split| implementation is so broken that it was - * enough to prevent it. - */ - - var line = 1; - var column = 1; - var seenCR = false; - - for (var i = 0; i < Math.max(pos, rightmostFailuresPos); i++) { - var ch = input.charAt(i); - if (ch === "\n") { - if (!seenCR) { line++; } - column = 1; - seenCR = false; - } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") { - line++; - column = 1; - seenCR = true; - } else { - column++; - seenCR = false; - } - } - - return { line: line, column: column }; - } var result = parseFunctions[startRule](); @@ -2345,28 +2345,28 @@ var parser = (function(){ * 1. The parser successfully parsed the whole input. * * - |result !== null| - * - |pos === input.length| + * - |pos.offset === input.length| * - |rightmostFailuresExpected| may or may not contain something * * 2. The parser successfully parsed only a part of the input. * * - |result !== null| - * - |pos < input.length| + * - |pos.offset < input.length| * - |rightmostFailuresExpected| may or may not contain something * * 3. The parser did not successfully parse any part of the input. * * - |result === null| - * - |pos === 0| + * - |pos.offset === 0| * - |rightmostFailuresExpected| contains at least one failure * * All code following this comment (including called functions) must * handle these states. */ - if (result === null || pos !== input.length) { - var offset = Math.max(pos, rightmostFailuresPos); + if (result === null || pos.offset !== input.length) { + var offset = Math.max(pos.offset, rightmostFailuresPos.offset); var found = offset < input.length ? input.charAt(offset) : null; - var errorPosition = computeErrorPosition(); + var errorPosition = pos.offset > rightmostFailuresPos.offset ? pos : rightmostFailuresPos; throw new parser.SyntaxError( cleanupExpected(rightmostFailuresExpected), diff --git a/src/build.js b/src/build.js index 87a83d39..70419a4c 100644 --- a/src/build.js +++ b/src/build.js @@ -3,7 +3,12 @@ var peg = require('pegjs'), path = require('path'), root = path.join(path.dirname(__filename), ".."); -var parser = peg.buildParser(fs.readFileSync(path.join(root, 'src', 'dust.pegjs'), 'utf8')); +var options = { + cache: false, + trackLineAndColumn: true +}; + +var parser = peg.buildParser(fs.readFileSync(path.join(root, 'src', 'dust.pegjs'), 'utf8'), options); var namespace = 'parser'; @@ -11,4 +16,4 @@ fs.writeFileSync(path.join(root, 'lib', 'parser.js'), "(function(dust){\n\nvar " + parser.toSource().replace('this.SyntaxError', ''+namespace+'.SyntaxError') + ";\n\n" + "dust.parse = "+namespace+".parse;\n\n" + "})(typeof exports !== 'undefined' ? exports : getGlobal());" -); \ No newline at end of file +);