Rebuild src/parser.js (forgotten in the previous commit)

redux
David Majda 12 years ago
parent 28860e88df
commit 4e46a6e46e

@ -61,6 +61,8 @@ module.exports = (function(){
var pos = 0; var pos = 0;
var reportedPos = 0; var reportedPos = 0;
var cachedReportedPos = 0;
var cachedReportedPosDetails = { line: 1, column: 1, seenCR: false };
var reportFailures = 0; var reportFailures = 0;
var rightmostFailuresPos = 0; var rightmostFailuresPos = 0;
var rightmostFailuresExpected = []; var rightmostFailuresExpected = [];
@ -92,16 +94,48 @@ module.exports = (function(){
return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length); return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length);
} }
function computeReportedPosDetails() {
function advanceCachedReportedPos() {
var ch;
for (; cachedReportedPos < reportedPos; cachedReportedPos++) {
ch = input.charAt(cachedReportedPos);
if (ch === "\n") {
if (!cachedReportedPosDetails.seenCR) { cachedReportedPosDetails.line++; }
cachedReportedPosDetails.column = 1;
cachedReportedPosDetails.seenCR = false;
} else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") {
cachedReportedPosDetails.line++;
cachedReportedPosDetails.column = 1;
cachedReportedPosDetails.seenCR = true;
} else {
cachedReportedPosDetails.column++;
cachedReportedPosDetails.seenCR = false;
}
}
}
if (cachedReportedPos !== reportedPos) {
if (cachedReportedPos > reportedPos) {
cachedReportedPos = 0;
cachedReportedPosDetails = { line: 1, column: 1, seenCR: false };
}
advanceCachedReportedPos();
}
return cachedReportedPosDetails;
}
function offset() { function offset() {
return reportedPos; return reportedPos;
} }
function line() { function line() {
return computePosDetails(reportedPos).line; return computeReportedPosDetails().line;
} }
function column() { function column() {
return computePosDetails(reportedPos).column; return computeReportedPosDetails().column;
} }
function matchFailed(failure) { function matchFailed(failure) {
@ -2825,37 +2859,6 @@ module.exports = (function(){
return cleanExpected; return cleanExpected;
} }
function computePosDetails(pos) {
/*
* 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 < pos; 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 utils = require("./utils"); var utils = require("./utils");
@ -2887,16 +2890,16 @@ module.exports = (function(){
* handle these states. * handle these states.
*/ */
if (result === null || pos !== input.length) { if (result === null || pos !== input.length) {
var offset = Math.max(pos, rightmostFailuresPos); reportedPos = Math.max(pos, rightmostFailuresPos);
var found = offset < input.length ? input.charAt(offset) : null; var found = reportedPos < input.length ? input.charAt(reportedPos) : null;
var errorPosition = computePosDetails(Math.max(pos, rightmostFailuresPos)); var reportedPosDetails = computeReportedPosDetails();
throw new this.SyntaxError( throw new this.SyntaxError(
cleanupExpected(rightmostFailuresExpected), cleanupExpected(rightmostFailuresExpected),
found, found,
offset, reportedPos,
errorPosition.line, reportedPosDetails.line,
errorPosition.column reportedPosDetails.column
); );
} }

Loading…
Cancel
Save