2e8e71bbd0
test remove setResult parse end of outerblock test end of outer block compiles testing bindings tested todo chain bindings topological sort
916 lines
22 KiB
JavaScript
916 lines
22 KiB
JavaScript
// Generated by Peggy 2.0.1.
|
|
//
|
|
// https://peggyjs.org/
|
|
|
|
"use strict";
|
|
|
|
function peg$subclass(child, parent) {
|
|
function C() { this.constructor = child; }
|
|
C.prototype = parent.prototype;
|
|
child.prototype = new C();
|
|
}
|
|
|
|
function peg$SyntaxError(message, expected, found, location) {
|
|
var self = Error.call(this, message);
|
|
// istanbul ignore next Check is a necessary evil to support older environments
|
|
if (Object.setPrototypeOf) {
|
|
Object.setPrototypeOf(self, peg$SyntaxError.prototype);
|
|
}
|
|
self.expected = expected;
|
|
self.found = found;
|
|
self.location = location;
|
|
self.name = "SyntaxError";
|
|
return self;
|
|
}
|
|
|
|
peg$subclass(peg$SyntaxError, Error);
|
|
|
|
function peg$padEnd(str, targetLength, padString) {
|
|
padString = padString || " ";
|
|
if (str.length > targetLength) { return str; }
|
|
targetLength -= str.length;
|
|
padString += padString.repeat(targetLength);
|
|
return str + padString.slice(0, targetLength);
|
|
}
|
|
|
|
peg$SyntaxError.prototype.format = function(sources) {
|
|
var str = "Error: " + this.message;
|
|
if (this.location) {
|
|
var src = null;
|
|
var k;
|
|
for (k = 0; k < sources.length; k++) {
|
|
if (sources[k].source === this.location.source) {
|
|
src = sources[k].text.split(/\r\n|\n|\r/g);
|
|
break;
|
|
}
|
|
}
|
|
var s = this.location.start;
|
|
var loc = this.location.source + ":" + s.line + ":" + s.column;
|
|
if (src) {
|
|
var e = this.location.end;
|
|
var filler = peg$padEnd("", s.line.toString().length, ' ');
|
|
var line = src[s.line - 1];
|
|
var last = s.line === e.line ? e.column : line.length + 1;
|
|
var hatLen = (last - s.column) || 1;
|
|
str += "\n --> " + loc + "\n"
|
|
+ filler + " |\n"
|
|
+ s.line + " | " + line + "\n"
|
|
+ filler + " | " + peg$padEnd("", s.column - 1, ' ')
|
|
+ peg$padEnd("", hatLen, "^");
|
|
} else {
|
|
str += "\n at " + loc;
|
|
}
|
|
}
|
|
return str;
|
|
};
|
|
|
|
peg$SyntaxError.buildMessage = function(expected, found) {
|
|
var DESCRIBE_EXPECTATION_FNS = {
|
|
literal: function(expectation) {
|
|
return "\"" + literalEscape(expectation.text) + "\"";
|
|
},
|
|
|
|
class: function(expectation) {
|
|
var escapedParts = expectation.parts.map(function(part) {
|
|
return Array.isArray(part)
|
|
? classEscape(part[0]) + "-" + classEscape(part[1])
|
|
: classEscape(part);
|
|
});
|
|
|
|
return "[" + (expectation.inverted ? "^" : "") + escapedParts.join("") + "]";
|
|
},
|
|
|
|
any: function() {
|
|
return "any character";
|
|
},
|
|
|
|
end: function() {
|
|
return "end of input";
|
|
},
|
|
|
|
other: function(expectation) {
|
|
return expectation.description;
|
|
}
|
|
};
|
|
|
|
function hex(ch) {
|
|
return ch.charCodeAt(0).toString(16).toUpperCase();
|
|
}
|
|
|
|
function literalEscape(s) {
|
|
return s
|
|
.replace(/\\/g, "\\\\")
|
|
.replace(/"/g, "\\\"")
|
|
.replace(/\0/g, "\\0")
|
|
.replace(/\t/g, "\\t")
|
|
.replace(/\n/g, "\\n")
|
|
.replace(/\r/g, "\\r")
|
|
.replace(/[\x00-\x0F]/g, function(ch) { return "\\x0" + hex(ch); })
|
|
.replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x" + hex(ch); });
|
|
}
|
|
|
|
function classEscape(s) {
|
|
return s
|
|
.replace(/\\/g, "\\\\")
|
|
.replace(/\]/g, "\\]")
|
|
.replace(/\^/g, "\\^")
|
|
.replace(/-/g, "\\-")
|
|
.replace(/\0/g, "\\0")
|
|
.replace(/\t/g, "\\t")
|
|
.replace(/\n/g, "\\n")
|
|
.replace(/\r/g, "\\r")
|
|
.replace(/[\x00-\x0F]/g, function(ch) { return "\\x0" + hex(ch); })
|
|
.replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x" + hex(ch); });
|
|
}
|
|
|
|
function describeExpectation(expectation) {
|
|
return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
|
|
}
|
|
|
|
function describeExpected(expected) {
|
|
var descriptions = expected.map(describeExpectation);
|
|
var i, j;
|
|
|
|
descriptions.sort();
|
|
|
|
if (descriptions.length > 0) {
|
|
for (i = 1, j = 1; i < descriptions.length; i++) {
|
|
if (descriptions[i - 1] !== descriptions[i]) {
|
|
descriptions[j] = descriptions[i];
|
|
j++;
|
|
}
|
|
}
|
|
descriptions.length = j;
|
|
}
|
|
|
|
switch (descriptions.length) {
|
|
case 1:
|
|
return descriptions[0];
|
|
|
|
case 2:
|
|
return descriptions[0] + " or " + descriptions[1];
|
|
|
|
default:
|
|
return descriptions.slice(0, -1).join(", ")
|
|
+ ", or "
|
|
+ descriptions[descriptions.length - 1];
|
|
}
|
|
}
|
|
|
|
function describeFound(found) {
|
|
return found ? "\"" + literalEscape(found) + "\"" : "end of input";
|
|
}
|
|
|
|
return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
|
|
};
|
|
|
|
function peg$parse(input, options) {
|
|
options = options !== undefined ? options : {};
|
|
|
|
var peg$FAILED = {};
|
|
var peg$source = options.grammarSource;
|
|
|
|
var peg$startRuleFunctions = { start: peg$parsestart };
|
|
var peg$startRuleFunction = peg$parsestart;
|
|
|
|
var peg$c0 = "#include";
|
|
var peg$c1 = "'";
|
|
var peg$c2 = "\"";
|
|
var peg$c3 = "//";
|
|
var peg$c4 = "/*";
|
|
var peg$c5 = "*/";
|
|
|
|
var peg$r0 = /^[^']/;
|
|
var peg$r1 = /^[^"]/;
|
|
var peg$r2 = /^[^*]/;
|
|
var peg$r3 = /^[ \t]/;
|
|
var peg$r4 = /^[\n\r]/;
|
|
var peg$r5 = /^[^\r\n]/;
|
|
|
|
var peg$e0 = peg$literalExpectation("#include", false);
|
|
var peg$e1 = peg$otherExpectation("string");
|
|
var peg$e2 = peg$literalExpectation("'", false);
|
|
var peg$e3 = peg$classExpectation(["'"], true, false);
|
|
var peg$e4 = peg$literalExpectation("\"", false);
|
|
var peg$e5 = peg$classExpectation(["\""], true, false);
|
|
var peg$e6 = peg$literalExpectation("//", false);
|
|
var peg$e7 = peg$literalExpectation("/*", false);
|
|
var peg$e8 = peg$classExpectation(["*"], true, false);
|
|
var peg$e9 = peg$literalExpectation("*/", false);
|
|
var peg$e10 = peg$otherExpectation("white space");
|
|
var peg$e11 = peg$classExpectation([" ", "\t"], false, false);
|
|
var peg$e12 = peg$otherExpectation("newline");
|
|
var peg$e13 = peg$classExpectation(["\n", "\r"], false, false);
|
|
var peg$e14 = peg$classExpectation(["\r", "\n"], true, false);
|
|
|
|
var peg$f0 = function(head, tail) {return [head, ...tail].filter( e => e != '');};
|
|
var peg$f1 = function() {return [];};
|
|
var peg$f2 = function(characters) {return characters.join('');};
|
|
var peg$f3 = function(characters) {return characters.join('');};
|
|
var peg$f4 = function() { return '';};
|
|
var peg$f5 = function() { return '';};
|
|
var peg$currPos = 0;
|
|
var peg$savedPos = 0;
|
|
var peg$posDetailsCache = [{ line: 1, column: 1 }];
|
|
var peg$maxFailPos = 0;
|
|
var peg$maxFailExpected = [];
|
|
var peg$silentFails = 0;
|
|
|
|
var peg$resultsCache = {};
|
|
|
|
var peg$result;
|
|
|
|
if ("startRule" in options) {
|
|
if (!(options.startRule in peg$startRuleFunctions)) {
|
|
throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
|
|
}
|
|
|
|
peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
|
|
}
|
|
|
|
function text() {
|
|
return input.substring(peg$savedPos, peg$currPos);
|
|
}
|
|
|
|
function offset() {
|
|
return peg$savedPos;
|
|
}
|
|
|
|
function range() {
|
|
return {
|
|
source: peg$source,
|
|
start: peg$savedPos,
|
|
end: peg$currPos
|
|
};
|
|
}
|
|
|
|
function location() {
|
|
return peg$computeLocation(peg$savedPos, peg$currPos);
|
|
}
|
|
|
|
function expected(description, location) {
|
|
location = location !== undefined
|
|
? location
|
|
: peg$computeLocation(peg$savedPos, peg$currPos);
|
|
|
|
throw peg$buildStructuredError(
|
|
[peg$otherExpectation(description)],
|
|
input.substring(peg$savedPos, peg$currPos),
|
|
location
|
|
);
|
|
}
|
|
|
|
function error(message, location) {
|
|
location = location !== undefined
|
|
? location
|
|
: peg$computeLocation(peg$savedPos, peg$currPos);
|
|
|
|
throw peg$buildSimpleError(message, location);
|
|
}
|
|
|
|
function peg$literalExpectation(text, ignoreCase) {
|
|
return { type: "literal", text: text, ignoreCase: ignoreCase };
|
|
}
|
|
|
|
function peg$classExpectation(parts, inverted, ignoreCase) {
|
|
return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };
|
|
}
|
|
|
|
function peg$anyExpectation() {
|
|
return { type: "any" };
|
|
}
|
|
|
|
function peg$endExpectation() {
|
|
return { type: "end" };
|
|
}
|
|
|
|
function peg$otherExpectation(description) {
|
|
return { type: "other", description: description };
|
|
}
|
|
|
|
function peg$computePosDetails(pos) {
|
|
var details = peg$posDetailsCache[pos];
|
|
var p;
|
|
|
|
if (details) {
|
|
return details;
|
|
} else {
|
|
p = pos - 1;
|
|
while (!peg$posDetailsCache[p]) {
|
|
p--;
|
|
}
|
|
|
|
details = peg$posDetailsCache[p];
|
|
details = {
|
|
line: details.line,
|
|
column: details.column
|
|
};
|
|
|
|
while (p < pos) {
|
|
if (input.charCodeAt(p) === 10) {
|
|
details.line++;
|
|
details.column = 1;
|
|
} else {
|
|
details.column++;
|
|
}
|
|
|
|
p++;
|
|
}
|
|
|
|
peg$posDetailsCache[pos] = details;
|
|
|
|
return details;
|
|
}
|
|
}
|
|
|
|
function peg$computeLocation(startPos, endPos) {
|
|
var startPosDetails = peg$computePosDetails(startPos);
|
|
var endPosDetails = peg$computePosDetails(endPos);
|
|
|
|
return {
|
|
source: peg$source,
|
|
start: {
|
|
offset: startPos,
|
|
line: startPosDetails.line,
|
|
column: startPosDetails.column
|
|
},
|
|
end: {
|
|
offset: endPos,
|
|
line: endPosDetails.line,
|
|
column: endPosDetails.column
|
|
}
|
|
};
|
|
}
|
|
|
|
function peg$fail(expected) {
|
|
if (peg$currPos < peg$maxFailPos) { return; }
|
|
|
|
if (peg$currPos > peg$maxFailPos) {
|
|
peg$maxFailPos = peg$currPos;
|
|
peg$maxFailExpected = [];
|
|
}
|
|
|
|
peg$maxFailExpected.push(expected);
|
|
}
|
|
|
|
function peg$buildSimpleError(message, location) {
|
|
return new peg$SyntaxError(message, null, null, location);
|
|
}
|
|
|
|
function peg$buildStructuredError(expected, found, location) {
|
|
return new peg$SyntaxError(
|
|
peg$SyntaxError.buildMessage(expected, found),
|
|
expected,
|
|
found,
|
|
location
|
|
);
|
|
}
|
|
|
|
function peg$parsestart() {
|
|
var s0, s1, s2, s3;
|
|
|
|
var key = peg$currPos * 10 + 0;
|
|
var cached = peg$resultsCache[key];
|
|
|
|
if (cached) {
|
|
peg$currPos = cached.nextPos;
|
|
|
|
return cached.result;
|
|
}
|
|
|
|
s0 = peg$currPos;
|
|
s1 = peg$parseincludes();
|
|
if (s1 !== peg$FAILED) {
|
|
s2 = [];
|
|
s3 = peg$parsenewLine();
|
|
while (s3 !== peg$FAILED) {
|
|
s2.push(s3);
|
|
s3 = peg$parsenewLine();
|
|
}
|
|
s3 = peg$parseignore();
|
|
s0 = s1;
|
|
} else {
|
|
peg$currPos = s0;
|
|
s0 = peg$FAILED;
|
|
}
|
|
|
|
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
|
|
|
|
return s0;
|
|
}
|
|
|
|
function peg$parseincludes() {
|
|
var s0, s1, s2, s3, s4, s5;
|
|
|
|
var key = peg$currPos * 10 + 1;
|
|
var cached = peg$resultsCache[key];
|
|
|
|
if (cached) {
|
|
peg$currPos = cached.nextPos;
|
|
|
|
return cached.result;
|
|
}
|
|
|
|
s0 = peg$currPos;
|
|
s1 = peg$parseincludeStatement();
|
|
if (s1 !== peg$FAILED) {
|
|
s2 = [];
|
|
s3 = peg$currPos;
|
|
s4 = [];
|
|
s5 = peg$parsenewLine();
|
|
if (s5 !== peg$FAILED) {
|
|
while (s5 !== peg$FAILED) {
|
|
s4.push(s5);
|
|
s5 = peg$parsenewLine();
|
|
}
|
|
} else {
|
|
s4 = peg$FAILED;
|
|
}
|
|
if (s4 !== peg$FAILED) {
|
|
s5 = peg$parseincludeStatement();
|
|
if (s5 !== peg$FAILED) {
|
|
s3 = s5;
|
|
} else {
|
|
peg$currPos = s3;
|
|
s3 = peg$FAILED;
|
|
}
|
|
} else {
|
|
peg$currPos = s3;
|
|
s3 = peg$FAILED;
|
|
}
|
|
while (s3 !== peg$FAILED) {
|
|
s2.push(s3);
|
|
s3 = peg$currPos;
|
|
s4 = [];
|
|
s5 = peg$parsenewLine();
|
|
if (s5 !== peg$FAILED) {
|
|
while (s5 !== peg$FAILED) {
|
|
s4.push(s5);
|
|
s5 = peg$parsenewLine();
|
|
}
|
|
} else {
|
|
s4 = peg$FAILED;
|
|
}
|
|
if (s4 !== peg$FAILED) {
|
|
s5 = peg$parseincludeStatement();
|
|
if (s5 !== peg$FAILED) {
|
|
s3 = s5;
|
|
} else {
|
|
peg$currPos = s3;
|
|
s3 = peg$FAILED;
|
|
}
|
|
} else {
|
|
peg$currPos = s3;
|
|
s3 = peg$FAILED;
|
|
}
|
|
}
|
|
peg$savedPos = s0;
|
|
s0 = peg$f0(s1, s2);
|
|
} else {
|
|
peg$currPos = s0;
|
|
s0 = peg$FAILED;
|
|
}
|
|
if (s0 === peg$FAILED) {
|
|
s0 = peg$currPos;
|
|
s1 = peg$parseignore();
|
|
peg$savedPos = s0;
|
|
s1 = peg$f1();
|
|
s0 = s1;
|
|
}
|
|
|
|
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
|
|
|
|
return s0;
|
|
}
|
|
|
|
function peg$parseincludeStatement() {
|
|
var s0, s1, s2, s3, s4, s5;
|
|
|
|
var key = peg$currPos * 10 + 2;
|
|
var cached = peg$resultsCache[key];
|
|
|
|
if (cached) {
|
|
peg$currPos = cached.nextPos;
|
|
|
|
return cached.result;
|
|
}
|
|
|
|
s0 = peg$currPos;
|
|
if (input.substr(peg$currPos, 8) === peg$c0) {
|
|
s1 = peg$c0;
|
|
peg$currPos += 8;
|
|
} else {
|
|
s1 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e0); }
|
|
}
|
|
if (s1 !== peg$FAILED) {
|
|
s2 = [];
|
|
s3 = peg$parse_();
|
|
while (s3 !== peg$FAILED) {
|
|
s2.push(s3);
|
|
s3 = peg$parse_();
|
|
}
|
|
s3 = peg$parsestring();
|
|
if (s3 !== peg$FAILED) {
|
|
s4 = [];
|
|
s5 = peg$parse_();
|
|
while (s5 !== peg$FAILED) {
|
|
s4.push(s5);
|
|
s5 = peg$parse_();
|
|
}
|
|
s0 = s3;
|
|
} else {
|
|
peg$currPos = s0;
|
|
s0 = peg$FAILED;
|
|
}
|
|
} else {
|
|
peg$currPos = s0;
|
|
s0 = peg$FAILED;
|
|
}
|
|
if (s0 === peg$FAILED) {
|
|
s0 = peg$parsecomment();
|
|
if (s0 === peg$FAILED) {
|
|
s0 = peg$parsedelimitedComment();
|
|
}
|
|
}
|
|
|
|
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
|
|
|
|
return s0;
|
|
}
|
|
|
|
function peg$parsestring() {
|
|
var s0, s1, s2, s3, s4;
|
|
|
|
var key = peg$currPos * 10 + 3;
|
|
var cached = peg$resultsCache[key];
|
|
|
|
if (cached) {
|
|
peg$currPos = cached.nextPos;
|
|
|
|
return cached.result;
|
|
}
|
|
|
|
peg$silentFails++;
|
|
s0 = peg$currPos;
|
|
s1 = peg$currPos;
|
|
if (input.charCodeAt(peg$currPos) === 39) {
|
|
s2 = peg$c1;
|
|
peg$currPos++;
|
|
} else {
|
|
s2 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e2); }
|
|
}
|
|
if (s2 !== peg$FAILED) {
|
|
s3 = [];
|
|
if (peg$r0.test(input.charAt(peg$currPos))) {
|
|
s4 = input.charAt(peg$currPos);
|
|
peg$currPos++;
|
|
} else {
|
|
s4 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e3); }
|
|
}
|
|
while (s4 !== peg$FAILED) {
|
|
s3.push(s4);
|
|
if (peg$r0.test(input.charAt(peg$currPos))) {
|
|
s4 = input.charAt(peg$currPos);
|
|
peg$currPos++;
|
|
} else {
|
|
s4 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e3); }
|
|
}
|
|
}
|
|
if (input.charCodeAt(peg$currPos) === 39) {
|
|
s4 = peg$c1;
|
|
peg$currPos++;
|
|
} else {
|
|
s4 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e2); }
|
|
}
|
|
if (s4 !== peg$FAILED) {
|
|
s1 = s3;
|
|
} else {
|
|
peg$currPos = s1;
|
|
s1 = peg$FAILED;
|
|
}
|
|
} else {
|
|
peg$currPos = s1;
|
|
s1 = peg$FAILED;
|
|
}
|
|
if (s1 !== peg$FAILED) {
|
|
peg$savedPos = s0;
|
|
s1 = peg$f2(s1);
|
|
}
|
|
s0 = s1;
|
|
if (s0 === peg$FAILED) {
|
|
s0 = peg$currPos;
|
|
s1 = peg$currPos;
|
|
if (input.charCodeAt(peg$currPos) === 34) {
|
|
s2 = peg$c2;
|
|
peg$currPos++;
|
|
} else {
|
|
s2 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e4); }
|
|
}
|
|
if (s2 !== peg$FAILED) {
|
|
s3 = [];
|
|
if (peg$r1.test(input.charAt(peg$currPos))) {
|
|
s4 = input.charAt(peg$currPos);
|
|
peg$currPos++;
|
|
} else {
|
|
s4 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e5); }
|
|
}
|
|
while (s4 !== peg$FAILED) {
|
|
s3.push(s4);
|
|
if (peg$r1.test(input.charAt(peg$currPos))) {
|
|
s4 = input.charAt(peg$currPos);
|
|
peg$currPos++;
|
|
} else {
|
|
s4 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e5); }
|
|
}
|
|
}
|
|
if (input.charCodeAt(peg$currPos) === 34) {
|
|
s4 = peg$c2;
|
|
peg$currPos++;
|
|
} else {
|
|
s4 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e4); }
|
|
}
|
|
if (s4 !== peg$FAILED) {
|
|
s1 = s3;
|
|
} else {
|
|
peg$currPos = s1;
|
|
s1 = peg$FAILED;
|
|
}
|
|
} else {
|
|
peg$currPos = s1;
|
|
s1 = peg$FAILED;
|
|
}
|
|
if (s1 !== peg$FAILED) {
|
|
peg$savedPos = s0;
|
|
s1 = peg$f3(s1);
|
|
}
|
|
s0 = s1;
|
|
}
|
|
peg$silentFails--;
|
|
if (s0 === peg$FAILED) {
|
|
s1 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e1); }
|
|
}
|
|
|
|
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
|
|
|
|
return s0;
|
|
}
|
|
|
|
function peg$parseignore() {
|
|
var s0, s1;
|
|
|
|
var key = peg$currPos * 10 + 4;
|
|
var cached = peg$resultsCache[key];
|
|
|
|
if (cached) {
|
|
peg$currPos = cached.nextPos;
|
|
|
|
return cached.result;
|
|
}
|
|
|
|
s0 = [];
|
|
s1 = peg$parseany();
|
|
if (s1 === peg$FAILED) {
|
|
s1 = peg$parsenewLine();
|
|
if (s1 === peg$FAILED) {
|
|
s1 = peg$parse_();
|
|
}
|
|
}
|
|
while (s1 !== peg$FAILED) {
|
|
s0.push(s1);
|
|
s1 = peg$parseany();
|
|
if (s1 === peg$FAILED) {
|
|
s1 = peg$parsenewLine();
|
|
if (s1 === peg$FAILED) {
|
|
s1 = peg$parse_();
|
|
}
|
|
}
|
|
}
|
|
|
|
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
|
|
|
|
return s0;
|
|
}
|
|
|
|
function peg$parsecomment() {
|
|
var s0, s1, s2, s3;
|
|
|
|
var key = peg$currPos * 10 + 5;
|
|
var cached = peg$resultsCache[key];
|
|
|
|
if (cached) {
|
|
peg$currPos = cached.nextPos;
|
|
|
|
return cached.result;
|
|
}
|
|
|
|
s0 = peg$currPos;
|
|
if (input.substr(peg$currPos, 2) === peg$c3) {
|
|
s1 = peg$c3;
|
|
peg$currPos += 2;
|
|
} else {
|
|
s1 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e6); }
|
|
}
|
|
if (s1 !== peg$FAILED) {
|
|
s2 = [];
|
|
s3 = peg$parseany();
|
|
while (s3 !== peg$FAILED) {
|
|
s2.push(s3);
|
|
s3 = peg$parseany();
|
|
}
|
|
peg$savedPos = s0;
|
|
s0 = peg$f4();
|
|
} else {
|
|
peg$currPos = s0;
|
|
s0 = peg$FAILED;
|
|
}
|
|
|
|
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
|
|
|
|
return s0;
|
|
}
|
|
|
|
function peg$parsedelimitedComment() {
|
|
var s0, s1, s2, s3;
|
|
|
|
var key = peg$currPos * 10 + 6;
|
|
var cached = peg$resultsCache[key];
|
|
|
|
if (cached) {
|
|
peg$currPos = cached.nextPos;
|
|
|
|
return cached.result;
|
|
}
|
|
|
|
s0 = peg$currPos;
|
|
if (input.substr(peg$currPos, 2) === peg$c4) {
|
|
s1 = peg$c4;
|
|
peg$currPos += 2;
|
|
} else {
|
|
s1 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e7); }
|
|
}
|
|
if (s1 !== peg$FAILED) {
|
|
s2 = [];
|
|
if (peg$r2.test(input.charAt(peg$currPos))) {
|
|
s3 = input.charAt(peg$currPos);
|
|
peg$currPos++;
|
|
} else {
|
|
s3 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e8); }
|
|
}
|
|
while (s3 !== peg$FAILED) {
|
|
s2.push(s3);
|
|
if (peg$r2.test(input.charAt(peg$currPos))) {
|
|
s3 = input.charAt(peg$currPos);
|
|
peg$currPos++;
|
|
} else {
|
|
s3 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e8); }
|
|
}
|
|
}
|
|
if (input.substr(peg$currPos, 2) === peg$c5) {
|
|
s3 = peg$c5;
|
|
peg$currPos += 2;
|
|
} else {
|
|
s3 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e9); }
|
|
}
|
|
if (s3 !== peg$FAILED) {
|
|
peg$savedPos = s0;
|
|
s0 = peg$f5();
|
|
} else {
|
|
peg$currPos = s0;
|
|
s0 = peg$FAILED;
|
|
}
|
|
} else {
|
|
peg$currPos = s0;
|
|
s0 = peg$FAILED;
|
|
}
|
|
|
|
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
|
|
|
|
return s0;
|
|
}
|
|
|
|
function peg$parse_() {
|
|
var s0, s1;
|
|
|
|
var key = peg$currPos * 10 + 7;
|
|
var cached = peg$resultsCache[key];
|
|
|
|
if (cached) {
|
|
peg$currPos = cached.nextPos;
|
|
|
|
return cached.result;
|
|
}
|
|
|
|
peg$silentFails++;
|
|
if (peg$r3.test(input.charAt(peg$currPos))) {
|
|
s0 = input.charAt(peg$currPos);
|
|
peg$currPos++;
|
|
} else {
|
|
s0 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e11); }
|
|
}
|
|
peg$silentFails--;
|
|
if (s0 === peg$FAILED) {
|
|
s1 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e10); }
|
|
}
|
|
|
|
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
|
|
|
|
return s0;
|
|
}
|
|
|
|
function peg$parsenewLine() {
|
|
var s0, s1;
|
|
|
|
var key = peg$currPos * 10 + 8;
|
|
var cached = peg$resultsCache[key];
|
|
|
|
if (cached) {
|
|
peg$currPos = cached.nextPos;
|
|
|
|
return cached.result;
|
|
}
|
|
|
|
peg$silentFails++;
|
|
if (peg$r4.test(input.charAt(peg$currPos))) {
|
|
s0 = input.charAt(peg$currPos);
|
|
peg$currPos++;
|
|
} else {
|
|
s0 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e13); }
|
|
}
|
|
peg$silentFails--;
|
|
if (s0 === peg$FAILED) {
|
|
s1 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e12); }
|
|
}
|
|
|
|
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
|
|
|
|
return s0;
|
|
}
|
|
|
|
function peg$parseany() {
|
|
var s0;
|
|
|
|
var key = peg$currPos * 10 + 9;
|
|
var cached = peg$resultsCache[key];
|
|
|
|
if (cached) {
|
|
peg$currPos = cached.nextPos;
|
|
|
|
return cached.result;
|
|
}
|
|
|
|
if (peg$r5.test(input.charAt(peg$currPos))) {
|
|
s0 = input.charAt(peg$currPos);
|
|
peg$currPos++;
|
|
} else {
|
|
s0 = peg$FAILED;
|
|
if (peg$silentFails === 0) { peg$fail(peg$e14); }
|
|
}
|
|
|
|
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
|
|
|
|
return s0;
|
|
}
|
|
|
|
peg$result = peg$startRuleFunction();
|
|
|
|
if (peg$result !== peg$FAILED && peg$currPos === input.length) {
|
|
return peg$result;
|
|
} else {
|
|
if (peg$result !== peg$FAILED && peg$currPos < input.length) {
|
|
peg$fail(peg$endExpectation());
|
|
}
|
|
|
|
throw peg$buildStructuredError(
|
|
peg$maxFailExpected,
|
|
peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,
|
|
peg$maxFailPos < input.length
|
|
? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
|
|
: peg$computeLocation(peg$maxFailPos, peg$maxFailPos)
|
|
);
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
SyntaxError: peg$SyntaxError,
|
|
parse: peg$parse
|
|
};
|