UNPKG

mail

Version:

This SMTP client library for Node.JS helps you send email safely and easily.

1,747 lines 53.4 kB
exports.parser = (function(){
  /* Generated by PEG.js (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.grammarParser.SyntaxError| describing the error.
     */
    parse: function(input) {
      var pos = 0;
      var rightmostMatchFailuresPos = 0;
      var rightmostMatchFailuresExpected = [];
      var cache = {};

      function quoteString(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(/\u2028/g, '\\u2028') // line separator
          .replace(/\u2029/g, '\\u2029') // paragraph separator
          .replace(/\n/g, '\\n')         // line feed
          + '"';
      }

      function arrayContains(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 matchFailed(failure) {
        if (pos < rightmostMatchFailuresPos) {
          return;
        }

        if (pos > rightmostMatchFailuresPos) {
          rightmostMatchFailuresPos = pos;
          rightmostMatchFailuresExpected = [];
        }

        if (!arrayContains(rightmostMatchFailuresExpected, failure)) {
          rightmostMatchFailuresExpected.push(failure);
        }
      }

      function parse_start(context) {
        var cacheKey = "start" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        var savedPos0 = pos;
        var result2 = parse__(context);
        if (result2 !== null) {
          var result3 = parse_object(context);
          if (result3 !== null) {
            var result1 = [result2, result3];
          } else {
            var result1 = null;
            pos = savedPos0;
          }
        } else {
          var result1 = null;
          pos = savedPos0;
        }
        var result0 = result1 !== null
          ? (function(object) { return object; })(result1[1])
          : null;



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_object(context) {
        var cacheKey = "object" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        var savedPos1 = pos;
        if (input.substr(pos, 1) === "{") {
          var result10 = "{";
          pos += 1;
        } else {
          var result10 = null;
          if (context.reportMatchFailures) {
            matchFailed(quoteString("{"));
          }
        }
        if (result10 !== null) {
          var result11 = parse__(context);
          if (result11 !== null) {
            if (input.substr(pos, 1) === "}") {
              var result12 = "}";
              pos += 1;
            } else {
              var result12 = null;
              if (context.reportMatchFailures) {
                matchFailed(quoteString("}"));
              }
            }
            if (result12 !== null) {
              var result13 = parse__(context);
              if (result13 !== null) {
                var result9 = [result10, result11, result12, result13];
              } else {
                var result9 = null;
                pos = savedPos1;
              }
            } else {
              var result9 = null;
              pos = savedPos1;
            }
          } else {
            var result9 = null;
            pos = savedPos1;
          }
        } else {
          var result9 = null;
          pos = savedPos1;
        }
        var result8 = result9 !== null
          ? (function() { return {};      })()
          : null;
        if (result8 !== null) {
          var result0 = result8;
        } else {
          var savedPos0 = pos;
          if (input.substr(pos, 1) === "{") {
            var result3 = "{";
            pos += 1;
          } else {
            var result3 = null;
            if (context.reportMatchFailures) {
              matchFailed(quoteString("{"));
            }
          }
          if (result3 !== null) {
            var result4 = parse__(context);
            if (result4 !== null) {
              var result5 = parse_members(context);
              if (result5 !== null) {
                if (input.substr(pos, 1) === "}") {
                  var result6 = "}";
                  pos += 1;
                } else {
                  var result6 = null;
                  if (context.reportMatchFailures) {
                    matchFailed(quoteString("}"));
                  }
                }
                if (result6 !== null) {
                  var result7 = parse__(context);
                  if (result7 !== null) {
                    var result2 = [result3, result4, result5, result6, result7];
                  } else {
                    var result2 = null;
                    pos = savedPos0;
                  }
                } else {
                  var result2 = null;
                  pos = savedPos0;
                }
              } else {
                var result2 = null;
                pos = savedPos0;
              }
            } else {
              var result2 = null;
              pos = savedPos0;
            }
          } else {
            var result2 = null;
            pos = savedPos0;
          }
          var result1 = result2 !== null
            ? (function(members) { return members; })(result2[2])
            : null;
          if (result1 !== null) {
            var result0 = result1;
          } else {
            var result0 = null;;
          };
        }



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_members(context) {
        var cacheKey = "members" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        var savedPos0 = pos;
        var result2 = parse_pair(context);
        if (result2 !== null) {
          var result3 = [];
          var savedPos1 = pos;
          if (input.substr(pos, 1) === ",") {
            var result5 = ",";
            pos += 1;
          } else {
            var result5 = null;
            if (context.reportMatchFailures) {
              matchFailed(quoteString(","));
            }
          }
          if (result5 !== null) {
            var result6 = parse__(context);
            if (result6 !== null) {
              var result7 = parse_pair(context);
              if (result7 !== null) {
                var result4 = [result5, result6, result7];
              } else {
                var result4 = null;
                pos = savedPos1;
              }
            } else {
              var result4 = null;
              pos = savedPos1;
            }
          } else {
            var result4 = null;
            pos = savedPos1;
          }
          while (result4 !== null) {
            result3.push(result4);
            var savedPos1 = pos;
            if (input.substr(pos, 1) === ",") {
              var result5 = ",";
              pos += 1;
            } else {
              var result5 = null;
              if (context.reportMatchFailures) {
                matchFailed(quoteString(","));
              }
            }
            if (result5 !== null) {
              var result6 = parse__(context);
              if (result6 !== null) {
                var result7 = parse_pair(context);
                if (result7 !== null) {
                  var result4 = [result5, result6, result7];
                } else {
                  var result4 = null;
                  pos = savedPos1;
                }
              } else {
                var result4 = null;
                pos = savedPos1;
              }
            } else {
              var result4 = null;
              pos = savedPos1;
            }
          }
          if (result3 !== null) {
            var result1 = [result2, result3];
          } else {
            var result1 = null;
            pos = savedPos0;
          }
        } else {
          var result1 = null;
          pos = savedPos0;
        }
        var result0 = result1 !== null
          ? (function(head, tail) {
                var result = {};
                result[head[0]] = head[1];
                for (var i = 0; i < tail.length; i++) {
                  result[tail[i][2][0]] = tail[i][2][1];
                }
                return result;
              })(result1[0], result1[1])
          : null;



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_pair(context) {
        var cacheKey = "pair" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        var savedPos0 = pos;
        var result2 = parse_string(context);
        if (result2 !== null) {
          if (input.substr(pos, 1) === ":") {
            var result3 = ":";
            pos += 1;
          } else {
            var result3 = null;
            if (context.reportMatchFailures) {
              matchFailed(quoteString(":"));
            }
          }
          if (result3 !== null) {
            var result4 = parse__(context);
            if (result4 !== null) {
              var result5 = parse_value(context);
              if (result5 !== null) {
                var result1 = [result2, result3, result4, result5];
              } else {
                var result1 = null;
                pos = savedPos0;
              }
            } else {
              var result1 = null;
              pos = savedPos0;
            }
          } else {
            var result1 = null;
            pos = savedPos0;
          }
        } else {
          var result1 = null;
          pos = savedPos0;
        }
        var result0 = result1 !== null
          ? (function(name, value) { return [name, value]; })(result1[0], result1[3])
          : null;



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_array(context) {
        var cacheKey = "array" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        var savedPos1 = pos;
        if (input.substr(pos, 1) === "[") {
          var result10 = "[";
          pos += 1;
        } else {
          var result10 = null;
          if (context.reportMatchFailures) {
            matchFailed(quoteString("["));
          }
        }
        if (result10 !== null) {
          var result11 = parse__(context);
          if (result11 !== null) {
            if (input.substr(pos, 1) === "]") {
              var result12 = "]";
              pos += 1;
            } else {
              var result12 = null;
              if (context.reportMatchFailures) {
                matchFailed(quoteString("]"));
              }
            }
            if (result12 !== null) {
              var result13 = parse__(context);
              if (result13 !== null) {
                var result9 = [result10, result11, result12, result13];
              } else {
                var result9 = null;
                pos = savedPos1;
              }
            } else {
              var result9 = null;
              pos = savedPos1;
            }
          } else {
            var result9 = null;
            pos = savedPos1;
          }
        } else {
          var result9 = null;
          pos = savedPos1;
        }
        var result8 = result9 !== null
          ? (function() { return [];       })()
          : null;
        if (result8 !== null) {
          var result0 = result8;
        } else {
          var savedPos0 = pos;
          if (input.substr(pos, 1) === "[") {
            var result3 = "[";
            pos += 1;
          } else {
            var result3 = null;
            if (context.reportMatchFailures) {
              matchFailed(quoteString("["));
            }
          }
          if (result3 !== null) {
            var result4 = parse__(context);
            if (result4 !== null) {
              var result5 = parse_elements(context);
              if (result5 !== null) {
                if (input.substr(pos, 1) === "]") {
                  var result6 = "]";
                  pos += 1;
                } else {
                  var result6 = null;
                  if (context.reportMatchFailures) {
                    matchFailed(quoteString("]"));
                  }
                }
                if (result6 !== null) {
                  var result7 = parse__(context);
                  if (result7 !== null) {
                    var result2 = [result3, result4, result5, result6, result7];
                  } else {
                    var result2 = null;
                    pos = savedPos0;
                  }
                } else {
                  var result2 = null;
                  pos = savedPos0;
                }
              } else {
                var result2 = null;
                pos = savedPos0;
              }
            } else {
              var result2 = null;
              pos = savedPos0;
            }
          } else {
            var result2 = null;
            pos = savedPos0;
          }
          var result1 = result2 !== null
            ? (function(elements) { return elements; })(result2[2])
            : null;
          if (result1 !== null) {
            var result0 = result1;
          } else {
            var result0 = null;;
          };
        }



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_elements(context) {
        var cacheKey = "elements" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        var savedPos0 = pos;
        var result2 = parse_value(context);
        if (result2 !== null) {
          var result3 = [];
          var savedPos1 = pos;
          if (input.substr(pos, 1) === ",") {
            var result5 = ",";
            pos += 1;
          } else {
            var result5 = null;
            if (context.reportMatchFailures) {
              matchFailed(quoteString(","));
            }
          }
          if (result5 !== null) {
            var result6 = parse__(context);
            if (result6 !== null) {
              var result7 = parse_value(context);
              if (result7 !== null) {
                var result4 = [result5, result6, result7];
              } else {
                var result4 = null;
                pos = savedPos1;
              }
            } else {
              var result4 = null;
              pos = savedPos1;
            }
          } else {
            var result4 = null;
            pos = savedPos1;
          }
          while (result4 !== null) {
            result3.push(result4);
            var savedPos1 = pos;
            if (input.substr(pos, 1) === ",") {
              var result5 = ",";
              pos += 1;
            } else {
              var result5 = null;
              if (context.reportMatchFailures) {
                matchFailed(quoteString(","));
              }
            }
            if (result5 !== null) {
              var result6 = parse__(context);
              if (result6 !== null) {
                var result7 = parse_value(context);
                if (result7 !== null) {
                  var result4 = [result5, result6, result7];
                } else {
                  var result4 = null;
                  pos = savedPos1;
                }
              } else {
                var result4 = null;
                pos = savedPos1;
              }
            } else {
              var result4 = null;
              pos = savedPos1;
            }
          }
          if (result3 !== null) {
            var result1 = [result2, result3];
          } else {
            var result1 = null;
            pos = savedPos0;
          }
        } else {
          var result1 = null;
          pos = savedPos0;
        }
        var result0 = result1 !== null
          ? (function(head, tail) {
                var result = [head];
                for (var i = 0; i < tail.length; i++) {
                  result.push(tail[i][2]);
                }
                return result;
              })(result1[0], result1[1])
          : null;



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_value(context) {
        var cacheKey = "value" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        var result16 = parse_string(context);
        if (result16 !== null) {
          var result0 = result16;
        } else {
          var result15 = parse_number(context);
          if (result15 !== null) {
            var result0 = result15;
          } else {
            var result14 = parse_object(context);
            if (result14 !== null) {
              var result0 = result14;
            } else {
              var result13 = parse_array(context);
              if (result13 !== null) {
                var result0 = result13;
              } else {
                var savedPos2 = pos;
                if (input.substr(pos, 4) === "true") {
                  var result11 = "true";
                  pos += 4;
                } else {
                  var result11 = null;
                  if (context.reportMatchFailures) {
                    matchFailed(quoteString("true"));
                  }
                }
                if (result11 !== null) {
                  var result12 = parse__(context);
                  if (result12 !== null) {
                    var result10 = [result11, result12];
                  } else {
                    var result10 = null;
                    pos = savedPos2;
                  }
                } else {
                  var result10 = null;
                  pos = savedPos2;
                }
                var result9 = result10 !== null
                  ? (function() { return true;   })()
                  : null;
                if (result9 !== null) {
                  var result0 = result9;
                } else {
                  var savedPos1 = pos;
                  if (input.substr(pos, 5) === "false") {
                    var result7 = "false";
                    pos += 5;
                  } else {
                    var result7 = null;
                    if (context.reportMatchFailures) {
                      matchFailed(quoteString("false"));
                    }
                  }
                  if (result7 !== null) {
                    var result8 = parse__(context);
                    if (result8 !== null) {
                      var result6 = [result7, result8];
                    } else {
                      var result6 = null;
                      pos = savedPos1;
                    }
                  } else {
                    var result6 = null;
                    pos = savedPos1;
                  }
                  var result5 = result6 !== null
                    ? (function() { return false;  })()
                    : null;
                  if (result5 !== null) {
                    var result0 = result5;
                  } else {
                    var savedPos0 = pos;
                    if (input.substr(pos, 4) === "null") {
                      var result3 = "null";
                      pos += 4;
                    } else {
                      var result3 = null;
                      if (context.reportMatchFailures) {
                        matchFailed(quoteString("null"));
                      }
                    }
                    if (result3 !== null) {
                      var result4 = parse__(context);
                      if (result4 !== null) {
                        var result2 = [result3, result4];
                      } else {
                        var result2 = null;
                        pos = savedPos0;
                      }
                    } else {
                      var result2 = null;
                      pos = savedPos0;
                    }
                    var result1 = result2 !== null
                      ? (function() { return "null"; })()
                      : null;
                    if (result1 !== null) {
                      var result0 = result1;
                    } else {
                      var result0 = null;;
                    };
                  };
                };
              };
            };
          };
        }



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_string(context) {
        var cacheKey = "string" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }

        var savedReportMatchFailures = context.reportMatchFailures;
        context.reportMatchFailures = false;
        var savedPos1 = pos;
        if (input.substr(pos, 1) === "\"") {
          var result9 = "\"";
          pos += 1;
        } else {
          var result9 = null;
          if (context.reportMatchFailures) {
            matchFailed(quoteString("\""));
          }
        }
        if (result9 !== null) {
          if (input.substr(pos, 1) === "\"") {
            var result10 = "\"";
            pos += 1;
          } else {
            var result10 = null;
            if (context.reportMatchFailures) {
              matchFailed(quoteString("\""));
            }
          }
          if (result10 !== null) {
            var result11 = parse__(context);
            if (result11 !== null) {
              var result8 = [result9, result10, result11];
            } else {
              var result8 = null;
              pos = savedPos1;
            }
          } else {
            var result8 = null;
            pos = savedPos1;
          }
        } else {
          var result8 = null;
          pos = savedPos1;
        }
        var result7 = result8 !== null
          ? (function() { return "";    })()
          : null;
        if (result7 !== null) {
          var result0 = result7;
        } else {
          var savedPos0 = pos;
          if (input.substr(pos, 1) === "\"") {
            var result3 = "\"";
            pos += 1;
          } else {
            var result3 = null;
            if (context.reportMatchFailures) {
              matchFailed(quoteString("\""));
            }
          }
          if (result3 !== null) {
            var result4 = parse_chars(context);
            if (result4 !== null) {
              if (input.substr(pos, 1) === "\"") {
                var result5 = "\"";
                pos += 1;
              } else {
                var result5 = null;
                if (context.reportMatchFailures) {
                  matchFailed(quoteString("\""));
                }
              }
              if (result5 !== null) {
                var result6 = parse__(context);
                if (result6 !== null) {
                  var result2 = [result3, result4, result5, result6];
                } else {
                  var result2 = null;
                  pos = savedPos0;
                }
              } else {
                var result2 = null;
                pos = savedPos0;
              }
            } else {
              var result2 = null;
              pos = savedPos0;
            }
          } else {
            var result2 = null;
            pos = savedPos0;
          }
          var result1 = result2 !== null
            ? (function(chars) { return chars; })(result2[1])
            : null;
          if (result1 !== null) {
            var result0 = result1;
          } else {
            var result0 = null;;
          };
        }
        context.reportMatchFailures = savedReportMatchFailures;
        if (context.reportMatchFailures && result0 === null) {
          matchFailed("string");
        }

        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_chars(context) {
        var cacheKey = "chars" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        var result2 = parse_char(context);
        if (result2 !== null) {
          var result1 = [];
          while (result2 !== null) {
            result1.push(result2);
            var result2 = parse_char(context);
          }
        } else {
          var result1 = null;
        }
        var result0 = result1 !== null
          ? (function(chars) { return chars.join(""); })(result1)
          : null;



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_char(context) {
        var cacheKey = "char" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        if (input.substr(pos).match(/^[^"\\\0-]/) !== null) {
          var result24 = input.charAt(pos);
          pos++;
        } else {
          var result24 = null;
          if (context.reportMatchFailures) {
            matchFailed("[^\"\\\\\\0-]");
          }
        }
        if (result24 !== null) {
          var result0 = result24;
        } else {
          if (input.substr(pos, 2) === "\\\"") {
            var result23 = "\\\"";
            pos += 2;
          } else {
            var result23 = null;
            if (context.reportMatchFailures) {
              matchFailed(quoteString("\\\""));
            }
          }
          var result22 = result23 !== null
            ? (function() { return '"';  })()
            : null;
          if (result22 !== null) {
            var result0 = result22;
          } else {
            if (input.substr(pos, 2) === "\\\\") {
              var result21 = "\\\\";
              pos += 2;
            } else {
              var result21 = null;
              if (context.reportMatchFailures) {
                matchFailed(quoteString("\\\\"));
              }
            }
            var result20 = result21 !== null
              ? (function() { return "\\"; })()
              : null;
            if (result20 !== null) {
              var result0 = result20;
            } else {
              if (input.substr(pos, 2) === "\\/") {
                var result19 = "\\/";
                pos += 2;
              } else {
                var result19 = null;
                if (context.reportMatchFailures) {
                  matchFailed(quoteString("\\/"));
                }
              }
              var result18 = result19 !== null
                ? (function() { return "/";  })()
                : null;
              if (result18 !== null) {
                var result0 = result18;
              } else {
                if (input.substr(pos, 2) === "\\b") {
                  var result17 = "\\b";
                  pos += 2;
                } else {
                  var result17 = null;
                  if (context.reportMatchFailures) {
                    matchFailed(quoteString("\\b"));
                  }
                }
                var result16 = result17 !== null
                  ? (function() { return "\b"; })()
                  : null;
                if (result16 !== null) {
                  var result0 = result16;
                } else {
                  if (input.substr(pos, 2) === "\\f") {
                    var result15 = "\\f";
                    pos += 2;
                  } else {
                    var result15 = null;
                    if (context.reportMatchFailures) {
                      matchFailed(quoteString("\\f"));
                    }
                  }
                  var result14 = result15 !== null
                    ? (function() { return "\f"; })()
                    : null;
                  if (result14 !== null) {
                    var result0 = result14;
                  } else {
                    if (input.substr(pos, 2) === "\\n") {
                      var result13 = "\\n";
                      pos += 2;
                    } else {
                      var result13 = null;
                      if (context.reportMatchFailures) {
                        matchFailed(quoteString("\\n"));
                      }
                    }
                    var result12 = result13 !== null
                      ? (function() { return "\n"; })()
                      : null;
                    if (result12 !== null) {
                      var result0 = result12;
                    } else {
                      if (input.substr(pos, 2) === "\\r") {
                        var result11 = "\\r";
                        pos += 2;
                      } else {
                        var result11 = null;
                        if (context.reportMatchFailures) {
                          matchFailed(quoteString("\\r"));
                        }
                      }
                      var result10 = result11 !== null
                        ? (function() { return "\r"; })()
                        : null;
                      if (result10 !== null) {
                        var result0 = result10;
                      } else {
                        if (input.substr(pos, 2) === "\\t") {
                          var result9 = "\\t";
                          pos += 2;
                        } else {
                          var result9 = null;
                          if (context.reportMatchFailures) {
                            matchFailed(quoteString("\\t"));
                          }
                        }
                        var result8 = result9 !== null
                          ? (function() { return "\t"; })()
                          : null;
                        if (result8 !== null) {
                          var result0 = result8;
                        } else {
                          var savedPos0 = pos;
                          if (input.substr(pos, 2) === "\\u") {
                            var result3 = "\\u";
                            pos += 2;
                          } else {
                            var result3 = null;
                            if (context.reportMatchFailures) {
                              matchFailed(quoteString("\\u"));
                            }
                          }
                          if (result3 !== null) {
                            var result4 = parse_hexDigit(context);
                            if (result4 !== null) {
                              var result5 = parse_hexDigit(context);
                              if (result5 !== null) {
                                var result6 = parse_hexDigit(context);
                                if (result6 !== null) {
                                  var result7 = parse_hexDigit(context);
                                  if (result7 !== null) {
                                    var result2 = [result3, result4, result5, result6, result7];
                                  } else {
                                    var result2 = null;
                                    pos = savedPos0;
                                  }
                                } else {
                                  var result2 = null;
                                  pos = savedPos0;
                                }
                              } else {
                                var result2 = null;
                                pos = savedPos0;
                              }
                            } else {
                              var result2 = null;
                              pos = savedPos0;
                            }
                          } else {
                            var result2 = null;
                            pos = savedPos0;
                          }
                          var result1 = result2 !== null
                            ? (function(h1, h2, h3, h4) {
                                  return String.fromCharCode(parseInt("0x" + h1 + h2 + h3 + h4));
                                })(result2[1], result2[2], result2[3], result2[4])
                            : null;
                          if (result1 !== null) {
                            var result0 = result1;
                          } else {
                            var result0 = null;;
                          };
                        };
                      };
                    };
                  };
                };
              };
            };
          };
        }



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_number(context) {
        var cacheKey = "number" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }

        var savedReportMatchFailures = context.reportMatchFailures;
        context.reportMatchFailures = false;
        var savedPos3 = pos;
        var result17 = parse_int(context);
        if (result17 !== null) {
          var result18 = parse_frac(context);
          if (result18 !== null) {
            var result19 = parse_exp(context);
            if (result19 !== null) {
              var result20 = parse__(context);
              if (result20 !== null) {
                var result16 = [result17, result18, result19, result20];
              } else {
                var result16 = null;
                pos = savedPos3;
              }
            } else {
              var result16 = null;
              pos = savedPos3;
            }
          } else {
            var result16 = null;
            pos = savedPos3;
          }
        } else {
          var result16 = null;
          pos = savedPos3;
        }
        var result15 = result16 !== null
          ? (function(int_, frac, exp) { return parseFloat(int_ + frac + exp); })(result16[0], result16[1], result16[2])
          : null;
        if (result15 !== null) {
          var result0 = result15;
        } else {
          var savedPos2 = pos;
          var result12 = parse_int(context);
          if (result12 !== null) {
            var result13 = parse_frac(context);
            if (result13 !== null) {
              var result14 = parse__(context);
              if (result14 !== null) {
                var result11 = [result12, result13, result14];
              } else {
                var result11 = null;
                pos = savedPos2;
              }
            } else {
              var result11 = null;
              pos = savedPos2;
            }
          } else {
            var result11 = null;
            pos = savedPos2;
          }
          var result10 = result11 !== null
            ? (function(int_, frac) { return parseFloat(int_ + frac);       })(result11[0], result11[1])
            : null;
          if (result10 !== null) {
            var result0 = result10;
          } else {
            var savedPos1 = pos;
            var result7 = parse_int(context);
            if (result7 !== null) {
              var result8 = parse_exp(context);
              if (result8 !== null) {
                var result9 = parse__(context);
                if (result9 !== null) {
                  var result6 = [result7, result8, result9];
                } else {
                  var result6 = null;
                  pos = savedPos1;
                }
              } else {
                var result6 = null;
                pos = savedPos1;
              }
            } else {
              var result6 = null;
              pos = savedPos1;
            }
            var result5 = result6 !== null
              ? (function(int_, exp) { return parseFloat(int_ + exp);        })(result6[0], result6[1])
              : null;
            if (result5 !== null) {
              var result0 = result5;
            } else {
              var savedPos0 = pos;
              var result3 = parse_int(context);
              if (result3 !== null) {
                var result4 = parse__(context);
                if (result4 !== null) {
                  var result2 = [result3, result4];
                } else {
                  var result2 = null;
                  pos = savedPos0;
                }
              } else {
                var result2 = null;
                pos = savedPos0;
              }
              var result1 = result2 !== null
                ? (function(int_) { return parseFloat(int_);              })(result2[0])
                : null;
              if (result1 !== null) {
                var result0 = result1;
              } else {
                var result0 = null;;
              };
            };
          };
        }
        context.reportMatchFailures = savedReportMatchFailures;
        if (context.reportMatchFailures && result0 === null) {
          matchFailed("number");
        }

        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_int(context) {
        var cacheKey = "int" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        var savedPos2 = pos;
        var result13 = parse_digit19(context);
        if (result13 !== null) {
          var result14 = parse_digits(context);
          if (result14 !== null) {
            var result12 = [result13, result14];
          } else {
            var result12 = null;
            pos = savedPos2;
          }
        } else {
          var result12 = null;
          pos = savedPos2;
        }
        var result11 = result12 !== null
          ? (function(digit19, digits) { return digit19 + digits;       })(result12[0], result12[1])
          : null;
        if (result11 !== null) {
          var result0 = result11;
        } else {
          var result10 = parse_digit(context);
          if (result10 !== null) {
            var result0 = result10;
          } else {
            var savedPos1 = pos;
            if (input.substr(pos, 1) === "-") {
              var result7 = "-";
              pos += 1;
            } else {
              var result7 = null;
              if (context.reportMatchFailures) {
                matchFailed(quoteString("-"));
              }
            }
            if (result7 !== null) {
              var result8 = parse_digit19(context);
              if (result8 !== null) {
                var result9 = parse_digits(context);
                if (result9 !== null) {
                  var result6 = [result7, result8, result9];
                } else {
                  var result6 = null;
                  pos = savedPos1;
                }
              } else {
                var result6 = null;
                pos = savedPos1;
              }
            } else {
              var result6 = null;
              pos = savedPos1;
            }
            var result5 = result6 !== null
              ? (function(digit19, digits) { return "-" + digit19 + digits; })(result6[1], result6[2])
              : null;
            if (result5 !== null) {
              var result0 = result5;
            } else {
              var savedPos0 = pos;
              if (input.substr(pos, 1) === "-") {
                var result3 = "-";
                pos += 1;
              } else {
                var result3 = null;
                if (context.reportMatchFailures) {
                  matchFailed(quoteString("-"));
                }
              }
              if (result3 !== null) {
                var result4 = parse_digit(context);
                if (result4 !== null) {
                  var result2 = [result3, result4];
                } else {
                  var result2 = null;
                  pos = savedPos0;
                }
              } else {
                var result2 = null;
                pos = savedPos0;
              }
              var result1 = result2 !== null
                ? (function(digit) { return "-" + digit;            })(result2[1])
                : null;
              if (result1 !== null) {
                var result0 = result1;
              } else {
                var result0 = null;;
              };
            };
          };
        }



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_frac(context) {
        var cacheKey = "frac" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        var savedPos0 = pos;
        if (input.substr(pos, 1) === ".") {
          var result2 = ".";
          pos += 1;
        } else {
          var result2 = null;
          if (context.reportMatchFailures) {
            matchFailed(quoteString("."));
          }
        }
        if (result2 !== null) {
          var result3 = parse_digits(context);
          if (result3 !== null) {
            var result1 = [result2, result3];
          } else {
            var result1 = null;
            pos = savedPos0;
          }
        } else {
          var result1 = null;
          pos = savedPos0;
        }
        var result0 = result1 !== null
          ? (function(digits) { return "." + digits; })(result1[1])
          : null;



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_exp(context) {
        var cacheKey = "exp" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        var savedPos0 = pos;
        var result2 = parse_e(context);
        if (result2 !== null) {
          var result3 = parse_digits(context);
          if (result3 !== null) {
            var result1 = [result2, result3];
          } else {
            var result1 = null;
            pos = savedPos0;
          }
        } else {
          var result1 = null;
          pos = savedPos0;
        }
        var result0 = result1 !== null
          ? (function(e, digits) { return e + digits; })(result1[0], result1[1])
          : null;



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_digits(context) {
        var cacheKey = "digits" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        var result2 = parse_digit(context);
        if (result2 !== null) {
          var result1 = [];
          while (result2 !== null) {
            result1.push(result2);
            var result2 = parse_digit(context);
          }
        } else {
          var result1 = null;
        }
        var result0 = result1 !== null
          ? (function(digits) { return digits.join(""); })(result1)
          : null;



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_e(context) {
        var cacheKey = "e" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        var savedPos0 = pos;
        if (input.substr(pos).match(/^[eE]/) !== null) {
          var result2 = input.charAt(pos);
          pos++;
        } else {
          var result2 = null;
          if (context.reportMatchFailures) {
            matchFailed("[eE]");
          }
        }
        if (result2 !== null) {
          if (input.substr(pos).match(/^[+\-]/) !== null) {
            var result4 = input.charAt(pos);
            pos++;
          } else {
            var result4 = null;
            if (context.reportMatchFailures) {
              matchFailed("[+\\-]");
            }
          }
          var result3 = result4 !== null ? result4 : '';
          if (result3 !== null) {
            var result1 = [result2, result3];
          } else {
            var result1 = null;
            pos = savedPos0;
          }
        } else {
          var result1 = null;
          pos = savedPos0;
        }
        var result0 = result1 !== null
          ? (function(e, sign) { return e + sign; })(result1[0], result1[1])
          : null;



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_digit(context) {
        var cacheKey = "digit" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        if (input.substr(pos).match(/^[0-9]/) !== null) {
          var result0 = input.charAt(pos);
          pos++;
        } else {
          var result0 = null;
          if (context.reportMatchFailures) {
            matchFailed("[0-9]");
          }
        }



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_digit19(context) {
        var cacheKey = "digit19" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        if (input.substr(pos).match(/^[1-9]/) !== null) {
          var result0 = input.charAt(pos);
          pos++;
        } else {
          var result0 = null;
          if (context.reportMatchFailures) {
            matchFailed("[1-9]");
          }
        }



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_hexDigit(context) {
        var cacheKey = "hexDigit" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        if (input.substr(pos).match(/^[0-9a-fA-F]/) !== null) {
          var result0 = input.charAt(pos);
          pos++;
        } else {
          var result0 = null;
          if (context.reportMatchFailures) {
            matchFailed("[0-9a-fA-F]");
          }
        }



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse__(context) {
        var cacheKey = "_" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }

        var savedReportMatchFailures = context.reportMatchFailures;
        context.reportMatchFailures = false;
        var result0 = [];
        var result1 = parse_whitespace(context);
        while (result1 !== null) {
          result0.push(result1);
          var result1 = parse_whitespace(context);
        }
        context.reportMatchFailures = savedReportMatchFailures;
        if (context.reportMatchFailures && result0 === null) {
          matchFailed("whitespace");
        }

        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function parse_whitespace(context) {
        var cacheKey = "whitespace" + '@' + pos;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = cachedResult.nextPos;
          return cachedResult.result;
        }


        if (input.substr(pos).match(/^[         \n\r]/) !== null) {
          var result0 = input.charAt(pos);
          pos++;
        } else {
          var result0 = null;
          if (context.reportMatchFailures) {
            matchFailed("[      \\n\\r]");
          }
        }



        cache[cacheKey] = {
          nextPos: pos,
          result:  result0
        };
        return result0;
      }

      function buildErrorMessage() {
        function buildExpected(failuresExpected) {
          switch (failuresExpected.length) {
            case 0:
              return 'end of input';
            case 1:
              return failuresExpected[0];
            default:
              failuresExpected.sort();
              return failuresExpected.slice(0, failuresExpected.length - 1).join(', ')
                + ' or '
                + failuresExpected[failuresExpected.length - 1];
          }
        }

        var expected = buildExpected(rightmostMatchFailuresExpected);
        var actualPos = Math.max(pos, rightmostMatchFailuresPos);
        var actual = actualPos < input.length
          ? quoteString(input.charAt(actualPos))
          : 'end of input';

        return 'Expected ' + expected + ' but ' + actual + ' found.';
      }

      function computeErrorPosition() {
        /*
         * The first idea was to use |String.split| to break the input up to the
         * error position along newlines and derive the line and column from
         * there. However IE's |split| implementation is so broken that it was
         * enough to prevent it.
         */

        var line = 1;
        var column = 1;
        var seenCR = false;

        for (var i = 0; i <  rightmostMatchFailuresPos; i++) {
          var ch = input.charAt(i);
          if (ch === '\n') {
            if (!seenCR) { line++; }
            column = 1;
            seenCR = false;
          } else if (ch === '\r' | ch === '\u2028' || ch === '\u2029') {
            line++;
            column = 1;
            seenCR = true;
          } else {
            column++;
            seenCR = false;
          }
        }

        return { line: line, column: column };
      }



      var result = parse_start({ reportMatchFailures: true });

      /*
       * The parser is now in one of the following three states:
       *
       * 1. The parser successfully parsed the whole input.
       *
       *    - |result !== null|
       *    - |pos === input.length|
       *    - |rightmostMatchFailuresExpected| may or may not contain something
       *
       * 2. The parser successfully parsed only a part of the input.
       *
       *    - |result !== null|
       *    - |pos < input.length|
       *    - |rightmostMatchFailuresExpected| may or may not contain something
       *
       * 3. The parser did not successfully parse any part of the input.
       *
       *   - |result === null|
       *   - |pos === 0|
       *   - |rightmostMatchFailuresExpected| contains at least one failure
       *
       * All code following this comment (including called functions) must
       * handle these states.
       */
      if (result === null || pos !== input.length) {
        var errorPosition = computeErrorPosition();
        throw new this.SyntaxError(
          buildErrorMessage(),
          errorPosition.line,
          errorPosition.column
        );
      }

      return result;
    },

    /* Returns the parser source code. */
    toSource: function() { return this._source; }
  };

  /* Thrown when a parser encounters a syntax error. */

  result.SyntaxError = function(message, line, column) {
    this.name = 'SyntaxError';
    this.message = message;
    this.line = line;
    this.column = column;
  };

  result.SyntaxError.prototype = Error.prototype;

  return result;
})();