You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3757 lines
98 KiB
JavaScript

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

PEG.parser = (function(){
/* Generated by PEG.js 0.6.2 (http://pegjs.majda.cz/). */
var result = {
/*
* Parses the input with a generated parser. If the parsing is successfull,
* returns a value explicitly or implicitly specified by the grammar from
* which the parser was generated (see |PEG.buildParser|). If the parsing is
* unsuccessful, throws |PEG.parser.SyntaxError| describing the error.
*/
parse: function(input, startRule) {
var parseFunctions = {
"__": parse___,
"action": parse_action,
"and": parse_and,
"braced": parse_braced,
"bracketDelimitedCharacter": parse_bracketDelimitedCharacter,
"choice": parse_choice,
"class": parse_class,
"classCharacter": parse_classCharacter,
"classCharacterRange": parse_classCharacterRange,
"colon": parse_colon,
"comment": parse_comment,
"digit": parse_digit,
"dot": parse_dot,
"doubleQuotedCharacter": parse_doubleQuotedCharacter,
"doubleQuotedLiteral": parse_doubleQuotedLiteral,
"eol": parse_eol,
"eolChar": parse_eolChar,
"eolEscapeSequence": parse_eolEscapeSequence,
"equals": parse_equals,
"grammar": parse_grammar,
"hexDigit": parse_hexDigit,
"hexEscapeSequence": parse_hexEscapeSequence,
"identifier": parse_identifier,
"initializer": parse_initializer,
"labeled": parse_labeled,
"letter": parse_letter,
"literal": parse_literal,
"lowerCaseLetter": parse_lowerCaseLetter,
"lparen": parse_lparen,
"multiLineComment": parse_multiLineComment,
"nonBraceCharacter": parse_nonBraceCharacter,
"nonBraceCharacters": parse_nonBraceCharacters,
"not": parse_not,
"plus": parse_plus,
"prefixed": parse_prefixed,
"primary": parse_primary,
"question": parse_question,
"rparen": parse_rparen,
"rule": parse_rule,
"semicolon": parse_semicolon,
"sequence": parse_sequence,
"simpleBracketDelimitedCharacter": parse_simpleBracketDelimitedCharacter,
"simpleDoubleQuotedCharacter": parse_simpleDoubleQuotedCharacter,
"simpleEscapeSequence": parse_simpleEscapeSequence,
"simpleSingleQuotedCharacter": parse_simpleSingleQuotedCharacter,
"singleLineComment": parse_singleLineComment,
"singleQuotedCharacter": parse_singleQuotedCharacter,
"singleQuotedLiteral": parse_singleQuotedLiteral,
"slash": parse_slash,
"star": parse_star,
"suffixed": parse_suffixed,
"unicodeEscapeSequence": parse_unicodeEscapeSequence,
"upperCaseLetter": parse_upperCaseLetter,
"whitespace": parse_whitespace,
"zeroEscapeSequence": parse_zeroEscapeSequence
};
if (startRule !== undefined) {
if (parseFunctions[startRule] === undefined) {
throw new Error("Invalid rule name: " + quote(startRule) + ".");
}
} else {
startRule = "grammar";
}
var pos = 0;
var reportFailures = 0;
var rightmostFailuresPos = 0;
var rightmostFailuresExpected = [];
var cache = {};
function padLeft(input, padding, length) {
var result = input;
var padLength = length - input.length;
for (var i = 0; i < padLength; i++) {
result = padding + result;
}
return result;
}
function escape(ch) {
var charCode = ch.charCodeAt(0);
var escapeChar;
var length;
if (charCode <= 0xFF) {
escapeChar = 'x';
length = 2;
} else {
escapeChar = 'u';
length = 4;
}
return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length);
}
function quote(s) {
/*
* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a
* string literal except for the closing quote character, backslash,
* carriage return, line separator, paragraph separator, and line feed.
* Any character may appear in the form of an escape sequence.
*
* For portability, we also escape escape all control and non-ASCII
* characters. Note that "\0" and "\v" escape sequences are not used
* because JSHint does not like the first and IE the second.
*/
return '"' + s
.replace(/\\/g, '\\\\') // backslash
.replace(/"/g, '\\"') // closing quote character
.replace(/\x08/g, '\\b') // backspace
.replace(/\t/g, '\\t') // horizontal tab
.replace(/\n/g, '\\n') // line feed
.replace(/\f/g, '\\f') // form feed
.replace(/\r/g, '\\r') // carriage return
.replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g, escape)
+ '"';
}
function matchFailed(failure) {
if (pos < rightmostFailuresPos) {
return;
}
if (pos > rightmostFailuresPos) {
rightmostFailuresPos = pos;
rightmostFailuresExpected = [];
}
rightmostFailuresExpected.push(failure);
}
function parse_grammar() {
var cacheKey = 'grammar@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2, result3, result4;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
result0 = parse___();
if (result0 !== null) {
result1 = parse_initializer();
result1 = result1 !== null ? result1 : '';
if (result1 !== null) {
result3 = parse_rule();
if (result3 !== null) {
result2 = [];
while (result3 !== null) {
result2.push(result3);
result3 = parse_rule();
}
} else {
result2 = null;
}
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(initializer, rules) {
var rulesConverted = {};
each(rules, function(rule) { rulesConverted[rule.name] = rule; });
return {
type: "grammar",
initializer: initializer !== "" ? initializer : null,
rules: rulesConverted,
startRule: rules[0].name
};
})(result0[1], result0[2]);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_initializer() {
var cacheKey = 'initializer@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
result0 = parse_action();
if (result0 !== null) {
result1 = parse_semicolon();
result1 = result1 !== null ? result1 : '';
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(code) {
return {
type: "initializer",
code: code
};
})(result0[0]);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_rule() {
var cacheKey = 'rule@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2, result3, result4, result5;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
result0 = parse_identifier();
if (result0 !== null) {
result1 = parse_literal();
if (result1 === null) {
if (input.substr(pos, 0) === "") {
result1 = "";
pos += 0;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\"\"");
}
}
}
if (result1 !== null) {
result2 = parse_equals();
if (result2 !== null) {
result3 = parse_choice();
if (result3 !== null) {
result4 = parse_semicolon();
result4 = result4 !== null ? result4 : '';
if (result4 !== null) {
result0 = [result0, result1, result2, result3, result4];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(name, displayName, expression) {
return {
type: "rule",
name: name,
displayName: displayName !== "" ? displayName : null,
expression: expression
};
})(result0[0], result0[1], result0[3]);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_choice() {
var cacheKey = 'choice@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2, result3, result4, result5;
var pos0, pos1, pos2, pos3;
pos0 = pos;
pos1 = pos;
result0 = parse_sequence();
if (result0 !== null) {
result1 = [];
pos2 = pos;
result2 = parse_slash();
if (result2 !== null) {
result3 = parse_sequence();
if (result3 !== null) {
result2 = [result2, result3];
} else {
result2 = null;
pos = pos2;
}
} else {
result2 = null;
pos = pos2;
}
while (result2 !== null) {
result1.push(result2);
pos2 = pos;
result2 = parse_slash();
if (result2 !== null) {
result3 = parse_sequence();
if (result3 !== null) {
result2 = [result2, result3];
} else {
result2 = null;
pos = pos2;
}
} else {
result2 = null;
pos = pos2;
}
}
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(head, tail) {
if (tail.length > 0) {
var alternatives = [head].concat(map(
tail,
function(element) { return element[1]; }
));
return {
type: "choice",
alternatives: alternatives
};
} else {
return head;
}
})(result0[0], result0[1]);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_sequence() {
var cacheKey = 'sequence@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
result0 = [];
result1 = parse_labeled();
while (result1 !== null) {
result0.push(result1);
result1 = parse_labeled();
}
if (result0 !== null) {
result1 = parse_action();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(elements, code) {
var expression = elements.length !== 1
? {
type: "sequence",
elements: elements
}
: elements[0];
return {
type: "action",
expression: expression,
code: code
};
})(result0[0], result0[1]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
result0 = [];
result1 = parse_labeled();
while (result1 !== null) {
result0.push(result1);
result1 = parse_labeled();
}
if (result0 !== null) {
result0 = (function(elements) {
return elements.length !== 1
? {
type: "sequence",
elements: elements
}
: elements[0];
})(result0);
}
if (result0 === null) {
pos = pos0;
}
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_labeled() {
var cacheKey = 'labeled@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2, result3;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
result0 = parse_identifier();
if (result0 !== null) {
result1 = parse_colon();
if (result1 !== null) {
result2 = parse_prefixed();
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(label, expression) {
return {
type: "labeled",
label: label,
expression: expression
};
})(result0[0], result0[2]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
result0 = parse_prefixed();
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_prefixed() {
var cacheKey = 'prefixed@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
result0 = parse_and();
if (result0 !== null) {
result1 = parse_action();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(code) {
return {
type: "semantic_and",
code: code
};
})(result0[1]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
pos1 = pos;
result0 = parse_and();
if (result0 !== null) {
result1 = parse_suffixed();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(expression) {
return {
type: "simple_and",
expression: expression
};
})(result0[1]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
pos1 = pos;
result0 = parse_not();
if (result0 !== null) {
result1 = parse_action();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(code) {
return {
type: "semantic_not",
code: code
};
})(result0[1]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
pos1 = pos;
result0 = parse_not();
if (result0 !== null) {
result1 = parse_suffixed();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(expression) {
return {
type: "simple_not",
expression: expression
};
})(result0[1]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
result0 = parse_suffixed();
}
}
}
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_suffixed() {
var cacheKey = 'suffixed@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
result0 = parse_primary();
if (result0 !== null) {
result1 = parse_question();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(expression) {
return {
type: "optional",
expression: expression
};
})(result0[0]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
pos1 = pos;
result0 = parse_primary();
if (result0 !== null) {
result1 = parse_star();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(expression) {
return {
type: "zero_or_more",
expression: expression
};
})(result0[0]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
pos1 = pos;
result0 = parse_primary();
if (result0 !== null) {
result1 = parse_plus();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(expression) {
return {
type: "one_or_more",
expression: expression
};
})(result0[0]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
result0 = parse_primary();
}
}
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_primary() {
var cacheKey = 'primary@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2, result3, result4;
var pos0, pos1, pos2, pos3, pos4;
pos0 = pos;
pos1 = pos;
result0 = parse_identifier();
if (result0 !== null) {
pos2 = pos;
reportFailures++;
pos3 = pos;
result1 = parse_literal();
if (result1 === null) {
if (input.substr(pos, 0) === "") {
result1 = "";
pos += 0;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\"\"");
}
}
}
if (result1 !== null) {
result2 = parse_equals();
if (result2 !== null) {
result1 = [result1, result2];
} else {
result1 = null;
pos = pos3;
}
} else {
result1 = null;
pos = pos3;
}
reportFailures--;
if (result1 === null) {
result1 = '';
} else {
result1 = null;
pos = pos2;
}
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(name) {
return {
type: "rule_ref",
name: name
};
})(result0[0]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
result0 = parse_literal();
if (result0 !== null) {
result0 = (function(value) {
return {
type: "literal",
value: value
};
})(result0);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
result0 = parse_dot();
if (result0 !== null) {
result0 = (function() { return { type: "any" }; })();
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
result0 = parse_class();
if (result0 === null) {
pos0 = pos;
pos1 = pos;
result0 = parse_lparen();
if (result0 !== null) {
result1 = parse_choice();
if (result1 !== null) {
result2 = parse_rparen();
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(expression) { return expression; })(result0[1]);
}
if (result0 === null) {
pos = pos0;
}
}
}
}
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_action() {
var cacheKey = 'action@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
reportFailures++;
pos0 = pos;
pos1 = pos;
result0 = parse_braced();
if (result0 !== null) {
result1 = parse___();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(braced) { return braced.substr(1, braced.length - 2); })(result0[0]);
}
if (result0 === null) {
pos = pos0;
}
reportFailures--;
if (reportFailures === 0 && result0 === null) {
matchFailed("action");
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_braced() {
var cacheKey = 'braced@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2, result3;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 123) {
result0 = "{";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"{\"");
}
}
if (result0 !== null) {
result1 = [];
result2 = parse_braced();
if (result2 === null) {
result2 = parse_nonBraceCharacter();
}
while (result2 !== null) {
result1.push(result2);
result2 = parse_braced();
if (result2 === null) {
result2 = parse_nonBraceCharacter();
}
}
if (result1 !== null) {
if (input.charCodeAt(pos) === 125) {
result2 = "}";
pos += 1;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\"}\"");
}
}
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(parts) {
return "{" + parts.join("") + "}";
})(result0[1]);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_nonBraceCharacters() {
var cacheKey = 'nonBraceCharacters@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1;
var pos0, pos1;
pos0 = pos;
result1 = parse_nonBraceCharacter();
if (result1 !== null) {
result0 = [];
while (result1 !== null) {
result0.push(result1);
result1 = parse_nonBraceCharacter();
}
} else {
result0 = null;
}
if (result0 !== null) {
result0 = (function(chars) { return chars.join(""); })(result0);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_nonBraceCharacter() {
var cacheKey = 'nonBraceCharacter@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0;
var pos0;
if (/^[^{}]/.test(input.charAt(pos))) {
result0 = input.charAt(pos);
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("[^{}]");
}
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_equals() {
var cacheKey = 'equals@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 61) {
result0 = "=";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"=\"");
}
}
if (result0 !== null) {
result1 = parse___();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function() { return "="; })();
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_colon() {
var cacheKey = 'colon@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 58) {
result0 = ":";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\":\"");
}
}
if (result0 !== null) {
result1 = parse___();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function() { return ":"; })();
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_semicolon() {
var cacheKey = 'semicolon@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 59) {
result0 = ";";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\";\"");
}
}
if (result0 !== null) {
result1 = parse___();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function() { return ";"; })();
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_slash() {
var cacheKey = 'slash@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 47) {
result0 = "/";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"/\"");
}
}
if (result0 !== null) {
result1 = parse___();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function() { return "/"; })();
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_and() {
var cacheKey = 'and@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 38) {
result0 = "&";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"&\"");
}
}
if (result0 !== null) {
result1 = parse___();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function() { return "&"; })();
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_not() {
var cacheKey = 'not@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 33) {
result0 = "!";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"!\"");
}
}
if (result0 !== null) {
result1 = parse___();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function() { return "!"; })();
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_question() {
var cacheKey = 'question@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 63) {
result0 = "?";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"?\"");
}
}
if (result0 !== null) {
result1 = parse___();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function() { return "?"; })();
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_star() {
var cacheKey = 'star@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 42) {
result0 = "*";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"*\"");
}
}
if (result0 !== null) {
result1 = parse___();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function() { return "*"; })();
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_plus() {
var cacheKey = 'plus@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 43) {
result0 = "+";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"+\"");
}
}
if (result0 !== null) {
result1 = parse___();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function() { return "+"; })();
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_lparen() {
var cacheKey = 'lparen@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 40) {
result0 = "(";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"(\"");
}
}
if (result0 !== null) {
result1 = parse___();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function() { return "("; })();
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_rparen() {
var cacheKey = 'rparen@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 41) {
result0 = ")";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\")\"");
}
}
if (result0 !== null) {
result1 = parse___();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function() { return ")"; })();
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_dot() {
var cacheKey = 'dot@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 46) {
result0 = ".";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\".\"");
}
}
if (result0 !== null) {
result1 = parse___();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function() { return "."; })();
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_identifier() {
var cacheKey = 'identifier@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2, result3;
var pos0, pos1, pos2;
reportFailures++;
pos0 = pos;
pos1 = pos;
result0 = parse_letter();
if (result0 === null) {
if (input.charCodeAt(pos) === 95) {
result0 = "_";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"_\"");
}
}
if (result0 === null) {
if (input.charCodeAt(pos) === 36) {
result0 = "$";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"$\"");
}
}
}
}
if (result0 !== null) {
result1 = [];
result2 = parse_letter();
if (result2 === null) {
result2 = parse_digit();
if (result2 === null) {
if (input.charCodeAt(pos) === 95) {
result2 = "_";
pos += 1;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\"_\"");
}
}
if (result2 === null) {
if (input.charCodeAt(pos) === 36) {
result2 = "$";
pos += 1;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\"$\"");
}
}
}
}
}
while (result2 !== null) {
result1.push(result2);
result2 = parse_letter();
if (result2 === null) {
result2 = parse_digit();
if (result2 === null) {
if (input.charCodeAt(pos) === 95) {
result2 = "_";
pos += 1;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\"_\"");
}
}
if (result2 === null) {
if (input.charCodeAt(pos) === 36) {
result2 = "$";
pos += 1;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\"$\"");
}
}
}
}
}
}
if (result1 !== null) {
result2 = parse___();
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(head, tail) {
return head + tail.join("");
})(result0[0], result0[1]);
}
if (result0 === null) {
pos = pos0;
}
reportFailures--;
if (reportFailures === 0 && result0 === null) {
matchFailed("identifier");
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_literal() {
var cacheKey = 'literal@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
reportFailures++;
pos0 = pos;
pos1 = pos;
result0 = parse_doubleQuotedLiteral();
if (result0 === null) {
result0 = parse_singleQuotedLiteral();
}
if (result0 !== null) {
result1 = parse___();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(literal) { return literal; })(result0[0]);
}
if (result0 === null) {
pos = pos0;
}
reportFailures--;
if (reportFailures === 0 && result0 === null) {
matchFailed("literal");
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_doubleQuotedLiteral() {
var cacheKey = 'doubleQuotedLiteral@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2, result3;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 34) {
result0 = "\"";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\\"\"");
}
}
if (result0 !== null) {
result1 = [];
result2 = parse_doubleQuotedCharacter();
while (result2 !== null) {
result1.push(result2);
result2 = parse_doubleQuotedCharacter();
}
if (result1 !== null) {
if (input.charCodeAt(pos) === 34) {
result2 = "\"";
pos += 1;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\"\\\"\"");
}
}
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(chars) { return chars.join(""); })(result0[1]);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_doubleQuotedCharacter() {
var cacheKey = 'doubleQuotedCharacter@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0;
var pos0;
result0 = parse_simpleDoubleQuotedCharacter();
if (result0 === null) {
result0 = parse_simpleEscapeSequence();
if (result0 === null) {
result0 = parse_zeroEscapeSequence();
if (result0 === null) {
result0 = parse_hexEscapeSequence();
if (result0 === null) {
result0 = parse_unicodeEscapeSequence();
if (result0 === null) {
result0 = parse_eolEscapeSequence();
}
}
}
}
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_simpleDoubleQuotedCharacter() {
var cacheKey = 'simpleDoubleQuotedCharacter@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2, pos3;
pos0 = pos;
pos1 = pos;
pos2 = pos;
reportFailures++;
if (input.charCodeAt(pos) === 34) {
result0 = "\"";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\\"\"");
}
}
if (result0 === null) {
if (input.charCodeAt(pos) === 92) {
result0 = "\\";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\\\\"");
}
}
if (result0 === null) {
result0 = parse_eolChar();
}
}
reportFailures--;
if (result0 === null) {
result0 = '';
} else {
result0 = null;
pos = pos2;
}
if (result0 !== null) {
if (input.length > pos) {
result1 = input.charAt(pos);
pos++;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed('any character');
}
}
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(char_) { return char_; })(result0[1]);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_singleQuotedLiteral() {
var cacheKey = 'singleQuotedLiteral@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2, result3;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 39) {
result0 = "'";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"'\"");
}
}
if (result0 !== null) {
result1 = [];
result2 = parse_singleQuotedCharacter();
while (result2 !== null) {
result1.push(result2);
result2 = parse_singleQuotedCharacter();
}
if (result1 !== null) {
if (input.charCodeAt(pos) === 39) {
result2 = "'";
pos += 1;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\"'\"");
}
}
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(chars) { return chars.join(""); })(result0[1]);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_singleQuotedCharacter() {
var cacheKey = 'singleQuotedCharacter@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0;
var pos0;
result0 = parse_simpleSingleQuotedCharacter();
if (result0 === null) {
result0 = parse_simpleEscapeSequence();
if (result0 === null) {
result0 = parse_zeroEscapeSequence();
if (result0 === null) {
result0 = parse_hexEscapeSequence();
if (result0 === null) {
result0 = parse_unicodeEscapeSequence();
if (result0 === null) {
result0 = parse_eolEscapeSequence();
}
}
}
}
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_simpleSingleQuotedCharacter() {
var cacheKey = 'simpleSingleQuotedCharacter@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2, pos3;
pos0 = pos;
pos1 = pos;
pos2 = pos;
reportFailures++;
if (input.charCodeAt(pos) === 39) {
result0 = "'";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"'\"");
}
}
if (result0 === null) {
if (input.charCodeAt(pos) === 92) {
result0 = "\\";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\\\\"");
}
}
if (result0 === null) {
result0 = parse_eolChar();
}
}
reportFailures--;
if (result0 === null) {
result0 = '';
} else {
result0 = null;
pos = pos2;
}
if (result0 !== null) {
if (input.length > pos) {
result1 = input.charAt(pos);
pos++;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed('any character');
}
}
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(char_) { return char_; })(result0[1]);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_class() {
var cacheKey = 'class@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2, result3, result4, result5;
var pos0, pos1, pos2;
reportFailures++;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 91) {
result0 = "[";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"[\"");
}
}
if (result0 !== null) {
if (input.charCodeAt(pos) === 94) {
result1 = "^";
pos += 1;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\"^\"");
}
}
result1 = result1 !== null ? result1 : '';
if (result1 !== null) {
result2 = [];
result3 = parse_classCharacterRange();
if (result3 === null) {
result3 = parse_classCharacter();
}
while (result3 !== null) {
result2.push(result3);
result3 = parse_classCharacterRange();
if (result3 === null) {
result3 = parse_classCharacter();
}
}
if (result2 !== null) {
if (input.charCodeAt(pos) === 93) {
result3 = "]";
pos += 1;
} else {
result3 = null;
if (reportFailures === 0) {
matchFailed("\"]\"");
}
}
if (result3 !== null) {
result4 = parse___();
if (result4 !== null) {
result0 = [result0, result1, result2, result3, result4];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(inverted, parts) {
var partsConverted = map(parts, function(part) { return part.data; });
var rawText = "["
+ inverted
+ map(parts, function(part) { return part.rawText; }).join("")
+ "]";
return {
type: "class",
inverted: inverted === "^",
parts: partsConverted,
// FIXME: Get the raw text from the input directly.
rawText: rawText
};
})(result0[1], result0[2]);
}
if (result0 === null) {
pos = pos0;
}
reportFailures--;
if (reportFailures === 0 && result0 === null) {
matchFailed("character class");
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_classCharacterRange() {
var cacheKey = 'classCharacterRange@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2, result3;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
result0 = parse_classCharacter();
if (result0 !== null) {
if (input.charCodeAt(pos) === 45) {
result1 = "-";
pos += 1;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\"-\"");
}
}
if (result1 !== null) {
result2 = parse_classCharacter();
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(begin, end) {
if (begin.data.charCodeAt(0) > end.data.charCodeAt(0)) {
throw new this.SyntaxError(
"Invalid character range: " + begin.rawText + "-" + end.rawText + "."
);
}
return {
data: [begin.data, end.data],
// FIXME: Get the raw text from the input directly.
rawText: begin.rawText + "-" + end.rawText
};
})(result0[0], result0[2]);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_classCharacter() {
var cacheKey = 'classCharacter@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0;
var pos0, pos1;
pos0 = pos;
result0 = parse_bracketDelimitedCharacter();
if (result0 !== null) {
result0 = (function(char_) {
return {
data: char_,
// FIXME: Get the raw text from the input directly.
rawText: quoteForRegexpClass(char_)
};
})(result0);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_bracketDelimitedCharacter() {
var cacheKey = 'bracketDelimitedCharacter@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0;
var pos0;
result0 = parse_simpleBracketDelimitedCharacter();
if (result0 === null) {
result0 = parse_simpleEscapeSequence();
if (result0 === null) {
result0 = parse_zeroEscapeSequence();
if (result0 === null) {
result0 = parse_hexEscapeSequence();
if (result0 === null) {
result0 = parse_unicodeEscapeSequence();
if (result0 === null) {
result0 = parse_eolEscapeSequence();
}
}
}
}
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_simpleBracketDelimitedCharacter() {
var cacheKey = 'simpleBracketDelimitedCharacter@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2, pos3;
pos0 = pos;
pos1 = pos;
pos2 = pos;
reportFailures++;
if (input.charCodeAt(pos) === 93) {
result0 = "]";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"]\"");
}
}
if (result0 === null) {
if (input.charCodeAt(pos) === 92) {
result0 = "\\";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\\\\"");
}
}
if (result0 === null) {
result0 = parse_eolChar();
}
}
reportFailures--;
if (result0 === null) {
result0 = '';
} else {
result0 = null;
pos = pos2;
}
if (result0 !== null) {
if (input.length > pos) {
result1 = input.charAt(pos);
pos++;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed('any character');
}
}
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(char_) { return char_; })(result0[1]);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_simpleEscapeSequence() {
var cacheKey = 'simpleEscapeSequence@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2, result3;
var pos0, pos1, pos2, pos3;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 92) {
result0 = "\\";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\\\\"");
}
}
if (result0 !== null) {
pos2 = pos;
reportFailures++;
result1 = parse_digit();
if (result1 === null) {
if (input.charCodeAt(pos) === 120) {
result1 = "x";
pos += 1;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\"x\"");
}
}
if (result1 === null) {
if (input.charCodeAt(pos) === 117) {
result1 = "u";
pos += 1;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\"u\"");
}
}
if (result1 === null) {
result1 = parse_eolChar();
}
}
}
reportFailures--;
if (result1 === null) {
result1 = '';
} else {
result1 = null;
pos = pos2;
}
if (result1 !== null) {
if (input.length > pos) {
result2 = input.charAt(pos);
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed('any character');
}
}
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(char_) {
return char_
.replace("b", "\b")
.replace("f", "\f")
.replace("n", "\n")
.replace("r", "\r")
.replace("t", "\t")
.replace("v", "\x0B"); // IE does not recognize "\v".
})(result0[2]);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_zeroEscapeSequence() {
var cacheKey = 'zeroEscapeSequence@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2, pos3;
pos0 = pos;
pos1 = pos;
if (input.substr(pos, 2) === "\\0") {
result0 = "\\0";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\\\0\"");
}
}
if (result0 !== null) {
pos2 = pos;
reportFailures++;
result1 = parse_digit();
reportFailures--;
if (result1 === null) {
result1 = '';
} else {
result1 = null;
pos = pos2;
}
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function() { return "\x00"; })();
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_hexEscapeSequence() {
var cacheKey = 'hexEscapeSequence@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2, result3;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.substr(pos, 2) === "\\x") {
result0 = "\\x";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\\\x\"");
}
}
if (result0 !== null) {
result1 = parse_hexDigit();
if (result1 !== null) {
result2 = parse_hexDigit();
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(h1, h2) {
return String.fromCharCode(parseInt(h1 + h2, 16));
})(result0[1], result0[2]);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_unicodeEscapeSequence() {
var cacheKey = 'unicodeEscapeSequence@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2, result3, result4, result5;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.substr(pos, 2) === "\\u") {
result0 = "\\u";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\\\u\"");
}
}
if (result0 !== null) {
result1 = parse_hexDigit();
if (result1 !== null) {
result2 = parse_hexDigit();
if (result2 !== null) {
result3 = parse_hexDigit();
if (result3 !== null) {
result4 = parse_hexDigit();
if (result4 !== null) {
result0 = [result0, result1, result2, result3, result4];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(h1, h2, h3, h4) {
return String.fromCharCode(parseInt(h1 + h2 + h3 + h4, 16));
})(result0[1], result0[2], result0[3], result0[4]);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_eolEscapeSequence() {
var cacheKey = 'eolEscapeSequence@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 92) {
result0 = "\\";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\\\\"");
}
}
if (result0 !== null) {
result1 = parse_eol();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(eol) { return eol; })(result0[1]);
}
if (result0 === null) {
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_digit() {
var cacheKey = 'digit@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0;
var pos0;
if (/^[0-9]/.test(input.charAt(pos))) {
result0 = input.charAt(pos);
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("[0-9]");
}
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_hexDigit() {
var cacheKey = 'hexDigit@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0;
var pos0;
if (/^[0-9a-fA-F]/.test(input.charAt(pos))) {
result0 = input.charAt(pos);
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("[0-9a-fA-F]");
}
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_letter() {
var cacheKey = 'letter@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0;
var pos0;
result0 = parse_lowerCaseLetter();
if (result0 === null) {
result0 = parse_upperCaseLetter();
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_lowerCaseLetter() {
var cacheKey = 'lowerCaseLetter@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0;
var pos0;
if (/^[a-z]/.test(input.charAt(pos))) {
result0 = input.charAt(pos);
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("[a-z]");
}
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_upperCaseLetter() {
var cacheKey = 'upperCaseLetter@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0;
var pos0;
if (/^[A-Z]/.test(input.charAt(pos))) {
result0 = input.charAt(pos);
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("[A-Z]");
}
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse___() {
var cacheKey = '__@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1;
var pos0;
result0 = [];
result1 = parse_whitespace();
if (result1 === null) {
result1 = parse_eol();
if (result1 === null) {
result1 = parse_comment();
}
}
while (result1 !== null) {
result0.push(result1);
result1 = parse_whitespace();
if (result1 === null) {
result1 = parse_eol();
if (result1 === null) {
result1 = parse_comment();
}
}
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_comment() {
var cacheKey = 'comment@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0;
var pos0;
reportFailures++;
result0 = parse_singleLineComment();
if (result0 === null) {
result0 = parse_multiLineComment();
}
reportFailures--;
if (reportFailures === 0 && result0 === null) {
matchFailed("comment");
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_singleLineComment() {
var cacheKey = 'singleLineComment@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2, result3, result4, result5;
var pos0, pos1, pos2, pos3;
pos0 = pos;
if (input.substr(pos, 2) === "//") {
result0 = "//";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"//\"");
}
}
if (result0 !== null) {
result1 = [];
pos1 = pos;
pos2 = pos;
reportFailures++;
result2 = parse_eolChar();
reportFailures--;
if (result2 === null) {
result2 = '';
} else {
result2 = null;
pos = pos2;
}
if (result2 !== null) {
if (input.length > pos) {
result3 = input.charAt(pos);
pos++;
} else {
result3 = null;
if (reportFailures === 0) {
matchFailed('any character');
}
}
if (result3 !== null) {
result2 = [result2, result3];
} else {
result2 = null;
pos = pos1;
}
} else {
result2 = null;
pos = pos1;
}
while (result2 !== null) {
result1.push(result2);
pos1 = pos;
pos2 = pos;
reportFailures++;
result2 = parse_eolChar();
reportFailures--;
if (result2 === null) {
result2 = '';
} else {
result2 = null;
pos = pos2;
}
if (result2 !== null) {
if (input.length > pos) {
result3 = input.charAt(pos);
pos++;
} else {
result3 = null;
if (reportFailures === 0) {
matchFailed('any character');
}
}
if (result3 !== null) {
result2 = [result2, result3];
} else {
result2 = null;
pos = pos1;
}
} else {
result2 = null;
pos = pos1;
}
}
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos0;
}
} else {
result0 = null;
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_multiLineComment() {
var cacheKey = 'multiLineComment@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0, result1, result2, result3, result4, result5;
var pos0, pos1, pos2, pos3;
pos0 = pos;
if (input.substr(pos, 2) === "/*") {
result0 = "/*";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"/*\"");
}
}
if (result0 !== null) {
result1 = [];
pos1 = pos;
pos2 = pos;
reportFailures++;
if (input.substr(pos, 2) === "*/") {
result2 = "*/";
pos += 2;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\"*/\"");
}
}
reportFailures--;
if (result2 === null) {
result2 = '';
} else {
result2 = null;
pos = pos2;
}
if (result2 !== null) {
if (input.length > pos) {
result3 = input.charAt(pos);
pos++;
} else {
result3 = null;
if (reportFailures === 0) {
matchFailed('any character');
}
}
if (result3 !== null) {
result2 = [result2, result3];
} else {
result2 = null;
pos = pos1;
}
} else {
result2 = null;
pos = pos1;
}
while (result2 !== null) {
result1.push(result2);
pos1 = pos;
pos2 = pos;
reportFailures++;
if (input.substr(pos, 2) === "*/") {
result2 = "*/";
pos += 2;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\"*/\"");
}
}
reportFailures--;
if (result2 === null) {
result2 = '';
} else {
result2 = null;
pos = pos2;
}
if (result2 !== null) {
if (input.length > pos) {
result3 = input.charAt(pos);
pos++;
} else {
result3 = null;
if (reportFailures === 0) {
matchFailed('any character');
}
}
if (result3 !== null) {
result2 = [result2, result3];
} else {
result2 = null;
pos = pos1;
}
} else {
result2 = null;
pos = pos1;
}
}
if (result1 !== null) {
if (input.substr(pos, 2) === "*/") {
result2 = "*/";
pos += 2;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\"*/\"");
}
}
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos0;
}
} else {
result0 = null;
pos = pos0;
}
} else {
result0 = null;
pos = pos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_eol() {
var cacheKey = 'eol@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0;
var pos0;
reportFailures++;
if (input.charCodeAt(pos) === 10) {
result0 = "\n";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\n\"");
}
}
if (result0 === null) {
if (input.substr(pos, 2) === "\r\n") {
result0 = "\r\n";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\r\\n\"");
}
}
if (result0 === null) {
if (input.charCodeAt(pos) === 13) {
result0 = "\r";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\r\"");
}
}
if (result0 === null) {
if (input.charCodeAt(pos) === 8232) {
result0 = "\u2028";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\u2028\"");
}
}
if (result0 === null) {
if (input.charCodeAt(pos) === 8233) {
result0 = "\u2029";
pos += 1;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\u2029\"");
}
}
}
}
}
}
reportFailures--;
if (reportFailures === 0 && result0 === null) {
matchFailed("end of line");
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_eolChar() {
var cacheKey = 'eolChar@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0;
var pos0;
if (/^[\n\r\u2028\u2029]/.test(input.charAt(pos))) {
result0 = input.charAt(pos);
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("[\\n\\r\\u2028\\u2029]");
}
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_whitespace() {
var cacheKey = 'whitespace@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result0;
var pos0;
reportFailures++;
if (/^[ \xA0\uFEFF\u1680\u180E\u2000-\u200A\u202F\u205F\u3000]/.test(input.charAt(pos))) {
result0 = input.charAt(pos);
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("[ \t\x0B\f\\xA0\\uFEFF\\u1680\\u180E\\u2000-\\u200A\\u202F\\u205F\\u3000]");
}
}
reportFailures--;
if (reportFailures === 0 && result0 === null) {
matchFailed("whitespace");
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function buildErrorMessage() {
function buildExpected(failuresExpected) {
failuresExpected.sort();
var lastFailure = null;
var failuresExpectedUnique = [];
for (var i = 0; i < failuresExpected.length; i++) {
if (failuresExpected[i] !== lastFailure) {
failuresExpectedUnique.push(failuresExpected[i]);
lastFailure = failuresExpected[i];
}
}
switch (failuresExpectedUnique.length) {
case 0:
return 'end of input';
case 1:
return failuresExpectedUnique[0];
default:
return failuresExpectedUnique.slice(0, failuresExpectedUnique.length - 1).join(', ')
+ ' or '
+ failuresExpectedUnique[failuresExpectedUnique.length - 1];
}
}
var expected = buildExpected(rightmostFailuresExpected);
var actualPos = Math.max(pos, rightmostFailuresPos);
var actual = actualPos < input.length
? quote(input.charAt(actualPos))
: 'end of input';
return 'Expected ' + expected + ' but ' + actual + ' found.';
}
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 < 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]();
/*
* The parser is now in one of the following three states:
*
* 1. The parser successfully parsed the whole input.
*
* - |result !== null|
* - |pos === 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|
* - |rightmostFailuresExpected| may or may not contain something
*
* 3. The parser did not successfully parse any part of the input.
*
* - |result === null|
* - |pos === 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 errorPosition = computeErrorPosition();
throw new this.SyntaxError(
buildErrorMessage(),
errorPosition.line,
errorPosition.column
);
}
return result;
},
/* Returns the parser source code. */
toSource: function() { return this._source; }
};
/* Thrown when a parser encounters a syntax error. */
result.SyntaxError = function(message, line, column) {
this.name = 'SyntaxError';
this.message = message;
this.line = line;
this.column = column;
};
result.SyntaxError.prototype = Error.prototype;
return result;
})();