You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by st...@apache.org on 2016/03/04 00:54:57 UTC

[17/59] [abbrv] [partial] mac commit: CB-10668 added node_modules directory

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42cbe9fd/node_modules/pegjs/lib/peg.js
----------------------------------------------------------------------
diff --git a/node_modules/pegjs/lib/peg.js b/node_modules/pegjs/lib/peg.js
new file mode 100644
index 0000000..94c9423
--- /dev/null
+++ b/node_modules/pegjs/lib/peg.js
@@ -0,0 +1,5141 @@
+/* PEG.js 0.6.2 (http://pegjs.majda.cz/) */
+
+(function() {
+
+var undefined;
+
+var PEG = {
+  /* PEG.js version. */
+  VERSION: "0.6.2",
+
+  /*
+   * Generates a parser from a specified grammar and returns it.
+   *
+   * The grammar must be a string in the format described by the metagramar in
+   * the parser.pegjs file.
+   *
+   * Throws |PEG.parser.SyntaxError| if the grammar contains a syntax error or
+   * |PEG.GrammarError| if it contains a semantic error. Note that not all
+   * errors are detected during the generation and some may protrude to the
+   * generated parser and cause its malfunction.
+   */
+  buildParser: function(grammar) {
+    return PEG.compiler.compile(PEG.parser.parse(grammar));
+  }
+};
+
+/* Thrown when the grammar contains an error. */
+
+PEG.GrammarError = function(message) {
+  this.name = "PEG.GrammarError";
+  this.message = message;
+};
+
+PEG.GrammarError.prototype = Error.prototype;
+
+function contains(array, value) {
+  /*
+   * Stupid IE does not have Array.prototype.indexOf, otherwise this function
+   * would be a one-liner.
+   */
+  var length = array.length;
+  for (var i = 0; i < length; i++) {
+    if (array[i] === value) {
+      return true;
+    }
+  }
+  return false;
+}
+
+function each(array, callback) {
+  var length = array.length;
+  for (var i = 0; i < length; i++) {
+    callback(array[i]);
+  }
+}
+
+function map(array, callback) {
+  var result = [];
+  var length = array.length;
+  for (var i = 0; i < length; i++) {
+    result[i] = callback(array[i]);
+  }
+  return result;
+}
+
+/*
+ * Returns a string padded on the left to a desired length with a character.
+ *
+ * The code needs to be in sync with th code template in the compilation
+ * function for "action" nodes.
+ */
+function padLeft(input, padding, length) {
+  var result = input;
+
+  var padLength = length - input.length;
+  for (var i = 0; i < padLength; i++) {
+    result = padding + result;
+  }
+
+  return result;
+}
+
+/*
+ * Returns an escape sequence for given character. Uses \x for characters <=
+ * 0xFF to save space, \u for the rest.
+ *
+ * The code needs to be in sync with th code template in the compilation
+ * function for "action" nodes.
+ */
+function escape(ch) {
+  var charCode = ch.charCodeAt(0);
+
+  if (charCode <= 0xFF) {
+    var escapeChar = 'x';
+    var length = 2;
+  } else {
+    var escapeChar = 'u';
+    var length = 4;
+  }
+
+  return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length);
+}
+
+/*
+ * Surrounds the string with quotes and escapes characters inside so that the
+ * result is a valid JavaScript string.
+ *
+ * The code needs to be in sync with th code template in the compilation
+ * function for "action" nodes.
+ */
+function quote(s) {
+  /*
+   * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string
+   * literal except for the closing quote character, backslash, carriage return,
+   * line separator, paragraph separator, and line feed. Any character may
+   * appear in the form of an escape sequence.
+   *
+   * For portability, we also escape escape all non-ASCII characters.
+   */
+  return '"' + s
+    .replace(/\\/g, '\\\\')            // backslash
+    .replace(/"/g, '\\"')              // closing quote character
+    .replace(/\r/g, '\\r')             // carriage return
+    .replace(/\n/g, '\\n')             // line feed
+    .replace(/[\x80-\uFFFF]/g, escape) // non-ASCII characters
+    + '"';
+};
+
+/*
+ * Escapes characters inside the string so that it can be used as a list of
+ * characters in a character class of a regular expression.
+ */
+function quoteForRegexpClass(s) {
+  /*
+   * Based on ECMA-262, 5th ed., 7.8.5 & 15.10.1.
+   *
+   * For portability, we also escape escape all non-ASCII characters.
+   */
+  return s
+    .replace(/\\/g, '\\\\')            // backslash
+    .replace(/\0/g, '\\0')             // null, IE needs this
+    .replace(/\//g, '\\/')             // closing slash
+    .replace(/]/g, '\\]')              // closing bracket
+    .replace(/-/g, '\\-')              // dash
+    .replace(/\r/g, '\\r')             // carriage return
+    .replace(/\n/g, '\\n')             // line feed
+    .replace(/[\x80-\uFFFF]/g, escape) // non-ASCII characters
+}
+
+/*
+ * Builds a node visitor -- a function which takes a node and any number of
+ * other parameters, calls an appropriate function according to the node type,
+ * passes it all its parameters and returns its value. The functions for various
+ * node types are passed in a parameter to |buildNodeVisitor| as a hash.
+ */
+function buildNodeVisitor(functions) {
+  return function(node) {
+    return functions[node.type].apply(null, arguments);
+  }
+}
+PEG.parser = (function(){
+  /* Generated by PEG.js 0.6.2 (http://pegjs.majda.cz/). */
+  
+  var result = {
+    /*
+     * Parses the input with a generated parser. If the parsing is successfull,
+     * returns a value explicitly or implicitly specified by the grammar from
+     * which the parser was generated (see |PEG.buildParser|). If the parsing is
+     * unsuccessful, throws |PEG.parser.SyntaxError| describing the error.
+     */
+    parse: function(input, startRule) {
+      var parseFunctions = {
+        "__": parse___,
+        "action": parse_action,
+        "and": parse_and,
+        "braced": parse_braced,
+        "bracketDelimitedCharacter": parse_bracketDelimitedCharacter,
+        "choice": parse_choice,
+        "class": parse_class,
+        "classCharacter": parse_classCharacter,
+        "classCharacterRange": parse_classCharacterRange,
+        "colon": parse_colon,
+        "comment": parse_comment,
+        "digit": parse_digit,
+        "dot": parse_dot,
+        "doubleQuotedCharacter": parse_doubleQuotedCharacter,
+        "doubleQuotedLiteral": parse_doubleQuotedLiteral,
+        "eol": parse_eol,
+        "eolChar": parse_eolChar,
+        "eolEscapeSequence": parse_eolEscapeSequence,
+        "equals": parse_equals,
+        "grammar": parse_grammar,
+        "hexDigit": parse_hexDigit,
+        "hexEscapeSequence": parse_hexEscapeSequence,
+        "identifier": parse_identifier,
+        "initializer": parse_initializer,
+        "labeled": parse_labeled,
+        "letter": parse_letter,
+        "literal": parse_literal,
+        "lowerCaseLetter": parse_lowerCaseLetter,
+        "lparen": parse_lparen,
+        "multiLineComment": parse_multiLineComment,
+        "nonBraceCharacter": parse_nonBraceCharacter,
+        "nonBraceCharacters": parse_nonBraceCharacters,
+        "not": parse_not,
+        "plus": parse_plus,
+        "prefixed": parse_prefixed,
+        "primary": parse_primary,
+        "question": parse_question,
+        "rparen": parse_rparen,
+        "rule": parse_rule,
+        "semicolon": parse_semicolon,
+        "sequence": parse_sequence,
+        "simpleBracketDelimitedCharacter": parse_simpleBracketDelimitedCharacter,
+        "simpleDoubleQuotedCharacter": parse_simpleDoubleQuotedCharacter,
+        "simpleEscapeSequence": parse_simpleEscapeSequence,
+        "simpleSingleQuotedCharacter": parse_simpleSingleQuotedCharacter,
+        "singleLineComment": parse_singleLineComment,
+        "singleQuotedCharacter": parse_singleQuotedCharacter,
+        "singleQuotedLiteral": parse_singleQuotedLiteral,
+        "slash": parse_slash,
+        "star": parse_star,
+        "suffixed": parse_suffixed,
+        "unicodeEscapeSequence": parse_unicodeEscapeSequence,
+        "upperCaseLetter": parse_upperCaseLetter,
+        "whitespace": parse_whitespace,
+        "zeroEscapeSequence": parse_zeroEscapeSequence
+      };
+      
+      if (startRule !== undefined) {
+        if (parseFunctions[startRule] === undefined) {
+          throw new Error("Invalid rule name: " + quote(startRule) + ".");
+        }
+      } else {
+        startRule = "grammar";
+      }
+      
+      var pos = 0;
+      var reportMatchFailures = true;
+      var rightmostMatchFailuresPos = 0;
+      var rightmostMatchFailuresExpected = [];
+      var cache = {};
+      
+      function padLeft(input, padding, length) {
+        var result = input;
+        
+        var padLength = length - input.length;
+        for (var i = 0; i < padLength; i++) {
+          result = padding + result;
+        }
+        
+        return result;
+      }
+      
+      function escape(ch) {
+        var charCode = ch.charCodeAt(0);
+        
+        if (charCode <= 0xFF) {
+          var escapeChar = 'x';
+          var length = 2;
+        } else {
+          var escapeChar = 'u';
+          var length = 4;
+        }
+        
+        return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length);
+      }
+      
+      function quote(s) {
+        /*
+         * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a
+         * string literal except for the closing quote character, backslash,
+         * carriage return, line separator, paragraph separator, and line feed.
+         * Any character may appear in the form of an escape sequence.
+         */
+        return '"' + s
+          .replace(/\\/g, '\\\\')            // backslash
+          .replace(/"/g, '\\"')              // closing quote character
+          .replace(/\r/g, '\\r')             // carriage return
+          .replace(/\n/g, '\\n')             // line feed
+          .replace(/[\x80-\uFFFF]/g, escape) // non-ASCII characters
+          + '"';
+      }
+      
+      function matchFailed(failure) {
+        if (pos < rightmostMatchFailuresPos) {
+          return;
+        }
+        
+        if (pos > rightmostMatchFailuresPos) {
+          rightmostMatchFailuresPos = pos;
+          rightmostMatchFailuresExpected = [];
+        }
+        
+        rightmostMatchFailuresExpected.push(failure);
+      }
+      
+      function parse_grammar() {
+        var cacheKey = 'grammar@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        var result3 = parse___();
+        if (result3 !== null) {
+          var result7 = parse_initializer();
+          var result4 = result7 !== null ? result7 : '';
+          if (result4 !== null) {
+            var result6 = parse_rule();
+            if (result6 !== null) {
+              var result5 = [];
+              while (result6 !== null) {
+                result5.push(result6);
+                var result6 = parse_rule();
+              }
+            } else {
+              var result5 = null;
+            }
+            if (result5 !== null) {
+              var result1 = [result3, result4, result5];
+            } else {
+              var result1 = null;
+              pos = savedPos1;
+            }
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function(initializer, rules) {
+                var rulesConverted = {};
+                each(rules, function(rule) { rulesConverted[rule.name] = rule; });
+          
+                return {
+                  type:        "grammar",
+                  initializer: initializer !== "" ? initializer : null,
+                  rules:       rulesConverted,
+                  startRule:   rules[0].name
+                }
+              })(result1[1], result1[2])
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_initializer() {
+        var cacheKey = 'initializer@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        var result3 = parse_action();
+        if (result3 !== null) {
+          var result5 = parse_semicolon();
+          var result4 = result5 !== null ? result5 : '';
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function(code) {
+                return {
+                  type: "initializer",
+                  code: code
+                };
+              })(result1[0])
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_rule() {
+        var cacheKey = 'rule@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        var result3 = parse_identifier();
+        if (result3 !== null) {
+          var result10 = parse_literal();
+          if (result10 !== null) {
+            var result4 = result10;
+          } else {
+            if (input.substr(pos, 0) === "") {
+              var result9 = "";
+              pos += 0;
+            } else {
+              var result9 = null;
+              if (reportMatchFailures) {
+                matchFailed("\"\"");
+              }
+            }
+            if (result9 !== null) {
+              var result4 = result9;
+            } else {
+              var result4 = null;;
+            };
+          }
+          if (result4 !== null) {
+            var result5 = parse_equals();
+            if (result5 !== null) {
+              var result6 = parse_choice();
+              if (result6 !== null) {
+                var result8 = parse_semicolon();
+                var result7 = result8 !== null ? result8 : '';
+                if (result7 !== null) {
+                  var result1 = [result3, result4, result5, result6, result7];
+                } else {
+                  var result1 = null;
+                  pos = savedPos1;
+                }
+              } else {
+                var result1 = null;
+                pos = savedPos1;
+              }
+            } else {
+              var result1 = null;
+              pos = savedPos1;
+            }
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function(name, displayName, expression) {
+                return {
+                  type:        "rule",
+                  name:        name,
+                  displayName: displayName !== "" ? displayName : null,
+                  expression:  expression
+                };
+              })(result1[0], result1[1], result1[3])
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_choice() {
+        var cacheKey = 'choice@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        var result3 = parse_sequence();
+        if (result3 !== null) {
+          var result4 = [];
+          var savedPos2 = pos;
+          var result6 = parse_slash();
+          if (result6 !== null) {
+            var result7 = parse_sequence();
+            if (result7 !== null) {
+              var result5 = [result6, result7];
+            } else {
+              var result5 = null;
+              pos = savedPos2;
+            }
+          } else {
+            var result5 = null;
+            pos = savedPos2;
+          }
+          while (result5 !== null) {
+            result4.push(result5);
+            var savedPos2 = pos;
+            var result6 = parse_slash();
+            if (result6 !== null) {
+              var result7 = parse_sequence();
+              if (result7 !== null) {
+                var result5 = [result6, result7];
+              } else {
+                var result5 = null;
+                pos = savedPos2;
+              }
+            } else {
+              var result5 = null;
+              pos = savedPos2;
+            }
+          }
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function(head, tail) {
+                if (tail.length > 0) {
+                  var alternatives = [head].concat(map(
+                      tail,
+                      function(element) { return element[1]; }
+                  ));
+                  return {
+                    type:         "choice",
+                    alternatives: alternatives
+                  }
+                } else {
+                  return head;
+                }
+              })(result1[0], result1[1])
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_sequence() {
+        var cacheKey = 'sequence@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos1 = pos;
+        var savedPos2 = pos;
+        var result8 = [];
+        var result10 = parse_labeled();
+        while (result10 !== null) {
+          result8.push(result10);
+          var result10 = parse_labeled();
+        }
+        if (result8 !== null) {
+          var result9 = parse_action();
+          if (result9 !== null) {
+            var result6 = [result8, result9];
+          } else {
+            var result6 = null;
+            pos = savedPos2;
+          }
+        } else {
+          var result6 = null;
+          pos = savedPos2;
+        }
+        var result7 = result6 !== null
+          ? (function(elements, code) {
+                var expression = elements.length != 1
+                  ? {
+                      type:     "sequence",
+                      elements: elements
+                    }
+                  : elements[0];
+                return {
+                  type:       "action",
+                  expression: expression,
+                  code:       code
+                };
+              })(result6[0], result6[1])
+          : null;
+        if (result7 !== null) {
+          var result5 = result7;
+        } else {
+          var result5 = null;
+          pos = savedPos1;
+        }
+        if (result5 !== null) {
+          var result0 = result5;
+        } else {
+          var savedPos0 = pos;
+          var result2 = [];
+          var result4 = parse_labeled();
+          while (result4 !== null) {
+            result2.push(result4);
+            var result4 = parse_labeled();
+          }
+          var result3 = result2 !== null
+            ? (function(elements) {
+                  return elements.length != 1
+                    ? {
+                        type:     "sequence",
+                        elements: elements
+                      }
+                    : elements[0];
+                })(result2)
+            : null;
+          if (result3 !== null) {
+            var result1 = result3;
+          } else {
+            var result1 = null;
+            pos = savedPos0;
+          }
+          if (result1 !== null) {
+            var result0 = result1;
+          } else {
+            var result0 = null;;
+          };
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_labeled() {
+        var cacheKey = 'labeled@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        var result5 = parse_identifier();
+        if (result5 !== null) {
+          var result6 = parse_colon();
+          if (result6 !== null) {
+            var result7 = parse_prefixed();
+            if (result7 !== null) {
+              var result3 = [result5, result6, result7];
+            } else {
+              var result3 = null;
+              pos = savedPos1;
+            }
+          } else {
+            var result3 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result3 = null;
+          pos = savedPos1;
+        }
+        var result4 = result3 !== null
+          ? (function(label, expression) {
+                return {
+                  type:       "labeled",
+                  label:      label,
+                  expression: expression
+                };
+              })(result3[0], result3[2])
+          : null;
+        if (result4 !== null) {
+          var result2 = result4;
+        } else {
+          var result2 = null;
+          pos = savedPos0;
+        }
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result1 = parse_prefixed();
+          if (result1 !== null) {
+            var result0 = result1;
+          } else {
+            var result0 = null;;
+          };
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_prefixed() {
+        var cacheKey = 'prefixed@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos6 = pos;
+        var savedPos7 = pos;
+        var result20 = parse_and();
+        if (result20 !== null) {
+          var result21 = parse_action();
+          if (result21 !== null) {
+            var result18 = [result20, result21];
+          } else {
+            var result18 = null;
+            pos = savedPos7;
+          }
+        } else {
+          var result18 = null;
+          pos = savedPos7;
+        }
+        var result19 = result18 !== null
+          ? (function(code) {
+                return {
+                  type: "semantic_and",
+                  code: code
+                };
+              })(result18[1])
+          : null;
+        if (result19 !== null) {
+          var result17 = result19;
+        } else {
+          var result17 = null;
+          pos = savedPos6;
+        }
+        if (result17 !== null) {
+          var result0 = result17;
+        } else {
+          var savedPos4 = pos;
+          var savedPos5 = pos;
+          var result15 = parse_and();
+          if (result15 !== null) {
+            var result16 = parse_suffixed();
+            if (result16 !== null) {
+              var result13 = [result15, result16];
+            } else {
+              var result13 = null;
+              pos = savedPos5;
+            }
+          } else {
+            var result13 = null;
+            pos = savedPos5;
+          }
+          var result14 = result13 !== null
+            ? (function(expression) {
+                  return {
+                    type:       "simple_and",
+                    expression: expression
+                  };
+                })(result13[1])
+            : null;
+          if (result14 !== null) {
+            var result12 = result14;
+          } else {
+            var result12 = null;
+            pos = savedPos4;
+          }
+          if (result12 !== null) {
+            var result0 = result12;
+          } else {
+            var savedPos2 = pos;
+            var savedPos3 = pos;
+            var result10 = parse_not();
+            if (result10 !== null) {
+              var result11 = parse_action();
+              if (result11 !== null) {
+                var result8 = [result10, result11];
+              } else {
+                var result8 = null;
+                pos = savedPos3;
+              }
+            } else {
+              var result8 = null;
+              pos = savedPos3;
+            }
+            var result9 = result8 !== null
+              ? (function(code) {
+                    return {
+                      type: "semantic_not",
+                      code: code
+                    };
+                  })(result8[1])
+              : null;
+            if (result9 !== null) {
+              var result7 = result9;
+            } else {
+              var result7 = null;
+              pos = savedPos2;
+            }
+            if (result7 !== null) {
+              var result0 = result7;
+            } else {
+              var savedPos0 = pos;
+              var savedPos1 = pos;
+              var result5 = parse_not();
+              if (result5 !== null) {
+                var result6 = parse_suffixed();
+                if (result6 !== null) {
+                  var result3 = [result5, result6];
+                } else {
+                  var result3 = null;
+                  pos = savedPos1;
+                }
+              } else {
+                var result3 = null;
+                pos = savedPos1;
+              }
+              var result4 = result3 !== null
+                ? (function(expression) {
+                      return {
+                        type:       "simple_not",
+                        expression: expression
+                      };
+                    })(result3[1])
+                : null;
+              if (result4 !== null) {
+                var result2 = result4;
+              } else {
+                var result2 = null;
+                pos = savedPos0;
+              }
+              if (result2 !== null) {
+                var result0 = result2;
+              } else {
+                var result1 = parse_suffixed();
+                if (result1 !== null) {
+                  var result0 = result1;
+                } else {
+                  var result0 = null;;
+                };
+              };
+            };
+          };
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_suffixed() {
+        var cacheKey = 'suffixed@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos4 = pos;
+        var savedPos5 = pos;
+        var result15 = parse_primary();
+        if (result15 !== null) {
+          var result16 = parse_question();
+          if (result16 !== null) {
+            var result13 = [result15, result16];
+          } else {
+            var result13 = null;
+            pos = savedPos5;
+          }
+        } else {
+          var result13 = null;
+          pos = savedPos5;
+        }
+        var result14 = result13 !== null
+          ? (function(expression) {
+                return {
+                  type:       "optional",
+                  expression: expression
+                };
+              })(result13[0])
+          : null;
+        if (result14 !== null) {
+          var result12 = result14;
+        } else {
+          var result12 = null;
+          pos = savedPos4;
+        }
+        if (result12 !== null) {
+          var result0 = result12;
+        } else {
+          var savedPos2 = pos;
+          var savedPos3 = pos;
+          var result10 = parse_primary();
+          if (result10 !== null) {
+            var result11 = parse_star();
+            if (result11 !== null) {
+              var result8 = [result10, result11];
+            } else {
+              var result8 = null;
+              pos = savedPos3;
+            }
+          } else {
+            var result8 = null;
+            pos = savedPos3;
+          }
+          var result9 = result8 !== null
+            ? (function(expression) {
+                  return {
+                    type:       "zero_or_more",
+                    expression: expression
+                  };
+                })(result8[0])
+            : null;
+          if (result9 !== null) {
+            var result7 = result9;
+          } else {
+            var result7 = null;
+            pos = savedPos2;
+          }
+          if (result7 !== null) {
+            var result0 = result7;
+          } else {
+            var savedPos0 = pos;
+            var savedPos1 = pos;
+            var result5 = parse_primary();
+            if (result5 !== null) {
+              var result6 = parse_plus();
+              if (result6 !== null) {
+                var result3 = [result5, result6];
+              } else {
+                var result3 = null;
+                pos = savedPos1;
+              }
+            } else {
+              var result3 = null;
+              pos = savedPos1;
+            }
+            var result4 = result3 !== null
+              ? (function(expression) {
+                    return {
+                      type:       "one_or_more",
+                      expression: expression
+                    };
+                  })(result3[0])
+              : null;
+            if (result4 !== null) {
+              var result2 = result4;
+            } else {
+              var result2 = null;
+              pos = savedPos0;
+            }
+            if (result2 !== null) {
+              var result0 = result2;
+            } else {
+              var result1 = parse_primary();
+              if (result1 !== null) {
+                var result0 = result1;
+              } else {
+                var result0 = null;;
+              };
+            };
+          };
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_primary() {
+        var cacheKey = 'primary@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos4 = pos;
+        var savedPos5 = pos;
+        var result17 = parse_identifier();
+        if (result17 !== null) {
+          var savedPos6 = pos;
+          var savedReportMatchFailuresVar0 = reportMatchFailures;
+          reportMatchFailures = false;
+          var savedPos7 = pos;
+          var result23 = parse_literal();
+          if (result23 !== null) {
+            var result20 = result23;
+          } else {
+            if (input.substr(pos, 0) === "") {
+              var result22 = "";
+              pos += 0;
+            } else {
+              var result22 = null;
+              if (reportMatchFailures) {
+                matchFailed("\"\"");
+              }
+            }
+            if (result22 !== null) {
+              var result20 = result22;
+            } else {
+              var result20 = null;;
+            };
+          }
+          if (result20 !== null) {
+            var result21 = parse_equals();
+            if (result21 !== null) {
+              var result19 = [result20, result21];
+            } else {
+              var result19 = null;
+              pos = savedPos7;
+            }
+          } else {
+            var result19 = null;
+            pos = savedPos7;
+          }
+          reportMatchFailures = savedReportMatchFailuresVar0;
+          if (result19 === null) {
+            var result18 = '';
+          } else {
+            var result18 = null;
+            pos = savedPos6;
+          }
+          if (result18 !== null) {
+            var result15 = [result17, result18];
+          } else {
+            var result15 = null;
+            pos = savedPos5;
+          }
+        } else {
+          var result15 = null;
+          pos = savedPos5;
+        }
+        var result16 = result15 !== null
+          ? (function(name) {
+                return {
+                  type: "rule_ref",
+                  name: name
+                };
+              })(result15[0])
+          : null;
+        if (result16 !== null) {
+          var result14 = result16;
+        } else {
+          var result14 = null;
+          pos = savedPos4;
+        }
+        if (result14 !== null) {
+          var result0 = result14;
+        } else {
+          var savedPos3 = pos;
+          var result12 = parse_literal();
+          var result13 = result12 !== null
+            ? (function(value) {
+                  return {
+                    type:  "literal",
+                    value: value
+                  };
+                })(result12)
+            : null;
+          if (result13 !== null) {
+            var result11 = result13;
+          } else {
+            var result11 = null;
+            pos = savedPos3;
+          }
+          if (result11 !== null) {
+            var result0 = result11;
+          } else {
+            var savedPos2 = pos;
+            var result9 = parse_dot();
+            var result10 = result9 !== null
+              ? (function() { return { type: "any" }; })()
+              : null;
+            if (result10 !== null) {
+              var result8 = result10;
+            } else {
+              var result8 = null;
+              pos = savedPos2;
+            }
+            if (result8 !== null) {
+              var result0 = result8;
+            } else {
+              var result7 = parse_class();
+              if (result7 !== null) {
+                var result0 = result7;
+              } else {
+                var savedPos0 = pos;
+                var savedPos1 = pos;
+                var result4 = parse_lparen();
+                if (result4 !== null) {
+                  var result5 = parse_choice();
+                  if (result5 !== null) {
+                    var result6 = parse_rparen();
+                    if (result6 !== null) {
+                      var result2 = [result4, result5, result6];
+                    } else {
+                      var result2 = null;
+                      pos = savedPos1;
+                    }
+                  } else {
+                    var result2 = null;
+                    pos = savedPos1;
+                  }
+                } else {
+                  var result2 = null;
+                  pos = savedPos1;
+                }
+                var result3 = result2 !== null
+                  ? (function(expression) { return expression; })(result2[1])
+                  : null;
+                if (result3 !== null) {
+                  var result1 = result3;
+                } else {
+                  var result1 = null;
+                  pos = savedPos0;
+                }
+                if (result1 !== null) {
+                  var result0 = result1;
+                } else {
+                  var result0 = null;;
+                };
+              };
+            };
+          };
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_action() {
+        var cacheKey = 'action@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        var savedReportMatchFailures = reportMatchFailures;
+        reportMatchFailures = false;
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        var result3 = parse_braced();
+        if (result3 !== null) {
+          var result4 = parse___();
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function(braced) { return braced.substr(1, braced.length - 2); })(result1[0])
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        reportMatchFailures = savedReportMatchFailures;
+        if (reportMatchFailures && result0 === null) {
+          matchFailed("action");
+        }
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_braced() {
+        var cacheKey = 'braced@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        if (input.substr(pos, 1) === "{") {
+          var result3 = "{";
+          pos += 1;
+        } else {
+          var result3 = null;
+          if (reportMatchFailures) {
+            matchFailed("\"{\"");
+          }
+        }
+        if (result3 !== null) {
+          var result4 = [];
+          var result8 = parse_braced();
+          if (result8 !== null) {
+            var result6 = result8;
+          } else {
+            var result7 = parse_nonBraceCharacter();
+            if (result7 !== null) {
+              var result6 = result7;
+            } else {
+              var result6 = null;;
+            };
+          }
+          while (result6 !== null) {
+            result4.push(result6);
+            var result8 = parse_braced();
+            if (result8 !== null) {
+              var result6 = result8;
+            } else {
+              var result7 = parse_nonBraceCharacter();
+              if (result7 !== null) {
+                var result6 = result7;
+              } else {
+                var result6 = null;;
+              };
+            }
+          }
+          if (result4 !== null) {
+            if (input.substr(pos, 1) === "}") {
+              var result5 = "}";
+              pos += 1;
+            } else {
+              var result5 = null;
+              if (reportMatchFailures) {
+                matchFailed("\"}\"");
+              }
+            }
+            if (result5 !== null) {
+              var result1 = [result3, result4, result5];
+            } else {
+              var result1 = null;
+              pos = savedPos1;
+            }
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function(parts) {
+                return "{" + parts.join("") + "}";
+              })(result1[1])
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_nonBraceCharacters() {
+        var cacheKey = 'nonBraceCharacters@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var result3 = parse_nonBraceCharacter();
+        if (result3 !== null) {
+          var result1 = [];
+          while (result3 !== null) {
+            result1.push(result3);
+            var result3 = parse_nonBraceCharacter();
+          }
+        } else {
+          var result1 = null;
+        }
+        var result2 = result1 !== null
+          ? (function(chars) { return chars.join(""); })(result1)
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_nonBraceCharacter() {
+        var cacheKey = 'nonBraceCharacter@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        if (input.substr(pos).match(/^[^{}]/) !== null) {
+          var result0 = input.charAt(pos);
+          pos++;
+        } else {
+          var result0 = null;
+          if (reportMatchFailures) {
+            matchFailed("[^{}]");
+          }
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_equals() {
+        var cacheKey = 'equals@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        if (input.substr(pos, 1) === "=") {
+          var result3 = "=";
+          pos += 1;
+        } else {
+          var result3 = null;
+          if (reportMatchFailures) {
+            matchFailed("\"=\"");
+          }
+        }
+        if (result3 !== null) {
+          var result4 = parse___();
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function() { return "="; })()
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_colon() {
+        var cacheKey = 'colon@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        if (input.substr(pos, 1) === ":") {
+          var result3 = ":";
+          pos += 1;
+        } else {
+          var result3 = null;
+          if (reportMatchFailures) {
+            matchFailed("\":\"");
+          }
+        }
+        if (result3 !== null) {
+          var result4 = parse___();
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function() { return ":"; })()
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_semicolon() {
+        var cacheKey = 'semicolon@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        if (input.substr(pos, 1) === ";") {
+          var result3 = ";";
+          pos += 1;
+        } else {
+          var result3 = null;
+          if (reportMatchFailures) {
+            matchFailed("\";\"");
+          }
+        }
+        if (result3 !== null) {
+          var result4 = parse___();
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function() { return ";"; })()
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_slash() {
+        var cacheKey = 'slash@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        if (input.substr(pos, 1) === "/") {
+          var result3 = "/";
+          pos += 1;
+        } else {
+          var result3 = null;
+          if (reportMatchFailures) {
+            matchFailed("\"/\"");
+          }
+        }
+        if (result3 !== null) {
+          var result4 = parse___();
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function() { return "/"; })()
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_and() {
+        var cacheKey = 'and@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        if (input.substr(pos, 1) === "&") {
+          var result3 = "&";
+          pos += 1;
+        } else {
+          var result3 = null;
+          if (reportMatchFailures) {
+            matchFailed("\"&\"");
+          }
+        }
+        if (result3 !== null) {
+          var result4 = parse___();
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function() { return "&"; })()
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_not() {
+        var cacheKey = 'not@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        if (input.substr(pos, 1) === "!") {
+          var result3 = "!";
+          pos += 1;
+        } else {
+          var result3 = null;
+          if (reportMatchFailures) {
+            matchFailed("\"!\"");
+          }
+        }
+        if (result3 !== null) {
+          var result4 = parse___();
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function() { return "!"; })()
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_question() {
+        var cacheKey = 'question@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        if (input.substr(pos, 1) === "?") {
+          var result3 = "?";
+          pos += 1;
+        } else {
+          var result3 = null;
+          if (reportMatchFailures) {
+            matchFailed("\"?\"");
+          }
+        }
+        if (result3 !== null) {
+          var result4 = parse___();
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function() { return "?"; })()
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_star() {
+        var cacheKey = 'star@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        if (input.substr(pos, 1) === "*") {
+          var result3 = "*";
+          pos += 1;
+        } else {
+          var result3 = null;
+          if (reportMatchFailures) {
+            matchFailed("\"*\"");
+          }
+        }
+        if (result3 !== null) {
+          var result4 = parse___();
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function() { return "*"; })()
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_plus() {
+        var cacheKey = 'plus@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        if (input.substr(pos, 1) === "+") {
+          var result3 = "+";
+          pos += 1;
+        } else {
+          var result3 = null;
+          if (reportMatchFailures) {
+            matchFailed("\"+\"");
+          }
+        }
+        if (result3 !== null) {
+          var result4 = parse___();
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function() { return "+"; })()
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_lparen() {
+        var cacheKey = 'lparen@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        if (input.substr(pos, 1) === "(") {
+          var result3 = "(";
+          pos += 1;
+        } else {
+          var result3 = null;
+          if (reportMatchFailures) {
+            matchFailed("\"(\"");
+          }
+        }
+        if (result3 !== null) {
+          var result4 = parse___();
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function() { return "("; })()
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_rparen() {
+        var cacheKey = 'rparen@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        if (input.substr(pos, 1) === ")") {
+          var result3 = ")";
+          pos += 1;
+        } else {
+          var result3 = null;
+          if (reportMatchFailures) {
+            matchFailed("\")\"");
+          }
+        }
+        if (result3 !== null) {
+          var result4 = parse___();
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function() { return ")"; })()
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_dot() {
+        var cacheKey = 'dot@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        if (input.substr(pos, 1) === ".") {
+          var result3 = ".";
+          pos += 1;
+        } else {
+          var result3 = null;
+          if (reportMatchFailures) {
+            matchFailed("\".\"");
+          }
+        }
+        if (result3 !== null) {
+          var result4 = parse___();
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function() { return "."; })()
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_identifier() {
+        var cacheKey = 'identifier@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        var savedReportMatchFailures = reportMatchFailures;
+        reportMatchFailures = false;
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        var result13 = parse_letter();
+        if (result13 !== null) {
+          var result3 = result13;
+        } else {
+          if (input.substr(pos, 1) === "_") {
+            var result12 = "_";
+            pos += 1;
+          } else {
+            var result12 = null;
+            if (reportMatchFailures) {
+              matchFailed("\"_\"");
+            }
+          }
+          if (result12 !== null) {
+            var result3 = result12;
+          } else {
+            if (input.substr(pos, 1) === "$") {
+              var result11 = "$";
+              pos += 1;
+            } else {
+              var result11 = null;
+              if (reportMatchFailures) {
+                matchFailed("\"$\"");
+              }
+            }
+            if (result11 !== null) {
+              var result3 = result11;
+            } else {
+              var result3 = null;;
+            };
+          };
+        }
+        if (result3 !== null) {
+          var result4 = [];
+          var result10 = parse_letter();
+          if (result10 !== null) {
+            var result6 = result10;
+          } else {
+            var result9 = parse_digit();
+            if (result9 !== null) {
+              var result6 = result9;
+            } else {
+              if (input.substr(pos, 1) === "_") {
+                var result8 = "_";
+                pos += 1;
+              } else {
+                var result8 = null;
+                if (reportMatchFailures) {
+                  matchFailed("\"_\"");
+                }
+              }
+              if (result8 !== null) {
+                var result6 = result8;
+              } else {
+                if (input.substr(pos, 1) === "$") {
+                  var result7 = "$";
+                  pos += 1;
+                } else {
+                  var result7 = null;
+                  if (reportMatchFailures) {
+                    matchFailed("\"$\"");
+                  }
+                }
+                if (result7 !== null) {
+                  var result6 = result7;
+                } else {
+                  var result6 = null;;
+                };
+              };
+            };
+          }
+          while (result6 !== null) {
+            result4.push(result6);
+            var result10 = parse_letter();
+            if (result10 !== null) {
+              var result6 = result10;
+            } else {
+              var result9 = parse_digit();
+              if (result9 !== null) {
+                var result6 = result9;
+              } else {
+                if (input.substr(pos, 1) === "_") {
+                  var result8 = "_";
+                  pos += 1;
+                } else {
+                  var result8 = null;
+                  if (reportMatchFailures) {
+                    matchFailed("\"_\"");
+                  }
+                }
+                if (result8 !== null) {
+                  var result6 = result8;
+                } else {
+                  if (input.substr(pos, 1) === "$") {
+                    var result7 = "$";
+                    pos += 1;
+                  } else {
+                    var result7 = null;
+                    if (reportMatchFailures) {
+                      matchFailed("\"$\"");
+                    }
+                  }
+                  if (result7 !== null) {
+                    var result6 = result7;
+                  } else {
+                    var result6 = null;;
+                  };
+                };
+              };
+            }
+          }
+          if (result4 !== null) {
+            var result5 = parse___();
+            if (result5 !== null) {
+              var result1 = [result3, result4, result5];
+            } else {
+              var result1 = null;
+              pos = savedPos1;
+            }
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function(head, tail) {
+                return head + tail.join("");
+              })(result1[0], result1[1])
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        reportMatchFailures = savedReportMatchFailures;
+        if (reportMatchFailures && result0 === null) {
+          matchFailed("identifier");
+        }
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_literal() {
+        var cacheKey = 'literal@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        var savedReportMatchFailures = reportMatchFailures;
+        reportMatchFailures = false;
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        var result6 = parse_doubleQuotedLiteral();
+        if (result6 !== null) {
+          var result3 = result6;
+        } else {
+          var result5 = parse_singleQuotedLiteral();
+          if (result5 !== null) {
+            var result3 = result5;
+          } else {
+            var result3 = null;;
+          };
+        }
+        if (result3 !== null) {
+          var result4 = parse___();
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function(literal) { return literal; })(result1[0])
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        reportMatchFailures = savedReportMatchFailures;
+        if (reportMatchFailures && result0 === null) {
+          matchFailed("literal");
+        }
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_doubleQuotedLiteral() {
+        var cacheKey = 'doubleQuotedLiteral@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        if (input.substr(pos, 1) === "\"") {
+          var result3 = "\"";
+          pos += 1;
+        } else {
+          var result3 = null;
+          if (reportMatchFailures) {
+            matchFailed("\"\\\"\"");
+          }
+        }
+        if (result3 !== null) {
+          var result4 = [];
+          var result6 = parse_doubleQuotedCharacter();
+          while (result6 !== null) {
+            result4.push(result6);
+            var result6 = parse_doubleQuotedCharacter();
+          }
+          if (result4 !== null) {
+            if (input.substr(pos, 1) === "\"") {
+              var result5 = "\"";
+              pos += 1;
+            } else {
+              var result5 = null;
+              if (reportMatchFailures) {
+                matchFailed("\"\\\"\"");
+              }
+            }
+            if (result5 !== null) {
+              var result1 = [result3, result4, result5];
+            } else {
+              var result1 = null;
+              pos = savedPos1;
+            }
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function(chars) { return chars.join(""); })(result1[1])
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_doubleQuotedCharacter() {
+        var cacheKey = 'doubleQuotedCharacter@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var result6 = parse_simpleDoubleQuotedCharacter();
+        if (result6 !== null) {
+          var result0 = result6;
+        } else {
+          var result5 = parse_simpleEscapeSequence();
+          if (result5 !== null) {
+            var result0 = result5;
+          } else {
+            var result4 = parse_zeroEscapeSequence();
+            if (result4 !== null) {
+              var result0 = result4;
+            } else {
+              var result3 = parse_hexEscapeSequence();
+              if (result3 !== null) {
+                var result0 = result3;
+              } else {
+                var result2 = parse_unicodeEscapeSequence();
+                if (result2 !== null) {
+                  var result0 = result2;
+                } else {
+                  var result1 = parse_eolEscapeSequence();
+                  if (result1 !== null) {
+                    var result0 = result1;
+                  } else {
+                    var result0 = null;;
+                  };
+                };
+              };
+            };
+          };
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_simpleDoubleQuotedCharacter() {
+        var cacheKey = 'simpleDoubleQuotedCharacter@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        var savedPos2 = pos;
+        var savedReportMatchFailuresVar0 = reportMatchFailures;
+        reportMatchFailures = false;
+        if (input.substr(pos, 1) === "\"") {
+          var result8 = "\"";
+          pos += 1;
+        } else {
+          var result8 = null;
+          if (reportMatchFailures) {
+            matchFailed("\"\\\"\"");
+          }
+        }
+        if (result8 !== null) {
+          var result5 = result8;
+        } else {
+          if (input.substr(pos, 1) === "\\") {
+            var result7 = "\\";
+            pos += 1;
+          } else {
+            var result7 = null;
+            if (reportMatchFailures) {
+              matchFailed("\"\\\\\"");
+            }
+          }
+          if (result7 !== null) {
+            var result5 = result7;
+          } else {
+            var result6 = parse_eolChar();
+            if (result6 !== null) {
+              var result5 = result6;
+            } else {
+              var result5 = null;;
+            };
+          };
+        }
+        reportMatchFailures = savedReportMatchFailuresVar0;
+        if (result5 === null) {
+          var result3 = '';
+        } else {
+          var result3 = null;
+          pos = savedPos2;
+        }
+        if (result3 !== null) {
+          if (input.length > pos) {
+            var result4 = input.charAt(pos);
+            pos++;
+          } else {
+            var result4 = null;
+            if (reportMatchFailures) {
+              matchFailed('any character');
+            }
+          }
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function(char_) { return char_; })(result1[1])
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_singleQuotedLiteral() {
+        var cacheKey = 'singleQuotedLiteral@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        if (input.substr(pos, 1) === "'") {
+          var result3 = "'";
+          pos += 1;
+        } else {
+          var result3 = null;
+          if (reportMatchFailures) {
+            matchFailed("\"'\"");
+          }
+        }
+        if (result3 !== null) {
+          var result4 = [];
+          var result6 = parse_singleQuotedCharacter();
+          while (result6 !== null) {
+            result4.push(result6);
+            var result6 = parse_singleQuotedCharacter();
+          }
+          if (result4 !== null) {
+            if (input.substr(pos, 1) === "'") {
+              var result5 = "'";
+              pos += 1;
+            } else {
+              var result5 = null;
+              if (reportMatchFailures) {
+                matchFailed("\"'\"");
+              }
+            }
+            if (result5 !== null) {
+              var result1 = [result3, result4, result5];
+            } else {
+              var result1 = null;
+              pos = savedPos1;
+            }
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function(chars) { return chars.join(""); })(result1[1])
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_singleQuotedCharacter() {
+        var cacheKey = 'singleQuotedCharacter@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var result6 = parse_simpleSingleQuotedCharacter();
+        if (result6 !== null) {
+          var result0 = result6;
+        } else {
+          var result5 = parse_simpleEscapeSequence();
+          if (result5 !== null) {
+            var result0 = result5;
+          } else {
+            var result4 = parse_zeroEscapeSequence();
+            if (result4 !== null) {
+              var result0 = result4;
+            } else {
+              var result3 = parse_hexEscapeSequence();
+              if (result3 !== null) {
+                var result0 = result3;
+              } else {
+                var result2 = parse_unicodeEscapeSequence();
+                if (result2 !== null) {
+                  var result0 = result2;
+                } else {
+                  var result1 = parse_eolEscapeSequence();
+                  if (result1 !== null) {
+                    var result0 = result1;
+                  } else {
+                    var result0 = null;;
+                  };
+                };
+              };
+            };
+          };
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_simpleSingleQuotedCharacter() {
+        var cacheKey = 'simpleSingleQuotedCharacter@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        var savedPos2 = pos;
+        var savedReportMatchFailuresVar0 = reportMatchFailures;
+        reportMatchFailures = false;
+        if (input.substr(pos, 1) === "'") {
+          var result8 = "'";
+          pos += 1;
+        } else {
+          var result8 = null;
+          if (reportMatchFailures) {
+            matchFailed("\"'\"");
+          }
+        }
+        if (result8 !== null) {
+          var result5 = result8;
+        } else {
+          if (input.substr(pos, 1) === "\\") {
+            var result7 = "\\";
+            pos += 1;
+          } else {
+            var result7 = null;
+            if (reportMatchFailures) {
+              matchFailed("\"\\\\\"");
+            }
+          }
+          if (result7 !== null) {
+            var result5 = result7;
+          } else {
+            var result6 = parse_eolChar();
+            if (result6 !== null) {
+              var result5 = result6;
+            } else {
+              var result5 = null;;
+            };
+          };
+        }
+        reportMatchFailures = savedReportMatchFailuresVar0;
+        if (result5 === null) {
+          var result3 = '';
+        } else {
+          var result3 = null;
+          pos = savedPos2;
+        }
+        if (result3 !== null) {
+          if (input.length > pos) {
+            var result4 = input.charAt(pos);
+            pos++;
+          } else {
+            var result4 = null;
+            if (reportMatchFailures) {
+              matchFailed('any character');
+            }
+          }
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function(char_) { return char_; })(result1[1])
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_class() {
+        var cacheKey = 'class@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        var savedReportMatchFailures = reportMatchFailures;
+        reportMatchFailures = false;
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        if (input.substr(pos, 1) === "[") {
+          var result3 = "[";
+          pos += 1;
+        } else {
+          var result3 = null;
+          if (reportMatchFailures) {
+            matchFailed("\"[\"");
+          }
+        }
+        if (result3 !== null) {
+          if (input.substr(pos, 1) === "^") {
+            var result11 = "^";
+            pos += 1;
+          } else {
+            var result11 = null;
+            if (reportMatchFailures) {
+              matchFailed("\"^\"");
+            }
+          }
+          var result4 = result11 !== null ? result11 : '';
+          if (result4 !== null) {
+            var result5 = [];
+            var result10 = parse_classCharacterRange();
+            if (result10 !== null) {
+              var result8 = result10;
+            } else {
+              var result9 = parse_classCharacter();
+              if (result9 !== null) {
+                var result8 = result9;
+              } else {
+                var result8 = null;;
+              };
+            }
+            while (result8 !== null) {
+              result5.push(result8);
+              var result10 = parse_classCharacterRange();
+              if (result10 !== null) {
+                var result8 = result10;
+              } else {
+                var result9 = parse_classCharacter();
+                if (result9 !== null) {
+                  var result8 = result9;
+                } else {
+                  var result8 = null;;
+                };
+              }
+            }
+            if (result5 !== null) {
+              if (input.substr(pos, 1) === "]") {
+                var result6 = "]";
+                pos += 1;
+              } else {
+                var result6 = null;
+                if (reportMatchFailures) {
+                  matchFailed("\"]\"");
+                }
+              }
+              if (result6 !== null) {
+                var result7 = parse___();
+                if (result7 !== null) {
+                  var result1 = [result3, result4, result5, result6, result7];
+                } else {
+                  var result1 = null;
+                  pos = savedPos1;
+                }
+              } else {
+                var result1 = null;
+                pos = savedPos1;
+              }
+            } else {
+              var result1 = null;
+              pos = savedPos1;
+            }
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function(inverted, parts) {
+                var partsConverted = map(parts, function(part) { return part.data; });
+                var rawText = "["
+                  + inverted
+                  + map(parts, function(part) { return part.rawText; }).join("")
+                  + "]";
+          
+                return {
+                  type:     "class",
+                  inverted: inverted === "^",
+                  parts:    partsConverted,
+                  // FIXME: Get the raw text from the input directly.
+                  rawText:  rawText
+                };
+              })(result1[1], result1[2])
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        reportMatchFailures = savedReportMatchFailures;
+        if (reportMatchFailures && result0 === null) {
+          matchFailed("character class");
+        }
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_classCharacterRange() {
+        var cacheKey = 'classCharacterRange@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        var result3 = parse_classCharacter();
+        if (result3 !== null) {
+          if (input.substr(pos, 1) === "-") {
+            var result4 = "-";
+            pos += 1;
+          } else {
+            var result4 = null;
+            if (reportMatchFailures) {
+              matchFailed("\"-\"");
+            }
+          }
+          if (result4 !== null) {
+            var result5 = parse_classCharacter();
+            if (result5 !== null) {
+              var result1 = [result3, result4, result5];
+            } else {
+              var result1 = null;
+              pos = savedPos1;
+            }
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function(begin, end) {
+                if (begin.data.charCodeAt(0) > end.data.charCodeAt(0)) {
+                  throw new this.SyntaxError(
+                    "Invalid character range: " + begin.rawText + "-" + end.rawText + "."
+                  );
+                }
+          
+                return {
+                  data:    [begin.data, end.data],
+                  // FIXME: Get the raw text from the input directly.
+                  rawText: begin.rawText + "-" + end.rawText
+                }
+              })(result1[0], result1[2])
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_classCharacter() {
+        var cacheKey = 'classCharacter@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var result1 = parse_bracketDelimitedCharacter();
+        var result2 = result1 !== null
+          ? (function(char_) {
+                return {
+                  data:    char_,
+                  // FIXME: Get the raw text from the input directly.
+                  rawText: quoteForRegexpClass(char_)
+                };
+              })(result1)
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_bracketDelimitedCharacter() {
+        var cacheKey = 'bracketDelimitedCharacter@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var result6 = parse_simpleBracketDelimitedCharacter();
+        if (result6 !== null) {
+          var result0 = result6;
+        } else {
+          var result5 = parse_simpleEscapeSequence();
+          if (result5 !== null) {
+            var result0 = result5;
+          } else {
+            var result4 = parse_zeroEscapeSequence();
+            if (result4 !== null) {
+              var result0 = result4;
+            } else {
+              var result3 = parse_hexEscapeSequence();
+              if (result3 !== null) {
+                var result0 = result3;
+              } else {
+                var result2 = parse_unicodeEscapeSequence();
+                if (result2 !== null) {
+                  var result0 = result2;
+                } else {
+                  var result1 = parse_eolEscapeSequence();
+                  if (result1 !== null) {
+                    var result0 = result1;
+                  } else {
+                    var result0 = null;;
+                  };
+                };
+              };
+            };
+          };
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_simpleBracketDelimitedCharacter() {
+        var cacheKey = 'simpleBracketDelimitedCharacter@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var savedPos0 = pos;
+        var savedPos1 = pos;
+        var savedPos2 = pos;
+        var savedReportMatchFailuresVar0 = reportMatchFailures;
+        reportMatchFailures = false;
+        if (input.substr(pos, 1) === "]") {
+          var result8 = "]";
+          pos += 1;
+        } else {
+          var result8 = null;
+          if (reportMatchFailures) {
+            matchFailed("\"]\"");
+          }
+        }
+        if (result8 !== null) {
+          var result5 = result8;
+        } else {
+          if (input.substr(pos, 1) === "\\") {
+            var result7 = "\\";
+            pos += 1;
+          } else {
+            var result7 = null;
+            if (reportMatchFailures) {
+              matchFailed("\"\\\\\"");
+            }
+          }
+          if (result7 !== null) {
+            var result5 = result7;
+          } else {
+            var result6 = parse_eolChar();
+            if (result6 !== null) {
+              var result5 = result6;
+            } else {
+              var result5 = null;;
+            };
+          };
+        }
+        reportMatchFailures = savedReportMatchFailuresVar0;
+        if (result5 === null) {
+          var result3 = '';
+        } else {
+          var result3 = null;
+          pos = savedPos2;
+        }
+        if (result3 !== null) {
+          if (input.length > pos) {
+            var result4 = input.charAt(pos);
+            pos++;
+          } else {
+            var result4 = null;
+            if (reportMatchFailures) {
+              matchFailed('any character');
+            }
+          }
+          if (result4 !== null) {
+            var result1 = [result3, result4];
+          } else {
+            var result1 = null;
+            pos = savedPos1;
+          }
+        } else {
+          var result1 = null;
+          pos = savedPos1;
+        }
+        var result2 = result1 !== null
+          ? (function(char_) { return char_; })(result1[1])
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_simpleEscapeSequence() {
+        var cacheKey = 'simpleEscapeSequence@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+

<TRUNCATED>

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org