pavone@0: /* PEG.js 0.6.2 (http://pegjs.majda.cz/) */ pavone@0: pavone@0: (function() { pavone@0: pavone@0: var undefined; pavone@0: pavone@0: var PEG = { pavone@0: /* PEG.js version. */ pavone@0: VERSION: "0.6.2", pavone@0: pavone@0: /* pavone@0: * Generates a parser from a specified grammar and returns it. pavone@0: * pavone@0: * The grammar must be a string in the format described by the metagramar in pavone@0: * the parser.pegjs file. pavone@0: * pavone@0: * Throws |PEG.parser.SyntaxError| if the grammar contains a syntax error or pavone@0: * |PEG.GrammarError| if it contains a semantic error. Note that not all pavone@0: * errors are detected during the generation and some may protrude to the pavone@0: * generated parser and cause its malfunction. pavone@0: */ pavone@0: buildParser: function(grammar) { pavone@0: return PEG.compiler.compile(PEG.parser.parse(grammar)); pavone@0: } pavone@0: }; pavone@0: pavone@0: /* Thrown when the grammar contains an error. */ pavone@0: pavone@0: PEG.GrammarError = function(message) { pavone@0: this.name = "PEG.GrammarError"; pavone@0: this.message = message; pavone@0: }; pavone@0: pavone@0: PEG.GrammarError.prototype = Error.prototype; pavone@0: pavone@0: function contains(array, value) { pavone@0: /* pavone@0: * Stupid IE does not have Array.prototype.indexOf, otherwise this function pavone@0: * would be a one-liner. pavone@0: */ pavone@0: var length = array.length; pavone@0: for (var i = 0; i < length; i++) { pavone@0: if (array[i] === value) { pavone@0: return true; pavone@0: } pavone@0: } pavone@0: return false; pavone@0: } pavone@0: pavone@0: function each(array, callback) { pavone@0: var length = array.length; pavone@0: for (var i = 0; i < length; i++) { pavone@0: callback(array[i]); pavone@0: } pavone@0: } pavone@0: pavone@0: function map(array, callback) { pavone@0: var result = []; pavone@0: var length = array.length; pavone@0: for (var i = 0; i < length; i++) { pavone@0: result[i] = callback(array[i]); pavone@0: } pavone@0: return result; pavone@0: } pavone@0: pavone@0: /* pavone@0: * Returns a string padded on the left to a desired length with a character. pavone@0: * pavone@0: * The code needs to be in sync with th code template in the compilation pavone@0: * function for "action" nodes. pavone@0: */ pavone@0: function padLeft(input, padding, length) { pavone@0: var result = input; pavone@0: pavone@0: var padLength = length - input.length; pavone@0: for (var i = 0; i < padLength; i++) { pavone@0: result = padding + result; pavone@0: } pavone@0: pavone@0: return result; pavone@0: } pavone@0: pavone@0: /* pavone@0: * Returns an escape sequence for given character. Uses \x for characters <= pavone@0: * 0xFF to save space, \u for the rest. pavone@0: * pavone@0: * The code needs to be in sync with th code template in the compilation pavone@0: * function for "action" nodes. pavone@0: */ pavone@0: function escape(ch) { pavone@0: var charCode = ch.charCodeAt(0); pavone@0: pavone@0: if (charCode <= 0xFF) { pavone@0: var escapeChar = 'x'; pavone@0: var length = 2; pavone@0: } else { pavone@0: var escapeChar = 'u'; pavone@0: var length = 4; pavone@0: } pavone@0: pavone@0: return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length); pavone@0: } pavone@0: pavone@0: /* pavone@0: * Surrounds the string with quotes and escapes characters inside so that the pavone@0: * result is a valid JavaScript string. pavone@0: * pavone@0: * The code needs to be in sync with th code template in the compilation pavone@0: * function for "action" nodes. pavone@0: */ pavone@0: function quote(s) { pavone@0: /* pavone@0: * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string pavone@0: * literal except for the closing quote character, backslash, carriage return, pavone@0: * line separator, paragraph separator, and line feed. Any character may pavone@0: * appear in the form of an escape sequence. pavone@0: * pavone@0: * For portability, we also escape escape all non-ASCII characters. pavone@0: */ pavone@0: return '"' + s pavone@0: .replace(/\\/g, '\\\\') // backslash pavone@0: .replace(/"/g, '\\"') // closing quote character pavone@0: .replace(/\r/g, '\\r') // carriage return pavone@0: .replace(/\n/g, '\\n') // line feed pavone@0: .replace(/[\x80-\uFFFF]/g, escape) // non-ASCII characters pavone@0: + '"'; pavone@0: }; pavone@0: pavone@0: /* pavone@0: * Escapes characters inside the string so that it can be used as a list of pavone@0: * characters in a character class of a regular expression. pavone@0: */ pavone@0: function quoteForRegexpClass(s) { pavone@0: /* pavone@0: * Based on ECMA-262, 5th ed., 7.8.5 & 15.10.1. pavone@0: * pavone@0: * For portability, we also escape escape all non-ASCII characters. pavone@0: */ pavone@0: return s pavone@0: .replace(/\\/g, '\\\\') // backslash pavone@0: .replace(/\0/g, '\\0') // null, IE needs this pavone@0: .replace(/\//g, '\\/') // closing slash pavone@0: .replace(/]/g, '\\]') // closing bracket pavone@0: .replace(/-/g, '\\-') // dash pavone@0: .replace(/\r/g, '\\r') // carriage return pavone@0: .replace(/\n/g, '\\n') // line feed pavone@0: .replace(/[\x80-\uFFFF]/g, escape) // non-ASCII characters pavone@0: } pavone@0: pavone@0: /* pavone@0: * Builds a node visitor -- a function which takes a node and any number of pavone@0: * other parameters, calls an appropriate function according to the node type, pavone@0: * passes it all its parameters and returns its value. The functions for various pavone@0: * node types are passed in a parameter to |buildNodeVisitor| as a hash. pavone@0: */ pavone@0: function buildNodeVisitor(functions) { pavone@0: return function(node) { pavone@0: return functions[node.type].apply(null, arguments); pavone@0: } pavone@0: } pavone@0: PEG.parser = (function(){ pavone@0: /* Generated by PEG.js 0.6.2 (http://pegjs.majda.cz/). */ pavone@0: pavone@0: var result = { pavone@0: /* pavone@0: * Parses the input with a generated parser. If the parsing is successfull, pavone@0: * returns a value explicitly or implicitly specified by the grammar from pavone@0: * which the parser was generated (see |PEG.buildParser|). If the parsing is pavone@0: * unsuccessful, throws |PEG.parser.SyntaxError| describing the error. pavone@0: */ pavone@0: parse: function(input, startRule) { pavone@0: var parseFunctions = { pavone@0: "__": parse___, pavone@0: "action": parse_action, pavone@0: "and": parse_and, pavone@0: "braced": parse_braced, pavone@0: "bracketDelimitedCharacter": parse_bracketDelimitedCharacter, pavone@0: "choice": parse_choice, pavone@0: "class": parse_class, pavone@0: "classCharacter": parse_classCharacter, pavone@0: "classCharacterRange": parse_classCharacterRange, pavone@0: "colon": parse_colon, pavone@0: "comment": parse_comment, pavone@0: "digit": parse_digit, pavone@0: "dot": parse_dot, pavone@0: "doubleQuotedCharacter": parse_doubleQuotedCharacter, pavone@0: "doubleQuotedLiteral": parse_doubleQuotedLiteral, pavone@0: "eol": parse_eol, pavone@0: "eolChar": parse_eolChar, pavone@0: "eolEscapeSequence": parse_eolEscapeSequence, pavone@0: "equals": parse_equals, pavone@0: "grammar": parse_grammar, pavone@0: "hexDigit": parse_hexDigit, pavone@0: "hexEscapeSequence": parse_hexEscapeSequence, pavone@0: "identifier": parse_identifier, pavone@0: "initializer": parse_initializer, pavone@0: "labeled": parse_labeled, pavone@0: "letter": parse_letter, pavone@0: "literal": parse_literal, pavone@0: "lowerCaseLetter": parse_lowerCaseLetter, pavone@0: "lparen": parse_lparen, pavone@0: "multiLineComment": parse_multiLineComment, pavone@0: "nonBraceCharacter": parse_nonBraceCharacter, pavone@0: "nonBraceCharacters": parse_nonBraceCharacters, pavone@0: "not": parse_not, pavone@0: "plus": parse_plus, pavone@0: "prefixed": parse_prefixed, pavone@0: "primary": parse_primary, pavone@0: "question": parse_question, pavone@0: "rparen": parse_rparen, pavone@0: "rule": parse_rule, pavone@0: "semicolon": parse_semicolon, pavone@0: "sequence": parse_sequence, pavone@0: "simpleBracketDelimitedCharacter": parse_simpleBracketDelimitedCharacter, pavone@0: "simpleDoubleQuotedCharacter": parse_simpleDoubleQuotedCharacter, pavone@0: "simpleEscapeSequence": parse_simpleEscapeSequence, pavone@0: "simpleSingleQuotedCharacter": parse_simpleSingleQuotedCharacter, pavone@0: "singleLineComment": parse_singleLineComment, pavone@0: "singleQuotedCharacter": parse_singleQuotedCharacter, pavone@0: "singleQuotedLiteral": parse_singleQuotedLiteral, pavone@0: "slash": parse_slash, pavone@0: "star": parse_star, pavone@0: "suffixed": parse_suffixed, pavone@0: "unicodeEscapeSequence": parse_unicodeEscapeSequence, pavone@0: "upperCaseLetter": parse_upperCaseLetter, pavone@0: "whitespace": parse_whitespace, pavone@0: "zeroEscapeSequence": parse_zeroEscapeSequence pavone@0: }; pavone@0: pavone@0: if (startRule !== undefined) { pavone@0: if (parseFunctions[startRule] === undefined) { pavone@0: throw new Error("Invalid rule name: " + quote(startRule) + "."); pavone@0: } pavone@0: } else { pavone@0: startRule = "grammar"; pavone@0: } pavone@0: pavone@0: var pos = 0; pavone@0: var reportMatchFailures = true; pavone@0: var rightmostMatchFailuresPos = 0; pavone@0: var rightmostMatchFailuresExpected = []; pavone@0: var cache = {}; pavone@0: pavone@0: function padLeft(input, padding, length) { pavone@0: var result = input; pavone@0: pavone@0: var padLength = length - input.length; pavone@0: for (var i = 0; i < padLength; i++) { pavone@0: result = padding + result; pavone@0: } pavone@0: pavone@0: return result; pavone@0: } pavone@0: pavone@0: function escape(ch) { pavone@0: var charCode = ch.charCodeAt(0); pavone@0: pavone@0: if (charCode <= 0xFF) { pavone@0: var escapeChar = 'x'; pavone@0: var length = 2; pavone@0: } else { pavone@0: var escapeChar = 'u'; pavone@0: var length = 4; pavone@0: } pavone@0: pavone@0: return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length); pavone@0: } pavone@0: pavone@0: function quote(s) { pavone@0: /* pavone@0: * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a pavone@0: * string literal except for the closing quote character, backslash, pavone@0: * carriage return, line separator, paragraph separator, and line feed. pavone@0: * Any character may appear in the form of an escape sequence. pavone@0: */ pavone@0: return '"' + s pavone@0: .replace(/\\/g, '\\\\') // backslash pavone@0: .replace(/"/g, '\\"') // closing quote character pavone@0: .replace(/\r/g, '\\r') // carriage return pavone@0: .replace(/\n/g, '\\n') // line feed pavone@0: .replace(/[\x80-\uFFFF]/g, escape) // non-ASCII characters pavone@0: + '"'; pavone@0: } pavone@0: pavone@0: function matchFailed(failure) { pavone@0: if (pos < rightmostMatchFailuresPos) { pavone@0: return; pavone@0: } pavone@0: pavone@0: if (pos > rightmostMatchFailuresPos) { pavone@0: rightmostMatchFailuresPos = pos; pavone@0: rightmostMatchFailuresExpected = []; pavone@0: } pavone@0: pavone@0: rightmostMatchFailuresExpected.push(failure); pavone@0: } pavone@0: pavone@0: function parse_grammar() { pavone@0: var cacheKey = 'grammar@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: var result3 = parse___(); pavone@0: if (result3 !== null) { pavone@0: var result7 = parse_initializer(); pavone@0: var result4 = result7 !== null ? result7 : ''; pavone@0: if (result4 !== null) { pavone@0: var result6 = parse_rule(); pavone@0: if (result6 !== null) { pavone@0: var result5 = []; pavone@0: while (result6 !== null) { pavone@0: result5.push(result6); pavone@0: var result6 = parse_rule(); pavone@0: } pavone@0: } else { pavone@0: var result5 = null; pavone@0: } pavone@0: if (result5 !== null) { pavone@0: var result1 = [result3, result4, result5]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(initializer, rules) { pavone@0: var rulesConverted = {}; pavone@0: each(rules, function(rule) { rulesConverted[rule.name] = rule; }); pavone@0: pavone@0: return { pavone@0: type: "grammar", pavone@0: initializer: initializer !== "" ? initializer : null, pavone@0: rules: rulesConverted, pavone@0: startRule: rules[0].name pavone@0: } pavone@0: })(result1[1], result1[2]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_initializer() { pavone@0: var cacheKey = 'initializer@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: var result3 = parse_action(); pavone@0: if (result3 !== null) { pavone@0: var result5 = parse_semicolon(); pavone@0: var result4 = result5 !== null ? result5 : ''; pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(code) { pavone@0: return { pavone@0: type: "initializer", pavone@0: code: code pavone@0: }; pavone@0: })(result1[0]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_rule() { pavone@0: var cacheKey = 'rule@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: var result3 = parse_identifier(); pavone@0: if (result3 !== null) { pavone@0: var result10 = parse_literal(); pavone@0: if (result10 !== null) { pavone@0: var result4 = result10; pavone@0: } else { pavone@0: if (input.substr(pos, 0) === "") { pavone@0: var result9 = ""; pavone@0: pos += 0; pavone@0: } else { pavone@0: var result9 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\""); pavone@0: } pavone@0: } pavone@0: if (result9 !== null) { pavone@0: var result4 = result9; pavone@0: } else { pavone@0: var result4 = null;; pavone@0: }; pavone@0: } pavone@0: if (result4 !== null) { pavone@0: var result5 = parse_equals(); pavone@0: if (result5 !== null) { pavone@0: var result6 = parse_choice(); pavone@0: if (result6 !== null) { pavone@0: var result8 = parse_semicolon(); pavone@0: var result7 = result8 !== null ? result8 : ''; pavone@0: if (result7 !== null) { pavone@0: var result1 = [result3, result4, result5, result6, result7]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(name, displayName, expression) { pavone@0: return { pavone@0: type: "rule", pavone@0: name: name, pavone@0: displayName: displayName !== "" ? displayName : null, pavone@0: expression: expression pavone@0: }; pavone@0: })(result1[0], result1[1], result1[3]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_choice() { pavone@0: var cacheKey = 'choice@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: var result3 = parse_sequence(); pavone@0: if (result3 !== null) { pavone@0: var result4 = []; pavone@0: var savedPos2 = pos; pavone@0: var result6 = parse_slash(); pavone@0: if (result6 !== null) { pavone@0: var result7 = parse_sequence(); pavone@0: if (result7 !== null) { pavone@0: var result5 = [result6, result7]; pavone@0: } else { pavone@0: var result5 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: } else { pavone@0: var result5 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: while (result5 !== null) { pavone@0: result4.push(result5); pavone@0: var savedPos2 = pos; pavone@0: var result6 = parse_slash(); pavone@0: if (result6 !== null) { pavone@0: var result7 = parse_sequence(); pavone@0: if (result7 !== null) { pavone@0: var result5 = [result6, result7]; pavone@0: } else { pavone@0: var result5 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: } else { pavone@0: var result5 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: } pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(head, tail) { pavone@0: if (tail.length > 0) { pavone@0: var alternatives = [head].concat(map( pavone@0: tail, pavone@0: function(element) { return element[1]; } pavone@0: )); pavone@0: return { pavone@0: type: "choice", pavone@0: alternatives: alternatives pavone@0: } pavone@0: } else { pavone@0: return head; pavone@0: } pavone@0: })(result1[0], result1[1]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_sequence() { pavone@0: var cacheKey = 'sequence@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos1 = pos; pavone@0: var savedPos2 = pos; pavone@0: var result8 = []; pavone@0: var result10 = parse_labeled(); pavone@0: while (result10 !== null) { pavone@0: result8.push(result10); pavone@0: var result10 = parse_labeled(); pavone@0: } pavone@0: if (result8 !== null) { pavone@0: var result9 = parse_action(); pavone@0: if (result9 !== null) { pavone@0: var result6 = [result8, result9]; pavone@0: } else { pavone@0: var result6 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: } else { pavone@0: var result6 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: var result7 = result6 !== null pavone@0: ? (function(elements, code) { pavone@0: var expression = elements.length != 1 pavone@0: ? { pavone@0: type: "sequence", pavone@0: elements: elements pavone@0: } pavone@0: : elements[0]; pavone@0: return { pavone@0: type: "action", pavone@0: expression: expression, pavone@0: code: code pavone@0: }; pavone@0: })(result6[0], result6[1]) pavone@0: : null; pavone@0: if (result7 !== null) { pavone@0: var result5 = result7; pavone@0: } else { pavone@0: var result5 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: if (result5 !== null) { pavone@0: var result0 = result5; pavone@0: } else { pavone@0: var savedPos0 = pos; pavone@0: var result2 = []; pavone@0: var result4 = parse_labeled(); pavone@0: while (result4 !== null) { pavone@0: result2.push(result4); pavone@0: var result4 = parse_labeled(); pavone@0: } pavone@0: var result3 = result2 !== null pavone@0: ? (function(elements) { pavone@0: return elements.length != 1 pavone@0: ? { pavone@0: type: "sequence", pavone@0: elements: elements pavone@0: } pavone@0: : elements[0]; pavone@0: })(result2) pavone@0: : null; pavone@0: if (result3 !== null) { pavone@0: var result1 = result3; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: if (result1 !== null) { pavone@0: var result0 = result1; pavone@0: } else { pavone@0: var result0 = null;; pavone@0: }; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_labeled() { pavone@0: var cacheKey = 'labeled@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: var result5 = parse_identifier(); pavone@0: if (result5 !== null) { pavone@0: var result6 = parse_colon(); pavone@0: if (result6 !== null) { pavone@0: var result7 = parse_prefixed(); pavone@0: if (result7 !== null) { pavone@0: var result3 = [result5, result6, result7]; pavone@0: } else { pavone@0: var result3 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result3 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result3 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result4 = result3 !== null pavone@0: ? (function(label, expression) { pavone@0: return { pavone@0: type: "labeled", pavone@0: label: label, pavone@0: expression: expression pavone@0: }; pavone@0: })(result3[0], result3[2]) pavone@0: : null; pavone@0: if (result4 !== null) { pavone@0: var result2 = result4; pavone@0: } else { pavone@0: var result2 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result1 = parse_prefixed(); pavone@0: if (result1 !== null) { pavone@0: var result0 = result1; pavone@0: } else { pavone@0: var result0 = null;; pavone@0: }; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_prefixed() { pavone@0: var cacheKey = 'prefixed@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos6 = pos; pavone@0: var savedPos7 = pos; pavone@0: var result20 = parse_and(); pavone@0: if (result20 !== null) { pavone@0: var result21 = parse_action(); pavone@0: if (result21 !== null) { pavone@0: var result18 = [result20, result21]; pavone@0: } else { pavone@0: var result18 = null; pavone@0: pos = savedPos7; pavone@0: } pavone@0: } else { pavone@0: var result18 = null; pavone@0: pos = savedPos7; pavone@0: } pavone@0: var result19 = result18 !== null pavone@0: ? (function(code) { pavone@0: return { pavone@0: type: "semantic_and", pavone@0: code: code pavone@0: }; pavone@0: })(result18[1]) pavone@0: : null; pavone@0: if (result19 !== null) { pavone@0: var result17 = result19; pavone@0: } else { pavone@0: var result17 = null; pavone@0: pos = savedPos6; pavone@0: } pavone@0: if (result17 !== null) { pavone@0: var result0 = result17; pavone@0: } else { pavone@0: var savedPos4 = pos; pavone@0: var savedPos5 = pos; pavone@0: var result15 = parse_and(); pavone@0: if (result15 !== null) { pavone@0: var result16 = parse_suffixed(); pavone@0: if (result16 !== null) { pavone@0: var result13 = [result15, result16]; pavone@0: } else { pavone@0: var result13 = null; pavone@0: pos = savedPos5; pavone@0: } pavone@0: } else { pavone@0: var result13 = null; pavone@0: pos = savedPos5; pavone@0: } pavone@0: var result14 = result13 !== null pavone@0: ? (function(expression) { pavone@0: return { pavone@0: type: "simple_and", pavone@0: expression: expression pavone@0: }; pavone@0: })(result13[1]) pavone@0: : null; pavone@0: if (result14 !== null) { pavone@0: var result12 = result14; pavone@0: } else { pavone@0: var result12 = null; pavone@0: pos = savedPos4; pavone@0: } pavone@0: if (result12 !== null) { pavone@0: var result0 = result12; pavone@0: } else { pavone@0: var savedPos2 = pos; pavone@0: var savedPos3 = pos; pavone@0: var result10 = parse_not(); pavone@0: if (result10 !== null) { pavone@0: var result11 = parse_action(); pavone@0: if (result11 !== null) { pavone@0: var result8 = [result10, result11]; pavone@0: } else { pavone@0: var result8 = null; pavone@0: pos = savedPos3; pavone@0: } pavone@0: } else { pavone@0: var result8 = null; pavone@0: pos = savedPos3; pavone@0: } pavone@0: var result9 = result8 !== null pavone@0: ? (function(code) { pavone@0: return { pavone@0: type: "semantic_not", pavone@0: code: code pavone@0: }; pavone@0: })(result8[1]) pavone@0: : null; pavone@0: if (result9 !== null) { pavone@0: var result7 = result9; pavone@0: } else { pavone@0: var result7 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: if (result7 !== null) { pavone@0: var result0 = result7; pavone@0: } else { pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: var result5 = parse_not(); pavone@0: if (result5 !== null) { pavone@0: var result6 = parse_suffixed(); pavone@0: if (result6 !== null) { pavone@0: var result3 = [result5, result6]; pavone@0: } else { pavone@0: var result3 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result3 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result4 = result3 !== null pavone@0: ? (function(expression) { pavone@0: return { pavone@0: type: "simple_not", pavone@0: expression: expression pavone@0: }; pavone@0: })(result3[1]) pavone@0: : null; pavone@0: if (result4 !== null) { pavone@0: var result2 = result4; pavone@0: } else { pavone@0: var result2 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result1 = parse_suffixed(); pavone@0: if (result1 !== null) { pavone@0: var result0 = result1; pavone@0: } else { pavone@0: var result0 = null;; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_suffixed() { pavone@0: var cacheKey = 'suffixed@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos4 = pos; pavone@0: var savedPos5 = pos; pavone@0: var result15 = parse_primary(); pavone@0: if (result15 !== null) { pavone@0: var result16 = parse_question(); pavone@0: if (result16 !== null) { pavone@0: var result13 = [result15, result16]; pavone@0: } else { pavone@0: var result13 = null; pavone@0: pos = savedPos5; pavone@0: } pavone@0: } else { pavone@0: var result13 = null; pavone@0: pos = savedPos5; pavone@0: } pavone@0: var result14 = result13 !== null pavone@0: ? (function(expression) { pavone@0: return { pavone@0: type: "optional", pavone@0: expression: expression pavone@0: }; pavone@0: })(result13[0]) pavone@0: : null; pavone@0: if (result14 !== null) { pavone@0: var result12 = result14; pavone@0: } else { pavone@0: var result12 = null; pavone@0: pos = savedPos4; pavone@0: } pavone@0: if (result12 !== null) { pavone@0: var result0 = result12; pavone@0: } else { pavone@0: var savedPos2 = pos; pavone@0: var savedPos3 = pos; pavone@0: var result10 = parse_primary(); pavone@0: if (result10 !== null) { pavone@0: var result11 = parse_star(); pavone@0: if (result11 !== null) { pavone@0: var result8 = [result10, result11]; pavone@0: } else { pavone@0: var result8 = null; pavone@0: pos = savedPos3; pavone@0: } pavone@0: } else { pavone@0: var result8 = null; pavone@0: pos = savedPos3; pavone@0: } pavone@0: var result9 = result8 !== null pavone@0: ? (function(expression) { pavone@0: return { pavone@0: type: "zero_or_more", pavone@0: expression: expression pavone@0: }; pavone@0: })(result8[0]) pavone@0: : null; pavone@0: if (result9 !== null) { pavone@0: var result7 = result9; pavone@0: } else { pavone@0: var result7 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: if (result7 !== null) { pavone@0: var result0 = result7; pavone@0: } else { pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: var result5 = parse_primary(); pavone@0: if (result5 !== null) { pavone@0: var result6 = parse_plus(); pavone@0: if (result6 !== null) { pavone@0: var result3 = [result5, result6]; pavone@0: } else { pavone@0: var result3 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result3 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result4 = result3 !== null pavone@0: ? (function(expression) { pavone@0: return { pavone@0: type: "one_or_more", pavone@0: expression: expression pavone@0: }; pavone@0: })(result3[0]) pavone@0: : null; pavone@0: if (result4 !== null) { pavone@0: var result2 = result4; pavone@0: } else { pavone@0: var result2 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result1 = parse_primary(); pavone@0: if (result1 !== null) { pavone@0: var result0 = result1; pavone@0: } else { pavone@0: var result0 = null;; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_primary() { pavone@0: var cacheKey = 'primary@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos4 = pos; pavone@0: var savedPos5 = pos; pavone@0: var result17 = parse_identifier(); pavone@0: if (result17 !== null) { pavone@0: var savedPos6 = pos; pavone@0: var savedReportMatchFailuresVar0 = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: var savedPos7 = pos; pavone@0: var result23 = parse_literal(); pavone@0: if (result23 !== null) { pavone@0: var result20 = result23; pavone@0: } else { pavone@0: if (input.substr(pos, 0) === "") { pavone@0: var result22 = ""; pavone@0: pos += 0; pavone@0: } else { pavone@0: var result22 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\""); pavone@0: } pavone@0: } pavone@0: if (result22 !== null) { pavone@0: var result20 = result22; pavone@0: } else { pavone@0: var result20 = null;; pavone@0: }; pavone@0: } pavone@0: if (result20 !== null) { pavone@0: var result21 = parse_equals(); pavone@0: if (result21 !== null) { pavone@0: var result19 = [result20, result21]; pavone@0: } else { pavone@0: var result19 = null; pavone@0: pos = savedPos7; pavone@0: } pavone@0: } else { pavone@0: var result19 = null; pavone@0: pos = savedPos7; pavone@0: } pavone@0: reportMatchFailures = savedReportMatchFailuresVar0; pavone@0: if (result19 === null) { pavone@0: var result18 = ''; pavone@0: } else { pavone@0: var result18 = null; pavone@0: pos = savedPos6; pavone@0: } pavone@0: if (result18 !== null) { pavone@0: var result15 = [result17, result18]; pavone@0: } else { pavone@0: var result15 = null; pavone@0: pos = savedPos5; pavone@0: } pavone@0: } else { pavone@0: var result15 = null; pavone@0: pos = savedPos5; pavone@0: } pavone@0: var result16 = result15 !== null pavone@0: ? (function(name) { pavone@0: return { pavone@0: type: "rule_ref", pavone@0: name: name pavone@0: }; pavone@0: })(result15[0]) pavone@0: : null; pavone@0: if (result16 !== null) { pavone@0: var result14 = result16; pavone@0: } else { pavone@0: var result14 = null; pavone@0: pos = savedPos4; pavone@0: } pavone@0: if (result14 !== null) { pavone@0: var result0 = result14; pavone@0: } else { pavone@0: var savedPos3 = pos; pavone@0: var result12 = parse_literal(); pavone@0: var result13 = result12 !== null pavone@0: ? (function(value) { pavone@0: return { pavone@0: type: "literal", pavone@0: value: value pavone@0: }; pavone@0: })(result12) pavone@0: : null; pavone@0: if (result13 !== null) { pavone@0: var result11 = result13; pavone@0: } else { pavone@0: var result11 = null; pavone@0: pos = savedPos3; pavone@0: } pavone@0: if (result11 !== null) { pavone@0: var result0 = result11; pavone@0: } else { pavone@0: var savedPos2 = pos; pavone@0: var result9 = parse_dot(); pavone@0: var result10 = result9 !== null pavone@0: ? (function() { return { type: "any" }; })() pavone@0: : null; pavone@0: if (result10 !== null) { pavone@0: var result8 = result10; pavone@0: } else { pavone@0: var result8 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: if (result8 !== null) { pavone@0: var result0 = result8; pavone@0: } else { pavone@0: var result7 = parse_class(); pavone@0: if (result7 !== null) { pavone@0: var result0 = result7; pavone@0: } else { pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: var result4 = parse_lparen(); pavone@0: if (result4 !== null) { pavone@0: var result5 = parse_choice(); pavone@0: if (result5 !== null) { pavone@0: var result6 = parse_rparen(); pavone@0: if (result6 !== null) { pavone@0: var result2 = [result4, result5, result6]; pavone@0: } else { pavone@0: var result2 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result2 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result2 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result3 = result2 !== null pavone@0: ? (function(expression) { return expression; })(result2[1]) pavone@0: : null; pavone@0: if (result3 !== null) { pavone@0: var result1 = result3; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: if (result1 !== null) { pavone@0: var result0 = result1; pavone@0: } else { pavone@0: var result0 = null;; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_action() { pavone@0: var cacheKey = 'action@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: var savedReportMatchFailures = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: var result3 = parse_braced(); pavone@0: if (result3 !== null) { pavone@0: var result4 = parse___(); pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(braced) { return braced.substr(1, braced.length - 2); })(result1[0]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: reportMatchFailures = savedReportMatchFailures; pavone@0: if (reportMatchFailures && result0 === null) { pavone@0: matchFailed("action"); pavone@0: } pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_braced() { pavone@0: var cacheKey = 'braced@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === "{") { pavone@0: var result3 = "{"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"{\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = []; pavone@0: var result8 = parse_braced(); pavone@0: if (result8 !== null) { pavone@0: var result6 = result8; pavone@0: } else { pavone@0: var result7 = parse_nonBraceCharacter(); pavone@0: if (result7 !== null) { pavone@0: var result6 = result7; pavone@0: } else { pavone@0: var result6 = null;; pavone@0: }; pavone@0: } pavone@0: while (result6 !== null) { pavone@0: result4.push(result6); pavone@0: var result8 = parse_braced(); pavone@0: if (result8 !== null) { pavone@0: var result6 = result8; pavone@0: } else { pavone@0: var result7 = parse_nonBraceCharacter(); pavone@0: if (result7 !== null) { pavone@0: var result6 = result7; pavone@0: } else { pavone@0: var result6 = null;; pavone@0: }; pavone@0: } pavone@0: } pavone@0: if (result4 !== null) { pavone@0: if (input.substr(pos, 1) === "}") { pavone@0: var result5 = "}"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result5 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"}\""); pavone@0: } pavone@0: } pavone@0: if (result5 !== null) { pavone@0: var result1 = [result3, result4, result5]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(parts) { pavone@0: return "{" + parts.join("") + "}"; pavone@0: })(result1[1]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_nonBraceCharacters() { pavone@0: var cacheKey = 'nonBraceCharacters@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var result3 = parse_nonBraceCharacter(); pavone@0: if (result3 !== null) { pavone@0: var result1 = []; pavone@0: while (result3 !== null) { pavone@0: result1.push(result3); pavone@0: var result3 = parse_nonBraceCharacter(); pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(chars) { return chars.join(""); })(result1) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_nonBraceCharacter() { pavone@0: var cacheKey = 'nonBraceCharacter@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: if (input.substr(pos).match(/^[^{}]/) !== null) { pavone@0: var result0 = input.charAt(pos); pavone@0: pos++; pavone@0: } else { pavone@0: var result0 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("[^{}]"); pavone@0: } pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_equals() { pavone@0: var cacheKey = 'equals@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === "=") { pavone@0: var result3 = "="; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"=\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = parse___(); pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function() { return "="; })() pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_colon() { pavone@0: var cacheKey = 'colon@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === ":") { pavone@0: var result3 = ":"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\":\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = parse___(); pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function() { return ":"; })() pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_semicolon() { pavone@0: var cacheKey = 'semicolon@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === ";") { pavone@0: var result3 = ";"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\";\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = parse___(); pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function() { return ";"; })() pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_slash() { pavone@0: var cacheKey = 'slash@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === "/") { pavone@0: var result3 = "/"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"/\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = parse___(); pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function() { return "/"; })() pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_and() { pavone@0: var cacheKey = 'and@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === "&") { pavone@0: var result3 = "&"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"&\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = parse___(); pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function() { return "&"; })() pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_not() { pavone@0: var cacheKey = 'not@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === "!") { pavone@0: var result3 = "!"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"!\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = parse___(); pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function() { return "!"; })() pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_question() { pavone@0: var cacheKey = 'question@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === "?") { pavone@0: var result3 = "?"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"?\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = parse___(); pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function() { return "?"; })() pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_star() { pavone@0: var cacheKey = 'star@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === "*") { pavone@0: var result3 = "*"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"*\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = parse___(); pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function() { return "*"; })() pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_plus() { pavone@0: var cacheKey = 'plus@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === "+") { pavone@0: var result3 = "+"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"+\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = parse___(); pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function() { return "+"; })() pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_lparen() { pavone@0: var cacheKey = 'lparen@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === "(") { pavone@0: var result3 = "("; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"(\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = parse___(); pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function() { return "("; })() pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_rparen() { pavone@0: var cacheKey = 'rparen@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === ")") { pavone@0: var result3 = ")"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\")\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = parse___(); pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function() { return ")"; })() pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_dot() { pavone@0: var cacheKey = 'dot@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === ".") { pavone@0: var result3 = "."; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\".\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = parse___(); pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function() { return "."; })() pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_identifier() { pavone@0: var cacheKey = 'identifier@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: var savedReportMatchFailures = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: var result13 = parse_letter(); pavone@0: if (result13 !== null) { pavone@0: var result3 = result13; pavone@0: } else { pavone@0: if (input.substr(pos, 1) === "_") { pavone@0: var result12 = "_"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result12 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"_\""); pavone@0: } pavone@0: } pavone@0: if (result12 !== null) { pavone@0: var result3 = result12; pavone@0: } else { pavone@0: if (input.substr(pos, 1) === "$") { pavone@0: var result11 = "$"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result11 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"$\""); pavone@0: } pavone@0: } pavone@0: if (result11 !== null) { pavone@0: var result3 = result11; pavone@0: } else { pavone@0: var result3 = null;; pavone@0: }; pavone@0: }; pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = []; pavone@0: var result10 = parse_letter(); pavone@0: if (result10 !== null) { pavone@0: var result6 = result10; pavone@0: } else { pavone@0: var result9 = parse_digit(); pavone@0: if (result9 !== null) { pavone@0: var result6 = result9; pavone@0: } else { pavone@0: if (input.substr(pos, 1) === "_") { pavone@0: var result8 = "_"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result8 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"_\""); pavone@0: } pavone@0: } pavone@0: if (result8 !== null) { pavone@0: var result6 = result8; pavone@0: } else { pavone@0: if (input.substr(pos, 1) === "$") { pavone@0: var result7 = "$"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result7 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"$\""); pavone@0: } pavone@0: } pavone@0: if (result7 !== null) { pavone@0: var result6 = result7; pavone@0: } else { pavone@0: var result6 = null;; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: } pavone@0: while (result6 !== null) { pavone@0: result4.push(result6); pavone@0: var result10 = parse_letter(); pavone@0: if (result10 !== null) { pavone@0: var result6 = result10; pavone@0: } else { pavone@0: var result9 = parse_digit(); pavone@0: if (result9 !== null) { pavone@0: var result6 = result9; pavone@0: } else { pavone@0: if (input.substr(pos, 1) === "_") { pavone@0: var result8 = "_"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result8 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"_\""); pavone@0: } pavone@0: } pavone@0: if (result8 !== null) { pavone@0: var result6 = result8; pavone@0: } else { pavone@0: if (input.substr(pos, 1) === "$") { pavone@0: var result7 = "$"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result7 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"$\""); pavone@0: } pavone@0: } pavone@0: if (result7 !== null) { pavone@0: var result6 = result7; pavone@0: } else { pavone@0: var result6 = null;; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: } pavone@0: } pavone@0: if (result4 !== null) { pavone@0: var result5 = parse___(); pavone@0: if (result5 !== null) { pavone@0: var result1 = [result3, result4, result5]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(head, tail) { pavone@0: return head + tail.join(""); pavone@0: })(result1[0], result1[1]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: reportMatchFailures = savedReportMatchFailures; pavone@0: if (reportMatchFailures && result0 === null) { pavone@0: matchFailed("identifier"); pavone@0: } pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_literal() { pavone@0: var cacheKey = 'literal@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: var savedReportMatchFailures = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: var result6 = parse_doubleQuotedLiteral(); pavone@0: if (result6 !== null) { pavone@0: var result3 = result6; pavone@0: } else { pavone@0: var result5 = parse_singleQuotedLiteral(); pavone@0: if (result5 !== null) { pavone@0: var result3 = result5; pavone@0: } else { pavone@0: var result3 = null;; pavone@0: }; pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = parse___(); pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(literal) { return literal; })(result1[0]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: reportMatchFailures = savedReportMatchFailures; pavone@0: if (reportMatchFailures && result0 === null) { pavone@0: matchFailed("literal"); pavone@0: } pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_doubleQuotedLiteral() { pavone@0: var cacheKey = 'doubleQuotedLiteral@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === "\"") { pavone@0: var result3 = "\""; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\\\"\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = []; pavone@0: var result6 = parse_doubleQuotedCharacter(); pavone@0: while (result6 !== null) { pavone@0: result4.push(result6); pavone@0: var result6 = parse_doubleQuotedCharacter(); pavone@0: } pavone@0: if (result4 !== null) { pavone@0: if (input.substr(pos, 1) === "\"") { pavone@0: var result5 = "\""; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result5 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\\\"\""); pavone@0: } pavone@0: } pavone@0: if (result5 !== null) { pavone@0: var result1 = [result3, result4, result5]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(chars) { return chars.join(""); })(result1[1]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_doubleQuotedCharacter() { pavone@0: var cacheKey = 'doubleQuotedCharacter@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var result6 = parse_simpleDoubleQuotedCharacter(); pavone@0: if (result6 !== null) { pavone@0: var result0 = result6; pavone@0: } else { pavone@0: var result5 = parse_simpleEscapeSequence(); pavone@0: if (result5 !== null) { pavone@0: var result0 = result5; pavone@0: } else { pavone@0: var result4 = parse_zeroEscapeSequence(); pavone@0: if (result4 !== null) { pavone@0: var result0 = result4; pavone@0: } else { pavone@0: var result3 = parse_hexEscapeSequence(); pavone@0: if (result3 !== null) { pavone@0: var result0 = result3; pavone@0: } else { pavone@0: var result2 = parse_unicodeEscapeSequence(); pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result1 = parse_eolEscapeSequence(); pavone@0: if (result1 !== null) { pavone@0: var result0 = result1; pavone@0: } else { pavone@0: var result0 = null;; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_simpleDoubleQuotedCharacter() { pavone@0: var cacheKey = 'simpleDoubleQuotedCharacter@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: var savedPos2 = pos; pavone@0: var savedReportMatchFailuresVar0 = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: if (input.substr(pos, 1) === "\"") { pavone@0: var result8 = "\""; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result8 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\\\"\""); pavone@0: } pavone@0: } pavone@0: if (result8 !== null) { pavone@0: var result5 = result8; pavone@0: } else { pavone@0: if (input.substr(pos, 1) === "\\") { pavone@0: var result7 = "\\"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result7 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\\\\\""); pavone@0: } pavone@0: } pavone@0: if (result7 !== null) { pavone@0: var result5 = result7; pavone@0: } else { pavone@0: var result6 = parse_eolChar(); pavone@0: if (result6 !== null) { pavone@0: var result5 = result6; pavone@0: } else { pavone@0: var result5 = null;; pavone@0: }; pavone@0: }; pavone@0: } pavone@0: reportMatchFailures = savedReportMatchFailuresVar0; pavone@0: if (result5 === null) { pavone@0: var result3 = ''; pavone@0: } else { pavone@0: var result3 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: if (result3 !== null) { pavone@0: if (input.length > pos) { pavone@0: var result4 = input.charAt(pos); pavone@0: pos++; pavone@0: } else { pavone@0: var result4 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed('any character'); pavone@0: } pavone@0: } pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(char_) { return char_; })(result1[1]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_singleQuotedLiteral() { pavone@0: var cacheKey = 'singleQuotedLiteral@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === "'") { pavone@0: var result3 = "'"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"'\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = []; pavone@0: var result6 = parse_singleQuotedCharacter(); pavone@0: while (result6 !== null) { pavone@0: result4.push(result6); pavone@0: var result6 = parse_singleQuotedCharacter(); pavone@0: } pavone@0: if (result4 !== null) { pavone@0: if (input.substr(pos, 1) === "'") { pavone@0: var result5 = "'"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result5 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"'\""); pavone@0: } pavone@0: } pavone@0: if (result5 !== null) { pavone@0: var result1 = [result3, result4, result5]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(chars) { return chars.join(""); })(result1[1]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_singleQuotedCharacter() { pavone@0: var cacheKey = 'singleQuotedCharacter@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var result6 = parse_simpleSingleQuotedCharacter(); pavone@0: if (result6 !== null) { pavone@0: var result0 = result6; pavone@0: } else { pavone@0: var result5 = parse_simpleEscapeSequence(); pavone@0: if (result5 !== null) { pavone@0: var result0 = result5; pavone@0: } else { pavone@0: var result4 = parse_zeroEscapeSequence(); pavone@0: if (result4 !== null) { pavone@0: var result0 = result4; pavone@0: } else { pavone@0: var result3 = parse_hexEscapeSequence(); pavone@0: if (result3 !== null) { pavone@0: var result0 = result3; pavone@0: } else { pavone@0: var result2 = parse_unicodeEscapeSequence(); pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result1 = parse_eolEscapeSequence(); pavone@0: if (result1 !== null) { pavone@0: var result0 = result1; pavone@0: } else { pavone@0: var result0 = null;; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_simpleSingleQuotedCharacter() { pavone@0: var cacheKey = 'simpleSingleQuotedCharacter@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: var savedPos2 = pos; pavone@0: var savedReportMatchFailuresVar0 = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: if (input.substr(pos, 1) === "'") { pavone@0: var result8 = "'"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result8 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"'\""); pavone@0: } pavone@0: } pavone@0: if (result8 !== null) { pavone@0: var result5 = result8; pavone@0: } else { pavone@0: if (input.substr(pos, 1) === "\\") { pavone@0: var result7 = "\\"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result7 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\\\\\""); pavone@0: } pavone@0: } pavone@0: if (result7 !== null) { pavone@0: var result5 = result7; pavone@0: } else { pavone@0: var result6 = parse_eolChar(); pavone@0: if (result6 !== null) { pavone@0: var result5 = result6; pavone@0: } else { pavone@0: var result5 = null;; pavone@0: }; pavone@0: }; pavone@0: } pavone@0: reportMatchFailures = savedReportMatchFailuresVar0; pavone@0: if (result5 === null) { pavone@0: var result3 = ''; pavone@0: } else { pavone@0: var result3 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: if (result3 !== null) { pavone@0: if (input.length > pos) { pavone@0: var result4 = input.charAt(pos); pavone@0: pos++; pavone@0: } else { pavone@0: var result4 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed('any character'); pavone@0: } pavone@0: } pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(char_) { return char_; })(result1[1]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_class() { pavone@0: var cacheKey = 'class@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: var savedReportMatchFailures = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === "[") { pavone@0: var result3 = "["; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"[\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: if (input.substr(pos, 1) === "^") { pavone@0: var result11 = "^"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result11 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"^\""); pavone@0: } pavone@0: } pavone@0: var result4 = result11 !== null ? result11 : ''; pavone@0: if (result4 !== null) { pavone@0: var result5 = []; pavone@0: var result10 = parse_classCharacterRange(); pavone@0: if (result10 !== null) { pavone@0: var result8 = result10; pavone@0: } else { pavone@0: var result9 = parse_classCharacter(); pavone@0: if (result9 !== null) { pavone@0: var result8 = result9; pavone@0: } else { pavone@0: var result8 = null;; pavone@0: }; pavone@0: } pavone@0: while (result8 !== null) { pavone@0: result5.push(result8); pavone@0: var result10 = parse_classCharacterRange(); pavone@0: if (result10 !== null) { pavone@0: var result8 = result10; pavone@0: } else { pavone@0: var result9 = parse_classCharacter(); pavone@0: if (result9 !== null) { pavone@0: var result8 = result9; pavone@0: } else { pavone@0: var result8 = null;; pavone@0: }; pavone@0: } pavone@0: } pavone@0: if (result5 !== null) { pavone@0: if (input.substr(pos, 1) === "]") { pavone@0: var result6 = "]"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result6 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"]\""); pavone@0: } pavone@0: } pavone@0: if (result6 !== null) { pavone@0: var result7 = parse___(); pavone@0: if (result7 !== null) { pavone@0: var result1 = [result3, result4, result5, result6, result7]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(inverted, parts) { pavone@0: var partsConverted = map(parts, function(part) { return part.data; }); pavone@0: var rawText = "[" pavone@0: + inverted pavone@0: + map(parts, function(part) { return part.rawText; }).join("") pavone@0: + "]"; pavone@0: pavone@0: return { pavone@0: type: "class", pavone@0: inverted: inverted === "^", pavone@0: parts: partsConverted, pavone@0: // FIXME: Get the raw text from the input directly. pavone@0: rawText: rawText pavone@0: }; pavone@0: })(result1[1], result1[2]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: reportMatchFailures = savedReportMatchFailures; pavone@0: if (reportMatchFailures && result0 === null) { pavone@0: matchFailed("character class"); pavone@0: } pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_classCharacterRange() { pavone@0: var cacheKey = 'classCharacterRange@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: var result3 = parse_classCharacter(); pavone@0: if (result3 !== null) { pavone@0: if (input.substr(pos, 1) === "-") { pavone@0: var result4 = "-"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result4 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"-\""); pavone@0: } pavone@0: } pavone@0: if (result4 !== null) { pavone@0: var result5 = parse_classCharacter(); pavone@0: if (result5 !== null) { pavone@0: var result1 = [result3, result4, result5]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(begin, end) { pavone@0: if (begin.data.charCodeAt(0) > end.data.charCodeAt(0)) { pavone@0: throw new this.SyntaxError( pavone@0: "Invalid character range: " + begin.rawText + "-" + end.rawText + "." pavone@0: ); pavone@0: } pavone@0: pavone@0: return { pavone@0: data: [begin.data, end.data], pavone@0: // FIXME: Get the raw text from the input directly. pavone@0: rawText: begin.rawText + "-" + end.rawText pavone@0: } pavone@0: })(result1[0], result1[2]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_classCharacter() { pavone@0: var cacheKey = 'classCharacter@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var result1 = parse_bracketDelimitedCharacter(); pavone@0: var result2 = result1 !== null pavone@0: ? (function(char_) { pavone@0: return { pavone@0: data: char_, pavone@0: // FIXME: Get the raw text from the input directly. pavone@0: rawText: quoteForRegexpClass(char_) pavone@0: }; pavone@0: })(result1) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_bracketDelimitedCharacter() { pavone@0: var cacheKey = 'bracketDelimitedCharacter@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var result6 = parse_simpleBracketDelimitedCharacter(); pavone@0: if (result6 !== null) { pavone@0: var result0 = result6; pavone@0: } else { pavone@0: var result5 = parse_simpleEscapeSequence(); pavone@0: if (result5 !== null) { pavone@0: var result0 = result5; pavone@0: } else { pavone@0: var result4 = parse_zeroEscapeSequence(); pavone@0: if (result4 !== null) { pavone@0: var result0 = result4; pavone@0: } else { pavone@0: var result3 = parse_hexEscapeSequence(); pavone@0: if (result3 !== null) { pavone@0: var result0 = result3; pavone@0: } else { pavone@0: var result2 = parse_unicodeEscapeSequence(); pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result1 = parse_eolEscapeSequence(); pavone@0: if (result1 !== null) { pavone@0: var result0 = result1; pavone@0: } else { pavone@0: var result0 = null;; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_simpleBracketDelimitedCharacter() { pavone@0: var cacheKey = 'simpleBracketDelimitedCharacter@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: var savedPos2 = pos; pavone@0: var savedReportMatchFailuresVar0 = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: if (input.substr(pos, 1) === "]") { pavone@0: var result8 = "]"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result8 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"]\""); pavone@0: } pavone@0: } pavone@0: if (result8 !== null) { pavone@0: var result5 = result8; pavone@0: } else { pavone@0: if (input.substr(pos, 1) === "\\") { pavone@0: var result7 = "\\"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result7 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\\\\\""); pavone@0: } pavone@0: } pavone@0: if (result7 !== null) { pavone@0: var result5 = result7; pavone@0: } else { pavone@0: var result6 = parse_eolChar(); pavone@0: if (result6 !== null) { pavone@0: var result5 = result6; pavone@0: } else { pavone@0: var result5 = null;; pavone@0: }; pavone@0: }; pavone@0: } pavone@0: reportMatchFailures = savedReportMatchFailuresVar0; pavone@0: if (result5 === null) { pavone@0: var result3 = ''; pavone@0: } else { pavone@0: var result3 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: if (result3 !== null) { pavone@0: if (input.length > pos) { pavone@0: var result4 = input.charAt(pos); pavone@0: pos++; pavone@0: } else { pavone@0: var result4 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed('any character'); pavone@0: } pavone@0: } pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(char_) { return char_; })(result1[1]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_simpleEscapeSequence() { pavone@0: var cacheKey = 'simpleEscapeSequence@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === "\\") { pavone@0: var result3 = "\\"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\\\\\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var savedPos2 = pos; pavone@0: var savedReportMatchFailuresVar0 = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: var result10 = parse_digit(); pavone@0: if (result10 !== null) { pavone@0: var result6 = result10; pavone@0: } else { pavone@0: if (input.substr(pos, 1) === "x") { pavone@0: var result9 = "x"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result9 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"x\""); pavone@0: } pavone@0: } pavone@0: if (result9 !== null) { pavone@0: var result6 = result9; pavone@0: } else { pavone@0: if (input.substr(pos, 1) === "u") { pavone@0: var result8 = "u"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result8 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"u\""); pavone@0: } pavone@0: } pavone@0: if (result8 !== null) { pavone@0: var result6 = result8; pavone@0: } else { pavone@0: var result7 = parse_eolChar(); pavone@0: if (result7 !== null) { pavone@0: var result6 = result7; pavone@0: } else { pavone@0: var result6 = null;; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: } pavone@0: reportMatchFailures = savedReportMatchFailuresVar0; pavone@0: if (result6 === null) { pavone@0: var result4 = ''; pavone@0: } else { pavone@0: var result4 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: if (result4 !== null) { pavone@0: if (input.length > pos) { pavone@0: var result5 = input.charAt(pos); pavone@0: pos++; pavone@0: } else { pavone@0: var result5 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed('any character'); pavone@0: } pavone@0: } pavone@0: if (result5 !== null) { pavone@0: var result1 = [result3, result4, result5]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(char_) { pavone@0: return char_ pavone@0: .replace("b", "\b") pavone@0: .replace("f", "\f") pavone@0: .replace("n", "\n") pavone@0: .replace("r", "\r") pavone@0: .replace("t", "\t") pavone@0: .replace("v", "\x0B") // IE does not recognize "\v". pavone@0: })(result1[2]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_zeroEscapeSequence() { pavone@0: var cacheKey = 'zeroEscapeSequence@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 2) === "\\0") { pavone@0: var result3 = "\\0"; pavone@0: pos += 2; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\\\\0\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var savedPos2 = pos; pavone@0: var savedReportMatchFailuresVar0 = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: var result5 = parse_digit(); pavone@0: reportMatchFailures = savedReportMatchFailuresVar0; pavone@0: if (result5 === null) { pavone@0: var result4 = ''; pavone@0: } else { pavone@0: var result4 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function() { return "\0"; })() pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_hexEscapeSequence() { pavone@0: var cacheKey = 'hexEscapeSequence@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 2) === "\\x") { pavone@0: var result3 = "\\x"; pavone@0: pos += 2; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\\\\x\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = parse_hexDigit(); pavone@0: if (result4 !== null) { pavone@0: var result5 = parse_hexDigit(); pavone@0: if (result5 !== null) { pavone@0: var result1 = [result3, result4, result5]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(h1, h2) { pavone@0: return String.fromCharCode(parseInt("0x" + h1 + h2)); pavone@0: })(result1[1], result1[2]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_unicodeEscapeSequence() { pavone@0: var cacheKey = 'unicodeEscapeSequence@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 2) === "\\u") { pavone@0: var result3 = "\\u"; pavone@0: pos += 2; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\\\\u\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = parse_hexDigit(); pavone@0: if (result4 !== null) { pavone@0: var result5 = parse_hexDigit(); pavone@0: if (result5 !== null) { pavone@0: var result6 = parse_hexDigit(); pavone@0: if (result6 !== null) { pavone@0: var result7 = parse_hexDigit(); pavone@0: if (result7 !== null) { pavone@0: var result1 = [result3, result4, result5, result6, result7]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(h1, h2, h3, h4) { pavone@0: return String.fromCharCode(parseInt("0x" + h1 + h2 + h3 + h4)); pavone@0: })(result1[1], result1[2], result1[3], result1[4]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_eolEscapeSequence() { pavone@0: var cacheKey = 'eolEscapeSequence@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: var savedPos1 = pos; pavone@0: if (input.substr(pos, 1) === "\\") { pavone@0: var result3 = "\\"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\\\\\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result4 = parse_eol(); pavone@0: if (result4 !== null) { pavone@0: var result1 = [result3, result4]; pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result1 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: var result2 = result1 !== null pavone@0: ? (function(eol) { return eol; })(result1[1]) pavone@0: : null; pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_digit() { pavone@0: var cacheKey = 'digit@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: if (input.substr(pos).match(/^[0-9]/) !== null) { pavone@0: var result0 = input.charAt(pos); pavone@0: pos++; pavone@0: } else { pavone@0: var result0 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("[0-9]"); pavone@0: } pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_hexDigit() { pavone@0: var cacheKey = 'hexDigit@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: if (input.substr(pos).match(/^[0-9a-fA-F]/) !== null) { pavone@0: var result0 = input.charAt(pos); pavone@0: pos++; pavone@0: } else { pavone@0: var result0 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("[0-9a-fA-F]"); pavone@0: } pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_letter() { pavone@0: var cacheKey = 'letter@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var result2 = parse_lowerCaseLetter(); pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result1 = parse_upperCaseLetter(); pavone@0: if (result1 !== null) { pavone@0: var result0 = result1; pavone@0: } else { pavone@0: var result0 = null;; pavone@0: }; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_lowerCaseLetter() { pavone@0: var cacheKey = 'lowerCaseLetter@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: if (input.substr(pos).match(/^[a-z]/) !== null) { pavone@0: var result0 = input.charAt(pos); pavone@0: pos++; pavone@0: } else { pavone@0: var result0 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("[a-z]"); pavone@0: } pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_upperCaseLetter() { pavone@0: var cacheKey = 'upperCaseLetter@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: if (input.substr(pos).match(/^[A-Z]/) !== null) { pavone@0: var result0 = input.charAt(pos); pavone@0: pos++; pavone@0: } else { pavone@0: var result0 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("[A-Z]"); pavone@0: } pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse___() { pavone@0: var cacheKey = '__@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var result0 = []; pavone@0: var result4 = parse_whitespace(); pavone@0: if (result4 !== null) { pavone@0: var result1 = result4; pavone@0: } else { pavone@0: var result3 = parse_eol(); pavone@0: if (result3 !== null) { pavone@0: var result1 = result3; pavone@0: } else { pavone@0: var result2 = parse_comment(); pavone@0: if (result2 !== null) { pavone@0: var result1 = result2; pavone@0: } else { pavone@0: var result1 = null;; pavone@0: }; pavone@0: }; pavone@0: } pavone@0: while (result1 !== null) { pavone@0: result0.push(result1); pavone@0: var result4 = parse_whitespace(); pavone@0: if (result4 !== null) { pavone@0: var result1 = result4; pavone@0: } else { pavone@0: var result3 = parse_eol(); pavone@0: if (result3 !== null) { pavone@0: var result1 = result3; pavone@0: } else { pavone@0: var result2 = parse_comment(); pavone@0: if (result2 !== null) { pavone@0: var result1 = result2; pavone@0: } else { pavone@0: var result1 = null;; pavone@0: }; pavone@0: }; pavone@0: } pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_comment() { pavone@0: var cacheKey = 'comment@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: var savedReportMatchFailures = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: var result2 = parse_singleLineComment(); pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: var result1 = parse_multiLineComment(); pavone@0: if (result1 !== null) { pavone@0: var result0 = result1; pavone@0: } else { pavone@0: var result0 = null;; pavone@0: }; pavone@0: } pavone@0: reportMatchFailures = savedReportMatchFailures; pavone@0: if (reportMatchFailures && result0 === null) { pavone@0: matchFailed("comment"); pavone@0: } pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_singleLineComment() { pavone@0: var cacheKey = 'singleLineComment@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: if (input.substr(pos, 2) === "//") { pavone@0: var result1 = "//"; pavone@0: pos += 2; pavone@0: } else { pavone@0: var result1 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"//\""); pavone@0: } pavone@0: } pavone@0: if (result1 !== null) { pavone@0: var result2 = []; pavone@0: var savedPos1 = pos; pavone@0: var savedPos2 = pos; pavone@0: var savedReportMatchFailuresVar0 = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: var result6 = parse_eolChar(); pavone@0: reportMatchFailures = savedReportMatchFailuresVar0; pavone@0: if (result6 === null) { pavone@0: var result4 = ''; pavone@0: } else { pavone@0: var result4 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: if (result4 !== null) { pavone@0: if (input.length > pos) { pavone@0: var result5 = input.charAt(pos); pavone@0: pos++; pavone@0: } else { pavone@0: var result5 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed('any character'); pavone@0: } pavone@0: } pavone@0: if (result5 !== null) { pavone@0: var result3 = [result4, result5]; pavone@0: } else { pavone@0: var result3 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result3 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: while (result3 !== null) { pavone@0: result2.push(result3); pavone@0: var savedPos1 = pos; pavone@0: var savedPos2 = pos; pavone@0: var savedReportMatchFailuresVar0 = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: var result6 = parse_eolChar(); pavone@0: reportMatchFailures = savedReportMatchFailuresVar0; pavone@0: if (result6 === null) { pavone@0: var result4 = ''; pavone@0: } else { pavone@0: var result4 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: if (result4 !== null) { pavone@0: if (input.length > pos) { pavone@0: var result5 = input.charAt(pos); pavone@0: pos++; pavone@0: } else { pavone@0: var result5 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed('any character'); pavone@0: } pavone@0: } pavone@0: if (result5 !== null) { pavone@0: var result3 = [result4, result5]; pavone@0: } else { pavone@0: var result3 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result3 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } pavone@0: if (result2 !== null) { pavone@0: var result0 = [result1, result2]; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_multiLineComment() { pavone@0: var cacheKey = 'multiLineComment@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: var savedPos0 = pos; pavone@0: if (input.substr(pos, 2) === "/*") { pavone@0: var result1 = "/*"; pavone@0: pos += 2; pavone@0: } else { pavone@0: var result1 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"/*\""); pavone@0: } pavone@0: } pavone@0: if (result1 !== null) { pavone@0: var result2 = []; pavone@0: var savedPos1 = pos; pavone@0: var savedPos2 = pos; pavone@0: var savedReportMatchFailuresVar0 = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: if (input.substr(pos, 2) === "*/") { pavone@0: var result7 = "*/"; pavone@0: pos += 2; pavone@0: } else { pavone@0: var result7 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"*/\""); pavone@0: } pavone@0: } pavone@0: reportMatchFailures = savedReportMatchFailuresVar0; pavone@0: if (result7 === null) { pavone@0: var result5 = ''; pavone@0: } else { pavone@0: var result5 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: if (result5 !== null) { pavone@0: if (input.length > pos) { pavone@0: var result6 = input.charAt(pos); pavone@0: pos++; pavone@0: } else { pavone@0: var result6 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed('any character'); pavone@0: } pavone@0: } pavone@0: if (result6 !== null) { pavone@0: var result4 = [result5, result6]; pavone@0: } else { pavone@0: var result4 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result4 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: while (result4 !== null) { pavone@0: result2.push(result4); pavone@0: var savedPos1 = pos; pavone@0: var savedPos2 = pos; pavone@0: var savedReportMatchFailuresVar0 = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: if (input.substr(pos, 2) === "*/") { pavone@0: var result7 = "*/"; pavone@0: pos += 2; pavone@0: } else { pavone@0: var result7 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"*/\""); pavone@0: } pavone@0: } pavone@0: reportMatchFailures = savedReportMatchFailuresVar0; pavone@0: if (result7 === null) { pavone@0: var result5 = ''; pavone@0: } else { pavone@0: var result5 = null; pavone@0: pos = savedPos2; pavone@0: } pavone@0: if (result5 !== null) { pavone@0: if (input.length > pos) { pavone@0: var result6 = input.charAt(pos); pavone@0: pos++; pavone@0: } else { pavone@0: var result6 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed('any character'); pavone@0: } pavone@0: } pavone@0: if (result6 !== null) { pavone@0: var result4 = [result5, result6]; pavone@0: } else { pavone@0: var result4 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } else { pavone@0: var result4 = null; pavone@0: pos = savedPos1; pavone@0: } pavone@0: } pavone@0: if (result2 !== null) { pavone@0: if (input.substr(pos, 2) === "*/") { pavone@0: var result3 = "*/"; pavone@0: pos += 2; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"*/\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result0 = [result1, result2, result3]; pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: } else { pavone@0: var result0 = null; pavone@0: pos = savedPos0; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_eol() { pavone@0: var cacheKey = 'eol@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: var savedReportMatchFailures = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: if (input.substr(pos, 1) === "\n") { pavone@0: var result5 = "\n"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result5 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\\n\""); pavone@0: } pavone@0: } pavone@0: if (result5 !== null) { pavone@0: var result0 = result5; pavone@0: } else { pavone@0: if (input.substr(pos, 2) === "\r\n") { pavone@0: var result4 = "\r\n"; pavone@0: pos += 2; pavone@0: } else { pavone@0: var result4 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\\r\\n\""); pavone@0: } pavone@0: } pavone@0: if (result4 !== null) { pavone@0: var result0 = result4; pavone@0: } else { pavone@0: if (input.substr(pos, 1) === "\r") { pavone@0: var result3 = "\r"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result3 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\\r\""); pavone@0: } pavone@0: } pavone@0: if (result3 !== null) { pavone@0: var result0 = result3; pavone@0: } else { pavone@0: if (input.substr(pos, 1) === "\u2028") { pavone@0: var result2 = "\u2028"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result2 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\\u2028\""); pavone@0: } pavone@0: } pavone@0: if (result2 !== null) { pavone@0: var result0 = result2; pavone@0: } else { pavone@0: if (input.substr(pos, 1) === "\u2029") { pavone@0: var result1 = "\u2029"; pavone@0: pos += 1; pavone@0: } else { pavone@0: var result1 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("\"\\u2029\""); pavone@0: } pavone@0: } pavone@0: if (result1 !== null) { pavone@0: var result0 = result1; pavone@0: } else { pavone@0: var result0 = null;; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: }; pavone@0: } pavone@0: reportMatchFailures = savedReportMatchFailures; pavone@0: if (reportMatchFailures && result0 === null) { pavone@0: matchFailed("end of line"); pavone@0: } pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_eolChar() { pavone@0: var cacheKey = 'eolChar@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: pavone@0: if (input.substr(pos).match(/^[\n\r\u2028\u2029]/) !== null) { pavone@0: var result0 = input.charAt(pos); pavone@0: pos++; pavone@0: } else { pavone@0: var result0 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("[\\n\\r\\u2028\\u2029]"); pavone@0: } pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function parse_whitespace() { pavone@0: var cacheKey = 'whitespace@' + pos; pavone@0: var cachedResult = cache[cacheKey]; pavone@0: if (cachedResult) { pavone@0: pos = cachedResult.nextPos; pavone@0: return cachedResult.result; pavone@0: } pavone@0: pavone@0: var savedReportMatchFailures = reportMatchFailures; pavone@0: reportMatchFailures = false; pavone@0: if (input.substr(pos).match(/^[ \xA0\uFEFF\u1680\u180E\u2000-\u200A\u202F\u205F\u3000]/) !== null) { pavone@0: var result0 = input.charAt(pos); pavone@0: pos++; pavone@0: } else { pavone@0: var result0 = null; pavone@0: if (reportMatchFailures) { pavone@0: matchFailed("[ \\xA0\\uFEFF\\u1680\\u180E\\u2000-\\u200A\\u202F\\u205F\\u3000]"); pavone@0: } pavone@0: } pavone@0: reportMatchFailures = savedReportMatchFailures; pavone@0: if (reportMatchFailures && result0 === null) { pavone@0: matchFailed("whitespace"); pavone@0: } pavone@0: pavone@0: cache[cacheKey] = { pavone@0: nextPos: pos, pavone@0: result: result0 pavone@0: }; pavone@0: return result0; pavone@0: } pavone@0: pavone@0: function buildErrorMessage() { pavone@0: function buildExpected(failuresExpected) { pavone@0: failuresExpected.sort(); pavone@0: pavone@0: var lastFailure = null; pavone@0: var failuresExpectedUnique = []; pavone@0: for (var i = 0; i < failuresExpected.length; i++) { pavone@0: if (failuresExpected[i] !== lastFailure) { pavone@0: failuresExpectedUnique.push(failuresExpected[i]); pavone@0: lastFailure = failuresExpected[i]; pavone@0: } pavone@0: } pavone@0: pavone@0: switch (failuresExpectedUnique.length) { pavone@0: case 0: pavone@0: return 'end of input'; pavone@0: case 1: pavone@0: return failuresExpectedUnique[0]; pavone@0: default: pavone@0: return failuresExpectedUnique.slice(0, failuresExpectedUnique.length - 1).join(', ') pavone@0: + ' or ' pavone@0: + failuresExpectedUnique[failuresExpectedUnique.length - 1]; pavone@0: } pavone@0: } pavone@0: pavone@0: var expected = buildExpected(rightmostMatchFailuresExpected); pavone@0: var actualPos = Math.max(pos, rightmostMatchFailuresPos); pavone@0: var actual = actualPos < input.length pavone@0: ? quote(input.charAt(actualPos)) pavone@0: : 'end of input'; pavone@0: pavone@0: return 'Expected ' + expected + ' but ' + actual + ' found.'; pavone@0: } pavone@0: pavone@0: function computeErrorPosition() { pavone@0: /* pavone@0: * The first idea was to use |String.split| to break the input up to the pavone@0: * error position along newlines and derive the line and column from pavone@0: * there. However IE's |split| implementation is so broken that it was pavone@0: * enough to prevent it. pavone@0: */ pavone@0: pavone@0: var line = 1; pavone@0: var column = 1; pavone@0: var seenCR = false; pavone@0: pavone@0: for (var i = 0; i < rightmostMatchFailuresPos; i++) { pavone@0: var ch = input.charAt(i); pavone@0: if (ch === '\n') { pavone@0: if (!seenCR) { line++; } pavone@0: column = 1; pavone@0: seenCR = false; pavone@0: } else if (ch === '\r' | ch === '\u2028' || ch === '\u2029') { pavone@0: line++; pavone@0: column = 1; pavone@0: seenCR = true; pavone@0: } else { pavone@0: column++; pavone@0: seenCR = false; pavone@0: } pavone@0: } pavone@0: pavone@0: return { line: line, column: column }; pavone@0: } pavone@0: pavone@0: pavone@0: pavone@0: var result = parseFunctions[startRule](); pavone@0: pavone@0: /* pavone@0: * The parser is now in one of the following three states: pavone@0: * pavone@0: * 1. The parser successfully parsed the whole input. pavone@0: * pavone@0: * - |result !== null| pavone@0: * - |pos === input.length| pavone@0: * - |rightmostMatchFailuresExpected| may or may not contain something pavone@0: * pavone@0: * 2. The parser successfully parsed only a part of the input. pavone@0: * pavone@0: * - |result !== null| pavone@0: * - |pos < input.length| pavone@0: * - |rightmostMatchFailuresExpected| may or may not contain something pavone@0: * pavone@0: * 3. The parser did not successfully parse any part of the input. pavone@0: * pavone@0: * - |result === null| pavone@0: * - |pos === 0| pavone@0: * - |rightmostMatchFailuresExpected| contains at least one failure pavone@0: * pavone@0: * All code following this comment (including called functions) must pavone@0: * handle these states. pavone@0: */ pavone@0: if (result === null || pos !== input.length) { pavone@0: var errorPosition = computeErrorPosition(); pavone@0: throw new this.SyntaxError( pavone@0: buildErrorMessage(), pavone@0: errorPosition.line, pavone@0: errorPosition.column pavone@0: ); pavone@0: } pavone@0: pavone@0: return result; pavone@0: }, pavone@0: pavone@0: /* Returns the parser source code. */ pavone@0: toSource: function() { return this._source; } pavone@0: }; pavone@0: pavone@0: /* Thrown when a parser encounters a syntax error. */ pavone@0: pavone@0: result.SyntaxError = function(message, line, column) { pavone@0: this.name = 'SyntaxError'; pavone@0: this.message = message; pavone@0: this.line = line; pavone@0: this.column = column; pavone@0: }; pavone@0: pavone@0: result.SyntaxError.prototype = Error.prototype; pavone@0: pavone@0: return result; pavone@0: })(); pavone@0: PEG.compiler = { pavone@0: /* pavone@0: * Generates a parser from a specified grammar AST. Throws |PEG.GrammarError| pavone@0: * if the AST contains a semantic error. Note that not all errors are detected pavone@0: * during the generation and some may protrude to the generated parser and pavone@0: * cause its malfunction. pavone@0: */ pavone@0: compile: function(ast) { pavone@0: var CHECK_NAMES = [ pavone@0: "missingReferencedRules", pavone@0: "leftRecursion" pavone@0: ]; pavone@0: pavone@0: var PASS_NAMES = [ pavone@0: "proxyRules" pavone@0: ]; pavone@0: pavone@0: for (var i = 0; i < CHECK_NAMES.length; i++) { pavone@0: this.checks[CHECK_NAMES[i]](ast); pavone@0: } pavone@0: pavone@0: for (var i = 0; i < PASS_NAMES.length; i++) { pavone@0: ast = this.passes[PASS_NAMES[i]](ast); pavone@0: } pavone@0: pavone@0: var source = this.emitter(ast); pavone@0: var result = eval(source); pavone@0: result._source = source; pavone@0: pavone@0: return result; pavone@0: } pavone@0: }; pavone@0: pavone@0: /* pavone@0: * Checks made on the grammar AST before compilation. Each check is a function pavone@0: * that is passed the AST and does not return anything. If the check passes, the pavone@0: * function does not do anything special, otherwise it throws pavone@0: * |PEG.GrammarError|. The order in which the checks are run is specified in pavone@0: * |PEG.compiler.compile| and should be the same as the order of definitions pavone@0: * here. pavone@0: */ pavone@0: PEG.compiler.checks = { pavone@0: /* Checks that all referenced rules exist. */ pavone@0: missingReferencedRules: function(ast) { pavone@0: function nop() {} pavone@0: pavone@0: function checkExpression(node) { check(node.expression); } pavone@0: pavone@0: function checkSubnodes(propertyName) { pavone@0: return function(node) { each(node[propertyName], check); }; pavone@0: } pavone@0: pavone@0: var check = buildNodeVisitor({ pavone@0: grammar: pavone@0: function(node) { pavone@0: for (var name in node.rules) { pavone@0: check(node.rules[name]); pavone@0: } pavone@0: }, pavone@0: pavone@0: rule: checkExpression, pavone@0: choice: checkSubnodes("alternatives"), pavone@0: sequence: checkSubnodes("elements"), pavone@0: labeled: checkExpression, pavone@0: simple_and: checkExpression, pavone@0: simple_not: checkExpression, pavone@0: semantic_and: nop, pavone@0: semantic_not: nop, pavone@0: optional: checkExpression, pavone@0: zero_or_more: checkExpression, pavone@0: one_or_more: checkExpression, pavone@0: action: checkExpression, pavone@0: pavone@0: rule_ref: pavone@0: function(node) { pavone@0: if (ast.rules[node.name] === undefined) { pavone@0: throw new PEG.GrammarError( pavone@0: "Referenced rule \"" + node.name + "\" does not exist." pavone@0: ); pavone@0: } pavone@0: }, pavone@0: pavone@0: literal: nop, pavone@0: any: nop, pavone@0: "class": nop pavone@0: }); pavone@0: pavone@0: check(ast); pavone@0: }, pavone@0: pavone@0: /* Checks that no left recursion is present. */ pavone@0: leftRecursion: function(ast) { pavone@0: function nop() {} pavone@0: pavone@0: function checkExpression(node, appliedRules) { pavone@0: check(node.expression, appliedRules); pavone@0: } pavone@0: pavone@0: var check = buildNodeVisitor({ pavone@0: grammar: pavone@0: function(node, appliedRules) { pavone@0: for (var name in node.rules) { pavone@0: check(node.rules[name], appliedRules); pavone@0: } pavone@0: }, pavone@0: pavone@0: rule: pavone@0: function(node, appliedRules) { pavone@0: check(node.expression, appliedRules.concat(node.name)); pavone@0: }, pavone@0: pavone@0: choice: pavone@0: function(node, appliedRules) { pavone@0: each(node.alternatives, function(alternative) { pavone@0: check(alternative, appliedRules); pavone@0: }); pavone@0: }, pavone@0: pavone@0: sequence: pavone@0: function(node, appliedRules) { pavone@0: if (node.elements.length > 0) { pavone@0: check(node.elements[0], appliedRules); pavone@0: } pavone@0: }, pavone@0: pavone@0: labeled: checkExpression, pavone@0: simple_and: checkExpression, pavone@0: simple_not: checkExpression, pavone@0: semantic_and: nop, pavone@0: semantic_not: nop, pavone@0: optional: checkExpression, pavone@0: zero_or_more: checkExpression, pavone@0: one_or_more: checkExpression, pavone@0: action: checkExpression, pavone@0: pavone@0: rule_ref: pavone@0: function(node, appliedRules) { pavone@0: if (contains(appliedRules, node.name)) { pavone@0: throw new PEG.GrammarError( pavone@0: "Left recursion detected for rule \"" + node.name + "\"." pavone@0: ); pavone@0: } pavone@0: check(ast.rules[node.name], appliedRules); pavone@0: }, pavone@0: pavone@0: literal: nop, pavone@0: any: nop, pavone@0: "class": nop pavone@0: }); pavone@0: pavone@0: check(ast, []); pavone@0: } pavone@0: }; pavone@0: /* pavone@0: * Optimalization passes made on the grammar AST before compilation. Each pass pavone@0: * is a function that is passed the AST and returns a new AST. The AST can be pavone@0: * modified in-place by the pass. The order in which the passes are run is pavone@0: * specified in |PEG.compiler.compile| and should be the same as the order of pavone@0: * definitions here. pavone@0: */ pavone@0: PEG.compiler.passes = { pavone@0: /* pavone@0: * Removes proxy rules -- that is, rules that only delegate to other rule. pavone@0: */ pavone@0: proxyRules: function(ast) { pavone@0: function isProxyRule(node) { pavone@0: return node.type === "rule" && node.expression.type === "rule_ref"; pavone@0: } pavone@0: pavone@0: function replaceRuleRefs(ast, from, to) { pavone@0: function nop() {} pavone@0: pavone@0: function replaceInExpression(node, from, to) { pavone@0: replace(node.expression, from, to); pavone@0: } pavone@0: pavone@0: function replaceInSubnodes(propertyName) { pavone@0: return function(node, from, to) { pavone@0: each(node[propertyName], function(subnode) { pavone@0: replace(subnode, from, to); pavone@0: }); pavone@0: }; pavone@0: } pavone@0: pavone@0: var replace = buildNodeVisitor({ pavone@0: grammar: pavone@0: function(node, from, to) { pavone@0: for (var name in node.rules) { pavone@0: replace(node.rules[name], from, to); pavone@0: } pavone@0: }, pavone@0: pavone@0: rule: replaceInExpression, pavone@0: choice: replaceInSubnodes("alternatives"), pavone@0: sequence: replaceInSubnodes("elements"), pavone@0: labeled: replaceInExpression, pavone@0: simple_and: replaceInExpression, pavone@0: simple_not: replaceInExpression, pavone@0: semantic_and: nop, pavone@0: semantic_not: nop, pavone@0: optional: replaceInExpression, pavone@0: zero_or_more: replaceInExpression, pavone@0: one_or_more: replaceInExpression, pavone@0: action: replaceInExpression, pavone@0: pavone@0: rule_ref: pavone@0: function(node, from, to) { pavone@0: if (node.name === from) { pavone@0: node.name = to; pavone@0: } pavone@0: }, pavone@0: pavone@0: literal: nop, pavone@0: any: nop, pavone@0: "class": nop pavone@0: }); pavone@0: pavone@0: replace(ast, from, to); pavone@0: } pavone@0: pavone@0: for (var name in ast.rules) { pavone@0: if (isProxyRule(ast.rules[name])) { pavone@0: replaceRuleRefs(ast, ast.rules[name].name, ast.rules[name].expression.name); pavone@0: if (name === ast.startRule) { pavone@0: ast.startRule = ast.rules[name].expression.name; pavone@0: } pavone@0: delete ast.rules[name]; pavone@0: } pavone@0: } pavone@0: pavone@0: return ast; pavone@0: } pavone@0: }; pavone@0: /* Emits the generated code for the AST. */ pavone@0: PEG.compiler.emitter = function(ast) { pavone@0: /* pavone@0: * Takes parts of code, interpolates variables inside them and joins them with pavone@0: * a newline. pavone@0: * pavone@0: * Variables are delimited with "${" and "}" and their names must be valid pavone@0: * identifiers (i.e. they must match [a-zA-Z_][a-zA-Z0-9_]*). Variable values pavone@0: * are specified as properties of the last parameter (if this is an object, pavone@0: * otherwise empty variable set is assumed). Undefined variables result in pavone@0: * throwing |Error|. pavone@0: * pavone@0: * There can be a filter specified after the variable name, prefixed with "|". pavone@0: * The filter name must be a valid identifier. The only recognized filter pavone@0: * right now is "string", which quotes the variable value as a JavaScript pavone@0: * string. Unrecognized filters result in throwing |Error|. pavone@0: * pavone@0: * If any part has multiple lines and the first line is indented by some pavone@0: * amount of whitespace (as defined by the /\s+/ JavaScript regular pavone@0: * expression), second to last lines are indented by the same amount of pavone@0: * whitespace. This results in nicely indented multiline code in variables pavone@0: * without making the templates look ugly. pavone@0: * pavone@0: * Examples: pavone@0: * pavone@0: * formatCode("foo", "bar"); // "foo\nbar" pavone@0: * formatCode("foo", "${bar}", { bar: "baz" }); // "foo\nbaz" pavone@0: * formatCode("foo", "${bar}"); // throws Error pavone@0: * formatCode("foo", "${bar|string}", { bar: "baz" }); // "foo\n\"baz\"" pavone@0: * formatCode("foo", "${bar|eeek}", { bar: "baz" }); // throws Error pavone@0: * formatCode("foo", "${bar}", { bar: " baz\nqux" }); // "foo\n baz\n qux" pavone@0: */ pavone@0: function formatCode() { pavone@0: function interpolateVariablesInParts(parts) { pavone@0: return map(parts, function(part) { pavone@0: return part.replace( pavone@0: /\$\{([a-zA-Z_][a-zA-Z0-9_]*)(\|([a-zA-Z_][a-zA-Z0-9_]*))?\}/g, pavone@0: function(match, name, dummy, filter) { pavone@0: var value = vars[name]; pavone@0: if (value === undefined) { pavone@0: throw new Error("Undefined variable: \"" + name + "\"."); pavone@0: } pavone@0: pavone@0: if (filter !== undefined && filter != "") { // JavaScript engines differ here. pavone@0: if (filter === "string") { pavone@0: return quote(value); pavone@0: } else { pavone@0: throw new Error("Unrecognized filter: \"" + filter + "\"."); pavone@0: } pavone@0: } else { pavone@0: return value; pavone@0: } pavone@0: } pavone@0: ); pavone@0: }); pavone@0: } pavone@0: pavone@0: function indentMultilineParts(parts) { pavone@0: return map(parts, function(part) { pavone@0: if (!/\n/.test(part)) { return part; } pavone@0: pavone@0: var firstLineWhitespacePrefix = part.match(/^\s*/)[0]; pavone@0: var lines = part.split("\n"); pavone@0: var linesIndented = [lines[0]].concat( pavone@0: map(lines.slice(1), function(line) { pavone@0: return firstLineWhitespacePrefix + line; pavone@0: }) pavone@0: ); pavone@0: return linesIndented.join("\n"); pavone@0: }); pavone@0: } pavone@0: pavone@0: var args = Array.prototype.slice.call(arguments); pavone@0: var vars = args[args.length - 1] instanceof Object ? args.pop() : {}; pavone@0: pavone@0: return indentMultilineParts(interpolateVariablesInParts(args)).join("\n"); pavone@0: }; pavone@0: pavone@0: /* Unique ID generator. */ pavone@0: var UID = { pavone@0: _counters: {}, pavone@0: pavone@0: next: function(prefix) { pavone@0: this._counters[prefix] = this._counters[prefix] || 0; pavone@0: return prefix + this._counters[prefix]++; pavone@0: }, pavone@0: pavone@0: reset: function() { pavone@0: this._counters = {}; pavone@0: } pavone@0: }; pavone@0: pavone@0: var emit = buildNodeVisitor({ pavone@0: grammar: function(node) { pavone@0: var initializerCode = node.initializer !== null pavone@0: ? emit(node.initializer) pavone@0: : ""; pavone@0: pavone@0: var parseFunctionTableItems = []; pavone@0: for (var name in node.rules) { pavone@0: parseFunctionTableItems.push(quote(name) + ": parse_" + name); pavone@0: } pavone@0: parseFunctionTableItems.sort(); pavone@0: pavone@0: var parseFunctionDefinitions = []; pavone@0: for (var name in node.rules) { pavone@0: parseFunctionDefinitions.push(emit(node.rules[name])); pavone@0: } pavone@0: pavone@0: return formatCode( pavone@0: "(function(){", pavone@0: " /* Generated by PEG.js 0.6.2 (http://pegjs.majda.cz/). */", pavone@0: " ", pavone@0: " var result = {", pavone@0: " /*", pavone@0: " * Parses the input with a generated parser. If the parsing is successfull,", pavone@0: " * returns a value explicitly or implicitly specified by the grammar from", pavone@0: " * which the parser was generated (see |PEG.buildParser|). If the parsing is", pavone@0: " * unsuccessful, throws |PEG.parser.SyntaxError| describing the error.", pavone@0: " */", pavone@0: " parse: function(input, startRule) {", pavone@0: " var parseFunctions = {", pavone@0: " ${parseFunctionTableItems}", pavone@0: " };", pavone@0: " ", pavone@0: " if (startRule !== undefined) {", pavone@0: " if (parseFunctions[startRule] === undefined) {", pavone@0: " throw new Error(\"Invalid rule name: \" + quote(startRule) + \".\");", pavone@0: " }", pavone@0: " } else {", pavone@0: " startRule = ${startRule|string};", pavone@0: " }", pavone@0: " ", pavone@0: " var pos = 0;", pavone@0: " var reportMatchFailures = true;", pavone@0: " var rightmostMatchFailuresPos = 0;", pavone@0: " var rightmostMatchFailuresExpected = [];", pavone@0: " var cache = {};", pavone@0: " ", pavone@0: /* This needs to be in sync with |padLeft| in utils.js. */ pavone@0: " function padLeft(input, padding, length) {", pavone@0: " var result = input;", pavone@0: " ", pavone@0: " var padLength = length - input.length;", pavone@0: " for (var i = 0; i < padLength; i++) {", pavone@0: " result = padding + result;", pavone@0: " }", pavone@0: " ", pavone@0: " return result;", pavone@0: " }", pavone@0: " ", pavone@0: /* This needs to be in sync with |escape| in utils.js. */ pavone@0: " function escape(ch) {", pavone@0: " var charCode = ch.charCodeAt(0);", pavone@0: " ", pavone@0: " if (charCode <= 0xFF) {", pavone@0: " var escapeChar = 'x';", pavone@0: " var length = 2;", pavone@0: " } else {", pavone@0: " var escapeChar = 'u';", pavone@0: " var length = 4;", pavone@0: " }", pavone@0: " ", pavone@0: " return '\\\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length);", pavone@0: " }", pavone@0: " ", pavone@0: /* This needs to be in sync with |quote| in utils.js. */ pavone@0: " function quote(s) {", pavone@0: " /*", pavone@0: " * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a", pavone@0: " * string literal except for the closing quote character, backslash,", pavone@0: " * carriage return, line separator, paragraph separator, and line feed.", pavone@0: " * Any character may appear in the form of an escape sequence.", pavone@0: " */", pavone@0: " return '\"' + s", pavone@0: " .replace(/\\\\/g, '\\\\\\\\') // backslash", pavone@0: " .replace(/\"/g, '\\\\\"') // closing quote character", pavone@0: " .replace(/\\r/g, '\\\\r') // carriage return", pavone@0: " .replace(/\\n/g, '\\\\n') // line feed", pavone@0: " .replace(/[\\x80-\\uFFFF]/g, escape) // non-ASCII characters", pavone@0: " + '\"';", pavone@0: " }", pavone@0: " ", pavone@0: " function matchFailed(failure) {", pavone@0: " if (pos < rightmostMatchFailuresPos) {", pavone@0: " return;", pavone@0: " }", pavone@0: " ", pavone@0: " if (pos > rightmostMatchFailuresPos) {", pavone@0: " rightmostMatchFailuresPos = pos;", pavone@0: " rightmostMatchFailuresExpected = [];", pavone@0: " }", pavone@0: " ", pavone@0: " rightmostMatchFailuresExpected.push(failure);", pavone@0: " }", pavone@0: " ", pavone@0: " ${parseFunctionDefinitions}", pavone@0: " ", pavone@0: " function buildErrorMessage() {", pavone@0: " function buildExpected(failuresExpected) {", pavone@0: " failuresExpected.sort();", pavone@0: " ", pavone@0: " var lastFailure = null;", pavone@0: " var failuresExpectedUnique = [];", pavone@0: " for (var i = 0; i < failuresExpected.length; i++) {", pavone@0: " if (failuresExpected[i] !== lastFailure) {", pavone@0: " failuresExpectedUnique.push(failuresExpected[i]);", pavone@0: " lastFailure = failuresExpected[i];", pavone@0: " }", pavone@0: " }", pavone@0: " ", pavone@0: " switch (failuresExpectedUnique.length) {", pavone@0: " case 0:", pavone@0: " return 'end of input';", pavone@0: " case 1:", pavone@0: " return failuresExpectedUnique[0];", pavone@0: " default:", pavone@0: " return failuresExpectedUnique.slice(0, failuresExpectedUnique.length - 1).join(', ')", pavone@0: " + ' or '", pavone@0: " + failuresExpectedUnique[failuresExpectedUnique.length - 1];", pavone@0: " }", pavone@0: " }", pavone@0: " ", pavone@0: " var expected = buildExpected(rightmostMatchFailuresExpected);", pavone@0: " var actualPos = Math.max(pos, rightmostMatchFailuresPos);", pavone@0: " var actual = actualPos < input.length", pavone@0: " ? quote(input.charAt(actualPos))", pavone@0: " : 'end of input';", pavone@0: " ", pavone@0: " return 'Expected ' + expected + ' but ' + actual + ' found.';", pavone@0: " }", pavone@0: " ", pavone@0: " function computeErrorPosition() {", pavone@0: " /*", pavone@0: " * The first idea was to use |String.split| to break the input up to the", pavone@0: " * error position along newlines and derive the line and column from", pavone@0: " * there. However IE's |split| implementation is so broken that it was", pavone@0: " * enough to prevent it.", pavone@0: " */", pavone@0: " ", pavone@0: " var line = 1;", pavone@0: " var column = 1;", pavone@0: " var seenCR = false;", pavone@0: " ", pavone@0: " for (var i = 0; i < rightmostMatchFailuresPos; i++) {", pavone@0: " var ch = input.charAt(i);", pavone@0: " if (ch === '\\n') {", pavone@0: " if (!seenCR) { line++; }", pavone@0: " column = 1;", pavone@0: " seenCR = false;", pavone@0: " } else if (ch === '\\r' | ch === '\\u2028' || ch === '\\u2029') {", pavone@0: " line++;", pavone@0: " column = 1;", pavone@0: " seenCR = true;", pavone@0: " } else {", pavone@0: " column++;", pavone@0: " seenCR = false;", pavone@0: " }", pavone@0: " }", pavone@0: " ", pavone@0: " return { line: line, column: column };", pavone@0: " }", pavone@0: " ", pavone@0: " ${initializerCode}", pavone@0: " ", pavone@0: " var result = parseFunctions[startRule]();", pavone@0: " ", pavone@0: " /*", pavone@0: " * The parser is now in one of the following three states:", pavone@0: " *", pavone@0: " * 1. The parser successfully parsed the whole input.", pavone@0: " *", pavone@0: " * - |result !== null|", pavone@0: " * - |pos === input.length|", pavone@0: " * - |rightmostMatchFailuresExpected| may or may not contain something", pavone@0: " *", pavone@0: " * 2. The parser successfully parsed only a part of the input.", pavone@0: " *", pavone@0: " * - |result !== null|", pavone@0: " * - |pos < input.length|", pavone@0: " * - |rightmostMatchFailuresExpected| may or may not contain something", pavone@0: " *", pavone@0: " * 3. The parser did not successfully parse any part of the input.", pavone@0: " *", pavone@0: " * - |result === null|", pavone@0: " * - |pos === 0|", pavone@0: " * - |rightmostMatchFailuresExpected| contains at least one failure", pavone@0: " *", pavone@0: " * All code following this comment (including called functions) must", pavone@0: " * handle these states.", pavone@0: " */", pavone@0: " if (result === null || pos !== input.length) {", pavone@0: " var errorPosition = computeErrorPosition();", pavone@0: " throw new this.SyntaxError(", pavone@0: " buildErrorMessage(),", pavone@0: " errorPosition.line,", pavone@0: " errorPosition.column", pavone@0: " );", pavone@0: " }", pavone@0: " ", pavone@0: " return result;", pavone@0: " },", pavone@0: " ", pavone@0: " /* Returns the parser source code. */", pavone@0: " toSource: function() { return this._source; }", pavone@0: " };", pavone@0: " ", pavone@0: " /* Thrown when a parser encounters a syntax error. */", pavone@0: " ", pavone@0: " result.SyntaxError = function(message, line, column) {", pavone@0: " this.name = 'SyntaxError';", pavone@0: " this.message = message;", pavone@0: " this.line = line;", pavone@0: " this.column = column;", pavone@0: " };", pavone@0: " ", pavone@0: " result.SyntaxError.prototype = Error.prototype;", pavone@0: " ", pavone@0: " return result;", pavone@0: "})()", pavone@0: { pavone@0: initializerCode: initializerCode, pavone@0: parseFunctionTableItems: parseFunctionTableItems.join(",\n"), pavone@0: parseFunctionDefinitions: parseFunctionDefinitions.join("\n\n"), pavone@0: startRule: node.startRule pavone@0: } pavone@0: ); pavone@0: }, pavone@0: pavone@0: initializer: function(node) { pavone@0: return node.code; pavone@0: }, pavone@0: pavone@0: rule: function(node) { pavone@0: /* pavone@0: * We want to reset variable names at the beginning of every function so pavone@0: * that a little change in the source grammar does not change variables in pavone@0: * all the generated code. This is desired especially when one has the pavone@0: * generated grammar stored in a VCS (this is true e.g. for our pavone@0: * metagrammar). pavone@0: */ pavone@0: UID.reset(); pavone@0: pavone@0: var resultVar = UID.next("result"); pavone@0: pavone@0: if (node.displayName !== null) { pavone@0: var setReportMatchFailuresCode = formatCode( pavone@0: "var savedReportMatchFailures = reportMatchFailures;", pavone@0: "reportMatchFailures = false;" pavone@0: ); pavone@0: var restoreReportMatchFailuresCode = formatCode( pavone@0: "reportMatchFailures = savedReportMatchFailures;" pavone@0: ); pavone@0: var reportMatchFailureCode = formatCode( pavone@0: "if (reportMatchFailures && ${resultVar} === null) {", pavone@0: " matchFailed(${displayName|string});", pavone@0: "}", pavone@0: { pavone@0: displayName: node.displayName, pavone@0: resultVar: resultVar pavone@0: } pavone@0: ); pavone@0: } else { pavone@0: var setReportMatchFailuresCode = ""; pavone@0: var restoreReportMatchFailuresCode = ""; pavone@0: var reportMatchFailureCode = ""; pavone@0: } pavone@0: pavone@0: return formatCode( pavone@0: "function parse_${name}() {", pavone@0: " var cacheKey = '${name}@' + pos;", pavone@0: " var cachedResult = cache[cacheKey];", pavone@0: " if (cachedResult) {", pavone@0: " pos = cachedResult.nextPos;", pavone@0: " return cachedResult.result;", pavone@0: " }", pavone@0: " ", pavone@0: " ${setReportMatchFailuresCode}", pavone@0: " ${code}", pavone@0: " ${restoreReportMatchFailuresCode}", pavone@0: " ${reportMatchFailureCode}", pavone@0: " ", pavone@0: " cache[cacheKey] = {", pavone@0: " nextPos: pos,", pavone@0: " result: ${resultVar}", pavone@0: " };", pavone@0: " return ${resultVar};", pavone@0: "}", pavone@0: { pavone@0: name: node.name, pavone@0: setReportMatchFailuresCode: setReportMatchFailuresCode, pavone@0: restoreReportMatchFailuresCode: restoreReportMatchFailuresCode, pavone@0: reportMatchFailureCode: reportMatchFailureCode, pavone@0: code: emit(node.expression, resultVar), pavone@0: resultVar: resultVar pavone@0: } pavone@0: ); pavone@0: }, pavone@0: pavone@0: /* pavone@0: * The contract for all code fragments generated by the following functions pavone@0: * is as follows: pavone@0: * pavone@0: * * The code fragment should try to match a part of the input starting with pavone@0: * the position indicated in |pos|. That position may point past the end of pavone@0: * the input. pavone@0: * pavone@0: * * If the code fragment matches the input, it advances |pos| after the pavone@0: * matched part of the input and sets variable with a name stored in pavone@0: * |resultVar| to appropriate value, which is always non-null. pavone@0: * pavone@0: * * If the code fragment does not match the input, it does not change |pos| pavone@0: * and it sets a variable with a name stored in |resultVar| to |null|. pavone@0: */ pavone@0: pavone@0: choice: function(node, resultVar) { pavone@0: var code = formatCode( pavone@0: "var ${resultVar} = null;", pavone@0: { resultVar: resultVar } pavone@0: ); pavone@0: pavone@0: for (var i = node.alternatives.length - 1; i >= 0; i--) { pavone@0: var alternativeResultVar = UID.next("result"); pavone@0: code = formatCode( pavone@0: "${alternativeCode}", pavone@0: "if (${alternativeResultVar} !== null) {", pavone@0: " var ${resultVar} = ${alternativeResultVar};", pavone@0: "} else {", pavone@0: " ${code};", pavone@0: "}", pavone@0: { pavone@0: alternativeCode: emit(node.alternatives[i], alternativeResultVar), pavone@0: alternativeResultVar: alternativeResultVar, pavone@0: code: code, pavone@0: resultVar: resultVar pavone@0: } pavone@0: ); pavone@0: } pavone@0: pavone@0: return code; pavone@0: }, pavone@0: pavone@0: sequence: function(node, resultVar) { pavone@0: var savedPosVar = UID.next("savedPos"); pavone@0: pavone@0: var elementResultVars = map(node.elements, function() { pavone@0: return UID.next("result") pavone@0: }); pavone@0: pavone@0: var code = formatCode( pavone@0: "var ${resultVar} = ${elementResultVarArray};", pavone@0: { pavone@0: resultVar: resultVar, pavone@0: elementResultVarArray: "[" + elementResultVars.join(", ") + "]" pavone@0: } pavone@0: ); pavone@0: pavone@0: for (var i = node.elements.length - 1; i >= 0; i--) { pavone@0: code = formatCode( pavone@0: "${elementCode}", pavone@0: "if (${elementResultVar} !== null) {", pavone@0: " ${code}", pavone@0: "} else {", pavone@0: " var ${resultVar} = null;", pavone@0: " pos = ${savedPosVar};", pavone@0: "}", pavone@0: { pavone@0: elementCode: emit(node.elements[i], elementResultVars[i]), pavone@0: elementResultVar: elementResultVars[i], pavone@0: code: code, pavone@0: savedPosVar: savedPosVar, pavone@0: resultVar: resultVar pavone@0: } pavone@0: ); pavone@0: } pavone@0: pavone@0: return formatCode( pavone@0: "var ${savedPosVar} = pos;", pavone@0: "${code}", pavone@0: { pavone@0: code: code, pavone@0: savedPosVar: savedPosVar pavone@0: } pavone@0: ); pavone@0: }, pavone@0: pavone@0: labeled: function(node, resultVar) { pavone@0: return emit(node.expression, resultVar); pavone@0: }, pavone@0: pavone@0: simple_and: function(node, resultVar) { pavone@0: var savedPosVar = UID.next("savedPos"); pavone@0: var savedReportMatchFailuresVar = UID.next("savedReportMatchFailuresVar"); pavone@0: var expressionResultVar = UID.next("result"); pavone@0: pavone@0: return formatCode( pavone@0: "var ${savedPosVar} = pos;", pavone@0: "var ${savedReportMatchFailuresVar} = reportMatchFailures;", pavone@0: "reportMatchFailures = false;", pavone@0: "${expressionCode}", pavone@0: "reportMatchFailures = ${savedReportMatchFailuresVar};", pavone@0: "if (${expressionResultVar} !== null) {", pavone@0: " var ${resultVar} = '';", pavone@0: " pos = ${savedPosVar};", pavone@0: "} else {", pavone@0: " var ${resultVar} = null;", pavone@0: "}", pavone@0: { pavone@0: expressionCode: emit(node.expression, expressionResultVar), pavone@0: expressionResultVar: expressionResultVar, pavone@0: savedPosVar: savedPosVar, pavone@0: savedReportMatchFailuresVar: savedReportMatchFailuresVar, pavone@0: resultVar: resultVar pavone@0: } pavone@0: ); pavone@0: }, pavone@0: pavone@0: simple_not: function(node, resultVar) { pavone@0: var savedPosVar = UID.next("savedPos"); pavone@0: var savedReportMatchFailuresVar = UID.next("savedReportMatchFailuresVar"); pavone@0: var expressionResultVar = UID.next("result"); pavone@0: pavone@0: return formatCode( pavone@0: "var ${savedPosVar} = pos;", pavone@0: "var ${savedReportMatchFailuresVar} = reportMatchFailures;", pavone@0: "reportMatchFailures = false;", pavone@0: "${expressionCode}", pavone@0: "reportMatchFailures = ${savedReportMatchFailuresVar};", pavone@0: "if (${expressionResultVar} === null) {", pavone@0: " var ${resultVar} = '';", pavone@0: "} else {", pavone@0: " var ${resultVar} = null;", pavone@0: " pos = ${savedPosVar};", pavone@0: "}", pavone@0: { pavone@0: expressionCode: emit(node.expression, expressionResultVar), pavone@0: expressionResultVar: expressionResultVar, pavone@0: savedPosVar: savedPosVar, pavone@0: savedReportMatchFailuresVar: savedReportMatchFailuresVar, pavone@0: resultVar: resultVar pavone@0: } pavone@0: ); pavone@0: }, pavone@0: pavone@0: semantic_and: function(node, resultVar) { pavone@0: return formatCode( pavone@0: "var ${resultVar} = (function() {${actionCode}})() ? '' : null;", pavone@0: { pavone@0: actionCode: node.code, pavone@0: resultVar: resultVar pavone@0: } pavone@0: ); pavone@0: }, pavone@0: pavone@0: semantic_not: function(node, resultVar) { pavone@0: return formatCode( pavone@0: "var ${resultVar} = (function() {${actionCode}})() ? null : '';", pavone@0: { pavone@0: actionCode: node.code, pavone@0: resultVar: resultVar pavone@0: } pavone@0: ); pavone@0: }, pavone@0: pavone@0: optional: function(node, resultVar) { pavone@0: var expressionResultVar = UID.next("result"); pavone@0: pavone@0: return formatCode( pavone@0: "${expressionCode}", pavone@0: "var ${resultVar} = ${expressionResultVar} !== null ? ${expressionResultVar} : '';", pavone@0: { pavone@0: expressionCode: emit(node.expression, expressionResultVar), pavone@0: expressionResultVar: expressionResultVar, pavone@0: resultVar: resultVar pavone@0: } pavone@0: ); pavone@0: }, pavone@0: pavone@0: zero_or_more: function(node, resultVar) { pavone@0: var expressionResultVar = UID.next("result"); pavone@0: pavone@0: return formatCode( pavone@0: "var ${resultVar} = [];", pavone@0: "${expressionCode}", pavone@0: "while (${expressionResultVar} !== null) {", pavone@0: " ${resultVar}.push(${expressionResultVar});", pavone@0: " ${expressionCode}", pavone@0: "}", pavone@0: { pavone@0: expressionCode: emit(node.expression, expressionResultVar), pavone@0: expressionResultVar: expressionResultVar, pavone@0: resultVar: resultVar pavone@0: } pavone@0: ); pavone@0: }, pavone@0: pavone@0: one_or_more: function(node, resultVar) { pavone@0: var expressionResultVar = UID.next("result"); pavone@0: pavone@0: return formatCode( pavone@0: "${expressionCode}", pavone@0: "if (${expressionResultVar} !== null) {", pavone@0: " var ${resultVar} = [];", pavone@0: " while (${expressionResultVar} !== null) {", pavone@0: " ${resultVar}.push(${expressionResultVar});", pavone@0: " ${expressionCode}", pavone@0: " }", pavone@0: "} else {", pavone@0: " var ${resultVar} = null;", pavone@0: "}", pavone@0: { pavone@0: expressionCode: emit(node.expression, expressionResultVar), pavone@0: expressionResultVar: expressionResultVar, pavone@0: resultVar: resultVar pavone@0: } pavone@0: ); pavone@0: }, pavone@0: pavone@0: action: function(node, resultVar) { pavone@0: /* pavone@0: * In case of sequences, we splat their elements into function arguments pavone@0: * one by one. Example: pavone@0: * pavone@0: * start: a:"a" b:"b" c:"c" { alert(arguments.length) } // => 3 pavone@0: * pavone@0: * This behavior is reflected in this function. pavone@0: */ pavone@0: pavone@0: var expressionResultVar = UID.next("result"); pavone@0: var actionResultVar = UID.next("result"); pavone@0: var savedPosVar = UID.next("savedPos"); pavone@0: pavone@0: if (node.expression.type === "sequence") { pavone@0: var formalParams = []; pavone@0: var actualParams = []; pavone@0: pavone@0: var elements = node.expression.elements; pavone@0: var elementsLength = elements.length; pavone@0: for (var i = 0; i < elementsLength; i++) { pavone@0: if (elements[i].type === "labeled") { pavone@0: formalParams.push(elements[i].label); pavone@0: actualParams.push(expressionResultVar + "[" + i + "]"); pavone@0: } pavone@0: } pavone@0: } else if (node.expression.type === "labeled") { pavone@0: var formalParams = [node.expression.label]; pavone@0: var actualParams = [expressionResultVar]; pavone@0: } else { pavone@0: var formalParams = []; pavone@0: var actualParams = []; pavone@0: } pavone@0: pavone@0: return formatCode( pavone@0: "var ${savedPosVar} = pos;", pavone@0: "${expressionCode}", pavone@0: "var ${actionResultVar} = ${expressionResultVar} !== null", pavone@0: " ? (function(${formalParams}) {${actionCode}})(${actualParams})", pavone@0: " : null;", pavone@0: "if (${actionResultVar} !== null) {", pavone@0: " var ${resultVar} = ${actionResultVar};", pavone@0: "} else {", pavone@0: " var ${resultVar} = null;", pavone@0: " pos = ${savedPosVar};", pavone@0: "}", pavone@0: { pavone@0: expressionCode: emit(node.expression, expressionResultVar), pavone@0: expressionResultVar: expressionResultVar, pavone@0: actionCode: node.code, pavone@0: actionResultVar: actionResultVar, pavone@0: formalParams: formalParams.join(", "), pavone@0: actualParams: actualParams.join(", "), pavone@0: savedPosVar: savedPosVar, pavone@0: resultVar: resultVar pavone@0: } pavone@0: ); pavone@0: }, pavone@0: pavone@0: rule_ref: function(node, resultVar) { pavone@0: return formatCode( pavone@0: "var ${resultVar} = ${ruleMethod}();", pavone@0: { pavone@0: ruleMethod: "parse_" + node.name, pavone@0: resultVar: resultVar pavone@0: } pavone@0: ); pavone@0: }, pavone@0: pavone@0: literal: function(node, resultVar) { pavone@0: return formatCode( pavone@0: "if (input.substr(pos, ${length}) === ${value|string}) {", pavone@0: " var ${resultVar} = ${value|string};", pavone@0: " pos += ${length};", pavone@0: "} else {", pavone@0: " var ${resultVar} = null;", pavone@0: " if (reportMatchFailures) {", pavone@0: " matchFailed(${valueQuoted|string});", pavone@0: " }", pavone@0: "}", pavone@0: { pavone@0: value: node.value, pavone@0: valueQuoted: quote(node.value), pavone@0: length: node.value.length, pavone@0: resultVar: resultVar pavone@0: } pavone@0: ); pavone@0: }, pavone@0: pavone@0: any: function(node, resultVar) { pavone@0: return formatCode( pavone@0: "if (input.length > pos) {", pavone@0: " var ${resultVar} = input.charAt(pos);", pavone@0: " pos++;", pavone@0: "} else {", pavone@0: " var ${resultVar} = null;", pavone@0: " if (reportMatchFailures) {", pavone@0: " matchFailed('any character');", pavone@0: " }", pavone@0: "}", pavone@0: { resultVar: resultVar } pavone@0: ); pavone@0: }, pavone@0: pavone@0: "class": function(node, resultVar) { pavone@0: if (node.parts.length > 0) { pavone@0: var regexp = "/^[" pavone@0: + (node.inverted ? "^" : "") pavone@0: + map(node.parts, function(part) { pavone@0: return part instanceof Array pavone@0: ? quoteForRegexpClass(part[0]) pavone@0: + "-" pavone@0: + quoteForRegexpClass(part[1]) pavone@0: : quoteForRegexpClass(part); pavone@0: }).join("") pavone@0: + "]/"; pavone@0: } else { pavone@0: /* pavone@0: * Stupid IE considers regexps /[]/ and /[^]/ syntactically invalid, so pavone@0: * we translate them into euqivalents it can handle. pavone@0: */ pavone@0: var regexp = node.inverted ? "/^[\\S\\s]/" : "/^(?!)/"; pavone@0: } pavone@0: pavone@0: return formatCode( pavone@0: "if (input.substr(pos).match(${regexp}) !== null) {", pavone@0: " var ${resultVar} = input.charAt(pos);", pavone@0: " pos++;", pavone@0: "} else {", pavone@0: " var ${resultVar} = null;", pavone@0: " if (reportMatchFailures) {", pavone@0: " matchFailed(${rawText|string});", pavone@0: " }", pavone@0: "}", pavone@0: { pavone@0: regexp: regexp, pavone@0: rawText: node.rawText, pavone@0: resultVar: resultVar pavone@0: } pavone@0: ); pavone@0: } pavone@0: }); pavone@0: pavone@0: return emit(ast); pavone@0: }; pavone@0: pavone@0: if (typeof module === "object") { pavone@0: module.exports = PEG; pavone@0: } else if (typeof window === "object") { pavone@0: window.PEG = PEG; pavone@0: } else { pavone@0: throw new Error("Can't export PEG library (no \"module\" nor \"window\" object detected)."); pavone@0: } pavone@0: pavone@0: })();