query.js
Version:
query.js is an abstract query language which can be mapped to different query language implementation.
1,461 lines (1,332 loc) • 42.2 kB
JavaScript
var exports = (typeof(exports) === "undefined" ? this : exports); exports.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 = {
"HEXDIG": parse_HEXDIG,
"and": parse_and,
"argument": parse_argument,
"array": parse_array,
"callOperator": parse_callOperator,
"comparator": parse_comparator,
"comparison": parse_comparison,
"group": parse_group,
"name": parse_name,
"nchar": parse_nchar,
"operator": parse_operator,
"or": parse_or,
"pctEncoded": parse_pctEncoded,
"typedValue": parse_typedValue,
"unreserved": parse_unreserved,
"value": parse_value
};
if (startRule !== undefined) {
if (parseFunctions[startRule] === undefined) {
throw new Error("Invalid rule name: " + quote(startRule) + ".");
}
} else {
startRule = "and";
}
var pos = 0;
var reportMatchFailures = true;
var rightmostMatchFailuresPos = 0;
var rightmostMatchFailuresExpected = [];
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);
if (charCode <= 0xFF) {
var escapeChar = 'x';
var length = 2;
} else {
var escapeChar = 'u';
var 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.
*/
return '"' + s
.replace(/\\/g, '\\\\') // backslash
.replace(/"/g, '\\"') // closing quote character
.replace(/\r/g, '\\r') // carriage return
.replace(/\n/g, '\\n') // line feed
.replace(/[\x80-\uFFFF]/g, escape) // non-ASCII characters
+ '"';
}
function matchFailed(failure) {
if (pos < rightmostMatchFailuresPos) {
return;
}
if (pos > rightmostMatchFailuresPos) {
rightmostMatchFailuresPos = pos;
rightmostMatchFailuresExpected = [];
}
rightmostMatchFailuresExpected.push(failure);
}
function parse_and() {
var cacheKey = 'and@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var savedPos0 = pos;
var savedPos1 = pos;
var result3 = parse_operator();
if (result3 !== null) {
var result4 = [];
var savedPos2 = pos;
var savedPos3 = pos;
if (input.substr(pos, 5) === " and ") {
var result8 = " and ";
pos += 5;
} else {
var result8 = null;
if (reportMatchFailures) {
matchFailed("\" and \"");
}
}
if (result8 !== null) {
var result9 = parse_operator();
if (result9 !== null) {
var result6 = [result8, result9];
} else {
var result6 = null;
pos = savedPos3;
}
} else {
var result6 = null;
pos = savedPos3;
}
var result7 = result6 !== null
? (function(o) { return o; })(result6[1])
: null;
if (result7 !== null) {
var result5 = result7;
} else {
var result5 = null;
pos = savedPos2;
}
while (result5 !== null) {
result4.push(result5);
var savedPos2 = pos;
var savedPos3 = pos;
if (input.substr(pos, 5) === " and ") {
var result8 = " and ";
pos += 5;
} else {
var result8 = null;
if (reportMatchFailures) {
matchFailed("\" and \"");
}
}
if (result8 !== null) {
var result9 = parse_operator();
if (result9 !== null) {
var result6 = [result8, result9];
} else {
var result6 = null;
pos = savedPos3;
}
} else {
var result6 = null;
pos = savedPos3;
}
var result7 = result6 !== null
? (function(o) { return o; })(result6[1])
: null;
if (result7 !== null) {
var result5 = result7;
} else {
var result5 = null;
pos = savedPos2;
}
}
if (result4 !== null) {
var result1 = [result3, result4];
} else {
var result1 = null;
pos = savedPos1;
}
} else {
var result1 = null;
pos = savedPos1;
}
var result2 = result1 !== null
? (function(o, rp) { return o ? { type: "group", name: "and", args: [o].concat(rp) } : null; })(result1[0], result1[1])
: null;
if (result2 !== null) {
var result0 = result2;
} else {
var result0 = null;
pos = savedPos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_operator() {
var cacheKey = 'operator@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result3 = parse_comparison();
if (result3 !== null) {
var result0 = result3;
} else {
var result2 = parse_callOperator();
if (result2 !== null) {
var result0 = result2;
} else {
var result1 = parse_group();
if (result1 !== null) {
var result0 = result1;
} else {
var result0 = null;;
};
};
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_callOperator() {
var cacheKey = 'callOperator@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var savedPos0 = pos;
var savedPos1 = pos;
var result3 = parse_name();
if (result3 !== null) {
if (input.substr(pos, 1) === "(") {
var result4 = "(";
pos += 1;
} else {
var result4 = null;
if (reportMatchFailures) {
matchFailed("\"(\"");
}
}
if (result4 !== null) {
var savedPos2 = pos;
var savedPos3 = pos;
var result10 = parse_argument();
if (result10 !== null) {
var result11 = [];
var savedPos4 = pos;
var savedPos5 = pos;
if (input.substr(pos, 1) === ",") {
var result15 = ",";
pos += 1;
} else {
var result15 = null;
if (reportMatchFailures) {
matchFailed("\",\"");
}
}
if (result15 !== null) {
var result16 = parse_argument();
if (result16 !== null) {
var result13 = [result15, result16];
} else {
var result13 = null;
pos = savedPos5;
}
} else {
var result13 = null;
pos = savedPos5;
}
var result14 = result13 !== null
? (function(a) { return a })(result13[1])
: null;
if (result14 !== null) {
var result12 = result14;
} else {
var result12 = null;
pos = savedPos4;
}
while (result12 !== null) {
result11.push(result12);
var savedPos4 = pos;
var savedPos5 = pos;
if (input.substr(pos, 1) === ",") {
var result15 = ",";
pos += 1;
} else {
var result15 = null;
if (reportMatchFailures) {
matchFailed("\",\"");
}
}
if (result15 !== null) {
var result16 = parse_argument();
if (result16 !== null) {
var result13 = [result15, result16];
} else {
var result13 = null;
pos = savedPos5;
}
} else {
var result13 = null;
pos = savedPos5;
}
var result14 = result13 !== null
? (function(a) { return a })(result13[1])
: null;
if (result14 !== null) {
var result12 = result14;
} else {
var result12 = null;
pos = savedPos4;
}
}
if (result11 !== null) {
var result8 = [result10, result11];
} else {
var result8 = null;
pos = savedPos3;
}
} else {
var result8 = null;
pos = savedPos3;
}
var result9 = result8 !== null
? (function(a, rp) { return [a].concat(rp) })(result8[0], result8[1])
: null;
if (result9 !== null) {
var result7 = result9;
} else {
var result7 = null;
pos = savedPos2;
}
var result5 = result7 !== null ? result7 : '';
if (result5 !== null) {
if (input.substr(pos, 1) === ")") {
var result6 = ")";
pos += 1;
} else {
var result6 = null;
if (reportMatchFailures) {
matchFailed("\")\"");
}
}
if (result6 !== null) {
var result1 = [result3, result4, result5, result6];
} else {
var result1 = null;
pos = savedPos1;
}
} else {
var result1 = null;
pos = savedPos1;
}
} else {
var result1 = null;
pos = savedPos1;
}
} else {
var result1 = null;
pos = savedPos1;
}
var result2 = result1 !== null
? (function(n, args) { return { name: n, args: args }; })(result1[0], result1[2])
: null;
if (result2 !== null) {
var result0 = result2;
} else {
var result0 = null;
pos = savedPos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_argument() {
var cacheKey = 'argument@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result2 = parse_callOperator();
if (result2 !== null) {
var result0 = result2;
} else {
var result1 = parse_value();
if (result1 !== null) {
var result0 = result1;
} else {
var result0 = null;;
};
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_value() {
var cacheKey = 'value@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var savedPos0 = pos;
var result6 = parse_nchar();
if (result6 !== null) {
var result4 = [];
while (result6 !== null) {
result4.push(result6);
var result6 = parse_nchar();
}
} else {
var result4 = null;
}
var result5 = result4 !== null
? (function(n) { return n.join(""); })(result4)
: null;
if (result5 !== null) {
var result3 = result5;
} else {
var result3 = null;
pos = savedPos0;
}
if (result3 !== null) {
var result0 = result3;
} else {
var result2 = parse_typedValue();
if (result2 !== null) {
var result0 = result2;
} else {
var result1 = parse_array();
if (result1 !== null) {
var result0 = result1;
} else {
var result0 = null;;
};
};
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_typedValue() {
var cacheKey = 'typedValue@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var savedPos0 = pos;
var savedPos1 = pos;
var result7 = parse_nchar();
if (result7 !== null) {
var result3 = [];
while (result7 !== null) {
result3.push(result7);
var result7 = parse_nchar();
}
} else {
var result3 = null;
}
if (result3 !== null) {
if (input.substr(pos, 1) === ":") {
var result4 = ":";
pos += 1;
} else {
var result4 = null;
if (reportMatchFailures) {
matchFailed("\":\"");
}
}
if (result4 !== null) {
var result6 = parse_nchar();
if (result6 !== null) {
var result5 = [];
while (result6 !== null) {
result5.push(result6);
var result6 = parse_nchar();
}
} else {
var result5 = null;
}
if (result5 !== null) {
var result1 = [result3, result4, result5];
} else {
var result1 = null;
pos = savedPos1;
}
} else {
var result1 = null;
pos = savedPos1;
}
} else {
var result1 = null;
pos = savedPos1;
}
var result2 = result1 !== null
? (function(c, v) { return { type: c.join(""), value: v.join("") } })(result1[0], result1[2])
: null;
if (result2 !== null) {
var result0 = result2;
} else {
var result0 = null;
pos = savedPos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_array() {
var cacheKey = 'array@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var savedPos0 = pos;
var savedPos1 = pos;
if (input.substr(pos, 1) === "(") {
var result3 = "(";
pos += 1;
} else {
var result3 = null;
if (reportMatchFailures) {
matchFailed("\"(\"");
}
}
if (result3 !== null) {
var result4 = parse_value();
if (result4 !== null) {
var result5 = [];
var savedPos2 = pos;
var savedPos3 = pos;
if (input.substr(pos, 1) === ",") {
var result10 = ",";
pos += 1;
} else {
var result10 = null;
if (reportMatchFailures) {
matchFailed("\",\"");
}
}
if (result10 !== null) {
var result11 = parse_value();
if (result11 !== null) {
var result8 = [result10, result11];
} else {
var result8 = null;
pos = savedPos3;
}
} else {
var result8 = null;
pos = savedPos3;
}
var result9 = result8 !== null
? (function(iv) {return iv;})(result8[1])
: null;
if (result9 !== null) {
var result7 = result9;
} else {
var result7 = null;
pos = savedPos2;
}
while (result7 !== null) {
result5.push(result7);
var savedPos2 = pos;
var savedPos3 = pos;
if (input.substr(pos, 1) === ",") {
var result10 = ",";
pos += 1;
} else {
var result10 = null;
if (reportMatchFailures) {
matchFailed("\",\"");
}
}
if (result10 !== null) {
var result11 = parse_value();
if (result11 !== null) {
var result8 = [result10, result11];
} else {
var result8 = null;
pos = savedPos3;
}
} else {
var result8 = null;
pos = savedPos3;
}
var result9 = result8 !== null
? (function(iv) {return iv;})(result8[1])
: null;
if (result9 !== null) {
var result7 = result9;
} else {
var result7 = null;
pos = savedPos2;
}
}
if (result5 !== null) {
if (input.substr(pos, 1) === ")") {
var result6 = ")";
pos += 1;
} else {
var result6 = null;
if (reportMatchFailures) {
matchFailed("\")\"");
}
}
if (result6 !== null) {
var result1 = [result3, result4, result5, result6];
} else {
var result1 = null;
pos = savedPos1;
}
} else {
var result1 = null;
pos = savedPos1;
}
} else {
var result1 = null;
pos = savedPos1;
}
} else {
var result1 = null;
pos = savedPos1;
}
var result2 = result1 !== null
? (function(v, rv) { return [v].concat(rv); })(result1[1], result1[2])
: null;
if (result2 !== null) {
var result0 = result2;
} else {
var result0 = null;
pos = savedPos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_name() {
var cacheKey = 'name@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var savedPos0 = pos;
var result3 = parse_nchar();
if (result3 !== null) {
var result1 = [];
while (result3 !== null) {
result1.push(result3);
var result3 = parse_nchar();
}
} else {
var result1 = null;
}
var result2 = result1 !== null
? (function(r) { return r.join(""); })(result1)
: null;
if (result2 !== null) {
var result0 = result2;
} else {
var result0 = null;
pos = savedPos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_comparator() {
var cacheKey = 'comparator@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var savedPos4 = pos;
if (input.substr(pos, 1) === "=") {
var result14 = "=";
pos += 1;
} else {
var result14 = null;
if (reportMatchFailures) {
matchFailed("\"=\"");
}
}
var result15 = result14 !== null
? (function() {return "eql";})()
: null;
if (result15 !== null) {
var result13 = result15;
} else {
var result13 = null;
pos = savedPos4;
}
if (result13 !== null) {
var result0 = result13;
} else {
var savedPos3 = pos;
if (input.substr(pos, 2) === ">=") {
var result11 = ">=";
pos += 2;
} else {
var result11 = null;
if (reportMatchFailures) {
matchFailed("\">=\"");
}
}
var result12 = result11 !== null
? (function() { return "gte"; })()
: null;
if (result12 !== null) {
var result10 = result12;
} else {
var result10 = null;
pos = savedPos3;
}
if (result10 !== null) {
var result0 = result10;
} else {
var savedPos2 = pos;
if (input.substr(pos, 2) === "<=") {
var result8 = "<=";
pos += 2;
} else {
var result8 = null;
if (reportMatchFailures) {
matchFailed("\"<=\"");
}
}
var result9 = result8 !== null
? (function() { return "lte" })()
: null;
if (result9 !== null) {
var result7 = result9;
} else {
var result7 = null;
pos = savedPos2;
}
if (result7 !== null) {
var result0 = result7;
} else {
var savedPos1 = pos;
if (input.substr(pos, 1) === ">") {
var result5 = ">";
pos += 1;
} else {
var result5 = null;
if (reportMatchFailures) {
matchFailed("\">\"");
}
}
var result6 = result5 !== null
? (function() {return "gt"})()
: null;
if (result6 !== null) {
var result4 = result6;
} else {
var result4 = null;
pos = savedPos1;
}
if (result4 !== null) {
var result0 = result4;
} else {
var savedPos0 = pos;
if (input.substr(pos, 1) === "<") {
var result2 = "<";
pos += 1;
} else {
var result2 = null;
if (reportMatchFailures) {
matchFailed("\"<\"");
}
}
var result3 = result2 !== null
? (function() { return "lt" })()
: null;
if (result3 !== null) {
var result1 = result3;
} else {
var result1 = null;
pos = savedPos0;
}
if (result1 !== null) {
var result0 = result1;
} else {
var result0 = null;;
};
};
};
};
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_comparison() {
var cacheKey = 'comparison@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var savedPos0 = pos;
var savedPos1 = pos;
var result3 = parse_name();
if (result3 !== null) {
var result4 = parse_comparator();
if (result4 !== null) {
var result5 = parse_value();
if (result5 !== null) {
var result1 = [result3, result4, result5];
} else {
var result1 = null;
pos = savedPos1;
}
} else {
var result1 = null;
pos = savedPos1;
}
} else {
var result1 = null;
pos = savedPos1;
}
var result2 = result1 !== null
? (function(n, c, v) { return {name: c, args: [n,v] }; })(result1[0], result1[1], result1[2])
: null;
if (result2 !== null) {
var result0 = result2;
} else {
var result0 = null;
pos = savedPos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_group() {
var cacheKey = 'group@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var savedPos0 = pos;
var savedPos1 = pos;
if (input.substr(pos, 1) === "(") {
var result3 = "(";
pos += 1;
} else {
var result3 = null;
if (reportMatchFailures) {
matchFailed("\"(\"");
}
}
if (result3 !== null) {
var result7 = parse_or();
if (result7 !== null) {
var result4 = result7;
} else {
var result6 = parse_and();
if (result6 !== null) {
var result4 = result6;
} else {
var result4 = null;;
};
}
if (result4 !== null) {
if (input.substr(pos, 1) === ")") {
var result5 = ")";
pos += 1;
} else {
var result5 = null;
if (reportMatchFailures) {
matchFailed("\")\"");
}
}
if (result5 !== null) {
var result1 = [result3, result4, result5];
} else {
var result1 = null;
pos = savedPos1;
}
} else {
var result1 = null;
pos = savedPos1;
}
} else {
var result1 = null;
pos = savedPos1;
}
var result2 = result1 !== null
? (function(op) { return op; })(result1[1])
: null;
if (result2 !== null) {
var result0 = result2;
} else {
var result0 = null;
pos = savedPos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_or() {
var cacheKey = 'or@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var savedPos0 = pos;
var savedPos1 = pos;
var result3 = parse_operator();
if (result3 !== null) {
var savedPos2 = pos;
var savedPos3 = pos;
if (input.substr(pos, 4) === " or ") {
var result8 = " or ";
pos += 4;
} else {
var result8 = null;
if (reportMatchFailures) {
matchFailed("\" or \"");
}
}
if (result8 !== null) {
var result9 = parse_operator();
if (result9 !== null) {
var result6 = [result8, result9];
} else {
var result6 = null;
pos = savedPos3;
}
} else {
var result6 = null;
pos = savedPos3;
}
var result7 = result6 !== null
? (function(o) { return o; })(result6[1])
: null;
if (result7 !== null) {
var result5 = result7;
} else {
var result5 = null;
pos = savedPos2;
}
if (result5 !== null) {
var result4 = [];
while (result5 !== null) {
result4.push(result5);
var savedPos2 = pos;
var savedPos3 = pos;
if (input.substr(pos, 4) === " or ") {
var result8 = " or ";
pos += 4;
} else {
var result8 = null;
if (reportMatchFailures) {
matchFailed("\" or \"");
}
}
if (result8 !== null) {
var result9 = parse_operator();
if (result9 !== null) {
var result6 = [result8, result9];
} else {
var result6 = null;
pos = savedPos3;
}
} else {
var result6 = null;
pos = savedPos3;
}
var result7 = result6 !== null
? (function(o) { return o; })(result6[1])
: null;
if (result7 !== null) {
var result5 = result7;
} else {
var result5 = null;
pos = savedPos2;
}
}
} else {
var result4 = null;
}
if (result4 !== null) {
var result1 = [result3, result4];
} else {
var result1 = null;
pos = savedPos1;
}
} else {
var result1 = null;
pos = savedPos1;
}
var result2 = result1 !== null
? (function(o, rp) { return o ? { type: "group", name: "or", args: [o].concat(rp) } : null; })(result1[0], result1[1])
: null;
if (result2 !== null) {
var result0 = result2;
} else {
var result0 = null;
pos = savedPos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_nchar() {
var cacheKey = 'nchar@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var result3 = parse_unreserved();
if (result3 !== null) {
var result0 = result3;
} else {
if (input.substr(pos, 1) === "*") {
var result2 = "*";
pos += 1;
} else {
var result2 = null;
if (reportMatchFailures) {
matchFailed("\"*\"");
}
}
if (result2 !== null) {
var result0 = result2;
} else {
if (input.substr(pos, 1) === "+") {
var result1 = "+";
pos += 1;
} else {
var result1 = null;
if (reportMatchFailures) {
matchFailed("\"+\"");
}
}
if (result1 !== null) {
var result0 = result1;
} else {
var result0 = null;;
};
};
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_pctEncoded() {
var cacheKey = 'pctEncoded@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
var savedPos0 = pos;
if (input.substr(pos, 1) === "%") {
var result1 = "%";
pos += 1;
} else {
var result1 = null;
if (reportMatchFailures) {
matchFailed("\"%\"");
}
}
if (result1 !== null) {
var result2 = parse_HEXDIG();
if (result2 !== null) {
var result3 = parse_HEXDIG();
if (result3 !== null) {
var result0 = [result1, result2, result3];
} else {
var result0 = null;
pos = savedPos0;
}
} else {
var result0 = null;
pos = savedPos0;
}
} else {
var result0 = null;
pos = savedPos0;
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_HEXDIG() {
var cacheKey = 'HEXDIG@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
if (input.substr(pos).match(/^[a-fA-F0-9]/) !== null) {
var result0 = input.charAt(pos);
pos++;
} else {
var result0 = null;
if (reportMatchFailures) {
matchFailed("[a-fA-F0-9]");
}
}
cache[cacheKey] = {
nextPos: pos,
result: result0
};
return result0;
}
function parse_unreserved() {
var cacheKey = 'unreserved@' + pos;
var cachedResult = cache[cacheKey];
if (cachedResult) {
pos = cachedResult.nextPos;
return cachedResult.result;
}
if (input.substr(pos).match(/^[a-zA-Z]/) !== null) {
var result6 = input.charAt(pos);
pos++;
} else {
var result6 = null;
if (reportMatchFailures) {
matchFailed("[a-zA-Z]");
}
}
if (result6 !== null) {
var result0 = result6;
} else {
if (input.substr(pos).match(/^[0-9]/) !== null) {
var result5 = input.charAt(pos);
pos++;
} else {
var result5 = null;
if (reportMatchFailures) {
matchFailed("[0-9]");
}
}
if (result5 !== null) {
var result0 = result5;
} else {
if (input.substr(pos, 1) === "-") {
var result4 = "-";
pos += 1;
} else {
var result4 = null;
if (reportMatchFailures) {
matchFailed("\"-\"");
}
}
if (result4 !== null) {
var result0 = result4;
} else {
if (input.substr(pos, 1) === ".") {
var result3 = ".";
pos += 1;
} else {
var result3 = null;
if (reportMatchFailures) {
matchFailed("\".\"");
}
}
if (result3 !== null) {
var result0 = result3;
} else {
if (input.substr(pos, 1) === "_") {
var result2 = "_";
pos += 1;
} else {
var result2 = null;
if (reportMatchFailures) {
matchFailed("\"_\"");
}
}
if (result2 !== null) {
var result0 = result2;
} else {
if (input.substr(pos, 1) === "~") {
var result1 = "~";
pos += 1;
} else {
var result1 = null;
if (reportMatchFailures) {
matchFailed("\"~\"");
}
}
if (result1 !== null) {
var result0 = result1;
} else {
var result0 = null;;
};
};
};
};
};
}
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(rightmostMatchFailuresExpected);
var actualPos = Math.max(pos, rightmostMatchFailuresPos);
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 < rightmostMatchFailuresPos; 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|
* - |rightmostMatchFailuresExpected| may or may not contain something
*
* 2. The parser successfully parsed only a part of the input.
*
* - |result !== null|
* - |pos < input.length|
* - |rightmostMatchFailuresExpected| may or may not contain something
*
* 3. The parser did not successfully parse any part of the input.
*
* - |result === null|
* - |pos === 0|
* - |rightmostMatchFailuresExpected| 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;
})();