odata-parser
Version:
OData query string parser
1,646 lines (1,584 loc) • 165 kB
JavaScript
module.exports = (function(){
/*
* Generated by PEG.js 0.7.0.
*
* http://pegjs.majda.cz/
*/
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)
+ '"';
}
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 = {
"WSP": parse_WSP,
"DIGIT": parse_DIGIT,
"INT": parse_INT,
"HEXDIG": parse_HEXDIG,
"HEXDIG2": parse_HEXDIG2,
"HEXDIG4": parse_HEXDIG4,
"HEXDIG8": parse_HEXDIG8,
"SQUOTE": parse_SQUOTE,
"primitiveLiteral": parse_primitiveLiteral,
"null": parse_null,
"binary": parse_binary,
"boolean": parse_boolean,
"byte": parse_byte,
"dateTime": parse_dateTime,
"dateTimeOffset": parse_dateTimeOffset,
"dateTimeBodyA": parse_dateTimeBodyA,
"dateTimeBodyB": parse_dateTimeBodyB,
"dateTimeBodyC": parse_dateTimeBodyC,
"dateTimeBodyD": parse_dateTimeBodyD,
"dateTimeBody": parse_dateTimeBody,
"dateTimeOffsetBody": parse_dateTimeOffsetBody,
"decimal": parse_decimal,
"double": parse_double,
"guid": parse_guid,
"int32": parse_int32,
"int64": parse_int64,
"sbyte": parse_sbyte,
"single": parse_single,
"string": parse_string,
"oneToNine": parse_oneToNine,
"zeroToTwelve": parse_zeroToTwelve,
"zeroToThirteen": parse_zeroToThirteen,
"zeroToSixty": parse_zeroToSixty,
"zeroToThirtyOne": parse_zeroToThirtyOne,
"zeroToTwentyFour": parse_zeroToTwentyFour,
"year": parse_year,
"sign": parse_sign,
"nan": parse_nan,
"negativeInfinity": parse_negativeInfinity,
"positiveInfinity": parse_positiveInfinity,
"nanInfinity": parse_nanInfinity,
"unreserved": parse_unreserved,
"validstring": parse_validstring,
"escapedQuote": parse_escapedQuote,
"identifierPart": parse_identifierPart,
"identifier": parse_identifier,
"callback": parse_callback,
"top": parse_top,
"expand": parse_expand,
"expandList": parse_expandList,
"skip": parse_skip,
"format": parse_format,
"inlinecount": parse_inlinecount,
"orderby": parse_orderby,
"orderbyList": parse_orderbyList,
"select": parse_select,
"identifierPathParts": parse_identifierPathParts,
"identifierPath": parse_identifierPath,
"selectList": parse_selectList,
"filter": parse_filter,
"filterExpr": parse_filterExpr,
"booleanFunctions2Args": parse_booleanFunctions2Args,
"booleanFunc": parse_booleanFunc,
"otherFunctions1Arg": parse_otherFunctions1Arg,
"otherFunc1": parse_otherFunc1,
"otherFunctions2Arg": parse_otherFunctions2Arg,
"otherFunc2": parse_otherFunc2,
"cond": parse_cond,
"part": parse_part,
"op": parse_op,
"unsupported": parse_unsupported,
"expList": parse_expList,
"exp": parse_exp,
"query": parse_query
};
if (startRule !== undefined) {
if (parseFunctions[startRule] === undefined) {
throw new Error("Invalid rule name: " + quote(startRule) + ".");
}
} else {
startRule = "query";
}
var pos = 0;
var reportFailures = 0;
var rightmostFailuresPos = 0;
var rightmostFailuresExpected = [];
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 matchFailed(failure) {
if (pos < rightmostFailuresPos) {
return;
}
if (pos > rightmostFailuresPos) {
rightmostFailuresPos = pos;
rightmostFailuresExpected = [];
}
rightmostFailuresExpected.push(failure);
}
function parse_WSP() {
var result0;
if (input.charCodeAt(pos) === 32) {
result0 = " ";
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\" \"");
}
}
return result0;
}
function parse_DIGIT() {
var result0;
if (/^[0-9]/.test(input.charAt(pos))) {
result0 = input.charAt(pos);
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("[0-9]");
}
}
return result0;
}
function parse_INT() {
var result0, result1;
var pos0;
pos0 = pos;
result1 = parse_DIGIT();
if (result1 !== null) {
result0 = [];
while (result1 !== null) {
result0.push(result1);
result1 = parse_DIGIT();
}
} else {
result0 = null;
}
if (result0 !== null) {
result0 = (function(offset, a) { return a.join(''); })(pos0, result0);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_HEXDIG() {
var result0;
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]");
}
}
return result0;
}
function parse_HEXDIG2() {
var result0, result1;
var pos0;
pos0 = pos;
result0 = parse_HEXDIG();
if (result0 !== null) {
result1 = parse_HEXDIG();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos0;
}
} else {
result0 = null;
pos = pos0;
}
return result0;
}
function parse_HEXDIG4() {
var result0, result1;
var pos0;
pos0 = pos;
result0 = parse_HEXDIG2();
if (result0 !== null) {
result1 = parse_HEXDIG2();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos0;
}
} else {
result0 = null;
pos = pos0;
}
return result0;
}
function parse_HEXDIG8() {
var result0, result1;
var pos0;
pos0 = pos;
result0 = parse_HEXDIG4();
if (result0 !== null) {
result1 = parse_HEXDIG8();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos0;
}
} else {
result0 = null;
pos = pos0;
}
return result0;
}
function parse_SQUOTE() {
var result0;
if (input.substr(pos, 4) === "%x27") {
result0 = "%x27";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"%x27\"");
}
}
if (result0 === null) {
if (input.charCodeAt(pos) === 39) {
result0 = "'";
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"'\"");
}
}
}
return result0;
}
function parse_primitiveLiteral() {
var result0;
result0 = parse_null();
if (result0 === null) {
result0 = parse_binary();
if (result0 === null) {
result0 = parse_dateTime();
if (result0 === null) {
result0 = parse_dateTimeOffset();
if (result0 === null) {
result0 = parse_guid();
if (result0 === null) {
result0 = parse_double();
if (result0 === null) {
result0 = parse_decimal();
if (result0 === null) {
result0 = parse_single();
if (result0 === null) {
result0 = parse_int32();
if (result0 === null) {
result0 = parse_int64();
if (result0 === null) {
result0 = parse_byte();
if (result0 === null) {
result0 = parse_sbyte();
if (result0 === null) {
result0 = parse_boolean();
if (result0 === null) {
result0 = parse_string();
}
}
}
}
}
}
}
}
}
}
}
}
}
return result0;
}
function parse_null() {
var result0, result1, result2, result3;
var pos0, pos1;
pos0 = pos;
if (input.substr(pos, 4) === "null") {
result0 = "null";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"null\"");
}
}
if (result0 !== null) {
pos1 = pos;
if (input.charCodeAt(pos) === 39) {
result1 = "'";
pos++;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\"'\"");
}
}
if (result1 !== null) {
result2 = parse_identifier();
if (result2 !== null) {
if (input.charCodeAt(pos) === 39) {
result3 = "'";
pos++;
} else {
result3 = null;
if (reportFailures === 0) {
matchFailed("\"'\"");
}
}
if (result3 !== null) {
result1 = [result1, result2, result3];
} else {
result1 = null;
pos = pos1;
}
} else {
result1 = null;
pos = pos1;
}
} else {
result1 = null;
pos = pos1;
}
result1 = result1 !== null ? result1 : "";
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos0;
}
} else {
result0 = null;
pos = pos0;
}
return result0;
}
function parse_binary() {
var result0, result1, result2, result3, result4;
var pos0;
pos0 = pos;
if (input.substr(pos, 4) === "%d88") {
result0 = "%d88";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"%d88\"");
}
}
if (result0 === null) {
if (input.substr(pos, 6) === "binary") {
result0 = "binary";
pos += 6;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"binary\"");
}
}
}
if (result0 !== null) {
result1 = parse_SQUOTE();
if (result1 !== null) {
result2 = parse_HEXDIG();
if (result2 !== null) {
result3 = parse_HEXDIG();
if (result3 !== null) {
result4 = parse_SQUOTE();
if (result4 !== null) {
result0 = [result0, result1, result2, result3, result4];
} else {
result0 = null;
pos = pos0;
}
} else {
result0 = null;
pos = pos0;
}
} else {
result0 = null;
pos = pos0;
}
} else {
result0 = null;
pos = pos0;
}
} else {
result0 = null;
pos = pos0;
}
return result0;
}
function parse_boolean() {
var result0;
var pos0;
pos0 = pos;
if (input.substr(pos, 4) === "true") {
result0 = "true";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"true\"");
}
}
if (result0 !== null) {
result0 = (function(offset) { return true; })(pos0);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
if (input.charCodeAt(pos) === 49) {
result0 = "1";
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"1\"");
}
}
if (result0 !== null) {
result0 = (function(offset) { return true; })(pos0);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
if (input.substr(pos, 5) === "false") {
result0 = "false";
pos += 5;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"false\"");
}
}
if (result0 !== null) {
result0 = (function(offset) { return false; })(pos0);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
if (input.charCodeAt(pos) === 48) {
result0 = "0";
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"0\"");
}
}
if (result0 !== null) {
result0 = (function(offset) { return false; })(pos0);
}
if (result0 === null) {
pos = pos0;
}
}
}
}
return result0;
}
function parse_byte() {
var result0, result1, result2;
var pos0;
pos0 = pos;
result0 = parse_DIGIT();
if (result0 !== null) {
result1 = parse_DIGIT();
if (result1 !== null) {
result2 = parse_DIGIT();
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos0;
}
} else {
result0 = null;
pos = pos0;
}
} else {
result0 = null;
pos = pos0;
}
return result0;
}
function parse_dateTime() {
var result0, result1, result2, result3;
var pos0, pos1;
pos0 = pos;
pos1 = pos;
if (input.substr(pos, 8) === "datetime") {
result0 = "datetime";
pos += 8;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"datetime\"");
}
}
if (result0 !== null) {
result1 = parse_SQUOTE();
if (result1 !== null) {
result2 = parse_dateTimeBody();
if (result2 !== null) {
result3 = parse_SQUOTE();
if (result3 !== null) {
result0 = [result0, result1, result2, result3];
} 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(offset, a) { return new Date(a); })(pos0, result0[2]);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_dateTimeOffset() {
var result0, result1, result2, result3;
var pos0, pos1;
pos0 = pos;
pos1 = pos;
if (input.substr(pos, 14) === "datetimeoffset") {
result0 = "datetimeoffset";
pos += 14;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"datetimeoffset\"");
}
}
if (result0 !== null) {
result1 = parse_SQUOTE();
if (result1 !== null) {
result2 = parse_dateTimeOffsetBody();
if (result2 !== null) {
result3 = parse_SQUOTE();
if (result3 !== null) {
result0 = [result0, result1, result2, result3];
} 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(offset, a) { return new Date(a); })(pos0, result0[2]);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_dateTimeBodyA() {
var result0, result1, result2, result3, result4, result5, result6, result7, result8;
var pos0, pos1;
pos0 = pos;
pos1 = pos;
result0 = parse_year();
if (result0 !== null) {
if (input.charCodeAt(pos) === 45) {
result1 = "-";
pos++;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\"-\"");
}
}
if (result1 !== null) {
result2 = parse_zeroToTwelve();
if (result2 !== null) {
if (input.charCodeAt(pos) === 45) {
result3 = "-";
pos++;
} else {
result3 = null;
if (reportFailures === 0) {
matchFailed("\"-\"");
}
}
if (result3 !== null) {
result4 = parse_zeroToThirtyOne();
if (result4 !== null) {
if (input.charCodeAt(pos) === 84) {
result5 = "T";
pos++;
} else {
result5 = null;
if (reportFailures === 0) {
matchFailed("\"T\"");
}
}
if (result5 !== null) {
result6 = parse_zeroToTwentyFour();
if (result6 !== null) {
if (input.charCodeAt(pos) === 58) {
result7 = ":";
pos++;
} else {
result7 = null;
if (reportFailures === 0) {
matchFailed("\":\"");
}
}
if (result7 !== null) {
result8 = parse_zeroToSixty();
if (result8 !== null) {
result0 = [result0, result1, result2, result3, result4, result5, result6, result7, result8];
} 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;
}
} 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(offset, a, b, c, d, e) {
return a + '-' + b + '-' + c + "T" + d + ":" + e;
})(pos0, result0[0], result0[2], result0[4], result0[6], result0[8]);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_dateTimeBodyB() {
var result0, result1, result2;
var pos0, pos1;
pos0 = pos;
pos1 = pos;
result0 = parse_dateTimeBodyA();
if (result0 !== null) {
if (input.charCodeAt(pos) === 58) {
result1 = ":";
pos++;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\":\"");
}
}
if (result1 !== null) {
result2 = parse_zeroToSixty();
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(offset, a, b) { return a + ":" + b; })(pos0, result0[0], result0[2]);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_dateTimeBodyC() {
var result0, result1, result2;
var pos0, pos1;
pos0 = pos;
pos1 = pos;
result0 = parse_dateTimeBodyB();
if (result0 !== null) {
if (input.charCodeAt(pos) === 46) {
result1 = ".";
pos++;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\".\"");
}
}
if (result1 !== null) {
result2 = parse_INT();
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(offset, a, b) { return a + "." + b; })(pos0, result0[0], result0[2]);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_dateTimeBodyD() {
var result0, result1, result2, result3, result4;
var pos0, pos1;
pos0 = pos;
pos1 = pos;
result0 = parse_dateTimeBodyC();
if (result0 !== null) {
if (input.charCodeAt(pos) === 45) {
result1 = "-";
pos++;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\"-\"");
}
}
if (result1 !== null) {
result2 = parse_zeroToTwentyFour();
if (result2 !== null) {
if (input.charCodeAt(pos) === 58) {
result3 = ":";
pos++;
} else {
result3 = null;
if (reportFailures === 0) {
matchFailed("\":\"");
}
}
if (result3 !== null) {
result4 = parse_zeroToSixty();
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(offset, a, b, c) {
return a + "-" + b + ":" + c;
})(pos0, result0[0], result0[2], result0[4]);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_dateTimeBody() {
var result0;
result0 = parse_dateTimeBodyD();
if (result0 === null) {
result0 = parse_dateTimeBodyC();
if (result0 === null) {
result0 = parse_dateTimeBodyB();
if (result0 === null) {
result0 = parse_dateTimeBodyA();
}
}
}
return result0;
}
function parse_dateTimeOffsetBody() {
var result0, result1, result2, result3, result4;
var pos0, pos1;
pos0 = pos;
pos1 = pos;
result0 = parse_dateTimeBody();
if (result0 !== null) {
if (input.charCodeAt(pos) === 90) {
result1 = "Z";
pos++;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\"Z\"");
}
}
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(offset, a) { return a + "Z"; })(pos0, result0[0]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
pos1 = pos;
result0 = parse_dateTimeBody();
if (result0 !== null) {
result1 = parse_sign();
if (result1 !== null) {
result2 = parse_zeroToThirteen();
if (result2 !== null) {
if (input.substr(pos, 3) === ":00") {
result3 = ":00";
pos += 3;
} else {
result3 = null;
if (reportFailures === 0) {
matchFailed("\":00\"");
}
}
if (result3 !== null) {
result0 = [result0, result1, result2, result3];
} 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(offset, a, b, c) { return a + b + c + ":00"; })(pos0, result0[0], result0[1], result0[2]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
pos1 = pos;
result0 = parse_dateTimeBody();
if (result0 !== null) {
result1 = parse_sign();
if (result1 !== null) {
result2 = parse_zeroToThirteen();
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(offset, a, b, c) { return a + b + c; })(pos0, result0[0], result0[1], result0[2]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
pos1 = pos;
result0 = parse_dateTimeBody();
if (result0 !== null) {
result1 = parse_sign();
if (result1 !== null) {
result2 = parse_zeroToTwelve();
if (result2 !== null) {
if (input.charCodeAt(pos) === 58) {
result3 = ":";
pos++;
} else {
result3 = null;
if (reportFailures === 0) {
matchFailed("\":\"");
}
}
if (result3 !== null) {
result4 = parse_zeroToSixty();
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(offset, a, b, c, d) { return a + b + c + ":" + d; })(pos0, result0[0], result0[1], result0[2], result0[4]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
pos1 = pos;
result0 = parse_dateTimeBody();
if (result0 !== null) {
result1 = parse_sign();
if (result1 !== null) {
result2 = parse_zeroToTwelve();
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(offset, a, b, c) { return a + b + c; })(pos0, result0[0], result0[1], result0[2]);
}
if (result0 === null) {
pos = pos0;
}
}
}
}
}
return result0;
}
function parse_decimal() {
var result0, result1, result2, result3, result4;
var pos0, pos1;
pos0 = pos;
pos1 = pos;
result0 = parse_sign();
result0 = result0 !== null ? result0 : "";
if (result0 !== null) {
result2 = parse_DIGIT();
if (result2 !== null) {
result1 = [];
while (result2 !== null) {
result1.push(result2);
result2 = parse_DIGIT();
}
} else {
result1 = null;
}
if (result1 !== null) {
if (input.charCodeAt(pos) === 46) {
result2 = ".";
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\".\"");
}
}
if (result2 !== null) {
result4 = parse_DIGIT();
if (result4 !== null) {
result3 = [];
while (result4 !== null) {
result3.push(result4);
result4 = parse_DIGIT();
}
} else {
result3 = null;
}
if (result3 !== null) {
if (input.charCodeAt(pos) === 77) {
result4 = "M";
pos++;
} else {
result4 = null;
if (reportFailures === 0) {
matchFailed("\"M\"");
}
}
if (result4 === null) {
if (input.charCodeAt(pos) === 109) {
result4 = "m";
pos++;
} else {
result4 = null;
if (reportFailures === 0) {
matchFailed("\"m\"");
}
}
}
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(offset, sign, digit, decimal) { return sign + digit.join('') + '.' + decimal.join(''); })(pos0, result0[0], result0[1], result0[3]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
pos1 = pos;
result0 = parse_sign();
result0 = result0 !== null ? result0 : "";
if (result0 !== null) {
result2 = parse_DIGIT();
if (result2 !== null) {
result1 = [];
while (result2 !== null) {
result1.push(result2);
result2 = parse_DIGIT();
}
} else {
result1 = null;
}
if (result1 !== null) {
if (input.charCodeAt(pos) === 77) {
result2 = "M";
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\"M\"");
}
}
if (result2 === null) {
if (input.charCodeAt(pos) === 109) {
result2 = "m";
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\"m\"");
}
}
}
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(offset, sign, digit) { return sign + digit.join(''); })(pos0, result0[0], result0[1]);
}
if (result0 === null) {
pos = pos0;
}
}
return result0;
}
function parse_double() {
var result0, result1, result2, result3, result4, result5, result6, result7;
var pos0, pos1;
pos0 = pos;
pos1 = pos;
result0 = parse_sign();
result0 = result0 !== null ? result0 : "";
if (result0 !== null) {
result1 = parse_DIGIT();
if (result1 !== null) {
if (input.charCodeAt(pos) === 46) {
result2 = ".";
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\".\"");
}
}
if (result2 !== null) {
result4 = parse_DIGIT();
if (result4 !== null) {
result3 = [];
while (result4 !== null) {
result3.push(result4);
result4 = parse_DIGIT();
}
} else {
result3 = null;
}
if (result3 !== null) {
if (input.charCodeAt(pos) === 101) {
result4 = "e";
pos++;
} else {
result4 = null;
if (reportFailures === 0) {
matchFailed("\"e\"");
}
}
if (result4 === null) {
if (input.charCodeAt(pos) === 69) {
result4 = "E";
pos++;
} else {
result4 = null;
if (reportFailures === 0) {
matchFailed("\"E\"");
}
}
}
if (result4 !== null) {
result5 = parse_sign();
result5 = result5 !== null ? result5 : "";
if (result5 !== null) {
result7 = parse_DIGIT();
if (result7 !== null) {
result6 = [];
while (result7 !== null) {
result6.push(result7);
result7 = parse_DIGIT();
}
} else {
result6 = null;
}
if (result6 !== null) {
if (input.charCodeAt(pos) === 68) {
result7 = "D";
pos++;
} else {
result7 = null;
if (reportFailures === 0) {
matchFailed("\"D\"");
}
}
if (result7 === null) {
if (input.charCodeAt(pos) === 100) {
result7 = "d";
pos++;
} else {
result7 = null;
if (reportFailures === 0) {
matchFailed("\"d\"");
}
}
}
result7 = result7 !== null ? result7 : "";
if (result7 !== null) {
result0 = [result0, result1, result2, result3, result4, result5, result6, result7];
} 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;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(offset, sign, digit, decimal, signexp, exp) { return sign + digit + '.' + decimal.join('') + 'e' + signexp + exp.join(''); })(pos0, result0[0], result0[1], result0[3], result0[5], result0[6]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
pos1 = pos;
result0 = parse_sign();
result0 = result0 !== null ? result0 : "";
if (result0 !== null) {
result2 = parse_DIGIT();
if (result2 !== null) {
result1 = [];
while (result2 !== null) {
result1.push(result2);
result2 = parse_DIGIT();
}
} else {
result1 = null;
}
if (result1 !== null) {
if (input.charCodeAt(pos) === 46) {
result2 = ".";
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\".\"");
}
}
if (result2 !== null) {
result4 = parse_DIGIT();
if (result4 !== null) {
result3 = [];
while (result4 !== null) {
result3.push(result4);
result4 = parse_DIGIT();
}
} else {
result3 = null;
}
if (result3 !== null) {
if (input.charCodeAt(pos) === 68) {
result4 = "D";
pos++;
} else {
result4 = null;
if (reportFailures === 0) {
matchFailed("\"D\"");
}
}
if (result4 === null) {
if (input.charCodeAt(pos) === 100) {
result4 = "d";
pos++;
} else {
result4 = null;
if (reportFailures === 0) {
matchFailed("\"d\"");
}
}
}
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(offset, sign, digit, decimal) { return sign + digit.join('') + '.' + decimal.join(''); })(pos0, result0[0], result0[1], result0[3]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
pos1 = pos;
result0 = parse_sign();
result0 = result0 !== null ? result0 : "";
if (result0 !== null) {
result2 = parse_DIGIT();
if (result2 !== null) {
result1 = [];
while (result2 !== null) {
result1.push(result2);
result2 = parse_DIGIT();
}
} else {
result1 = null;
}
if (result1 !== null) {
if (input.charCodeAt(pos) === 68) {
result2 = "D";
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\"D\"");
}
}
if (result2 === null) {
if (input.charCodeAt(pos) === 100) {
result2 = "d";
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\"d\"");
}
}
}
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(offset, sign, digit) { return sign + digit.join(''); })(pos0, result0[0], result0[1]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
result0 = parse_nanInfinity();
if (result0 !== null) {
if (input.charCodeAt(pos) === 68) {
result1 = "D";
pos++;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\"D\"");
}
}
if (result1 === null) {
if (input.charCodeAt(pos) === 100) {
result1 = "d";
pos++;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\"d\"");
}
}
}
result1 = result1 !== null ? result1 : "";
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos0;
}
} else {
result0 = null;
pos = pos0;
}
}
}
}
return result0;
}
function parse_guid() {
var result0, result1, result2, result3, result4, result5, result6, result7, result8, result9, result10;
var pos0;
pos0 = pos;
if (input.substr(pos, 4) === "guid") {
result0 = "guid";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"guid\"");
}
}
if (result0 !== null) {
result1 = parse_SQUOTE();
if (result1 !== null) {
result2 = parse_HEXDIG8();
if (result2 !== null) {
if (input.charCodeAt(pos) === 45) {
result3 = "-";
pos++;
} else {
result3 = null;
if (reportFailures === 0) {
matchFailed("\"-\"");
}
}
if (result3 !== null) {
result4 = parse_HEXDIG4();
if (result4 !== null) {
if (input.charCodeAt(pos) === 45) {
result5 = "-";