{"version":3,"file":"GrammarNode.mjs","names":["ParseNode","GrammarNode","parseAs","ParseAsNode","maybe","MaybeNode","or","alternate","OrNode","oneOf","options","map","toGrammarNode","longestOf","LongestOfNode","repeat","countOrMin","max","RepeatNode","factor","GrammarNodeRef","TokenNode","token","group","sequence","GroupNode","undefined","named","name","negativeLookahead","NegativeLookaheadNode","length","constructor","ref","parse","state","match","index","error","node","parsed","isError","empty","count","startIndex","children","i","Array","isArray","isEmpty","push","option","best","to","end","factors","parseAsClass"],"sources":["../../src/util/GrammarNode.ts"],"sourcesContent":["import { ParseNode } from './ParseNode'\nimport { ParseState } from './ParseState'\n\nexport abstract class GrammarNode {\n  abstract parse(state: ParseState): ParseNode\n\n  parseAs(parseAs: new (node: ParseNode) => ParseNode) {\n    return new ParseAsNode(this, parseAs)\n  }\n\n  /**\n   * Matches this node once or zero times\n   */\n  maybe() {\n    return new MaybeNode(this)\n  }\n\n  /**\n   * Matches this node or the alternate node\n   */\n  or(alternate: GrammarNode) {\n    return new OrNode(this, alternate)\n  }\n\n  /**\n   * Matches one of the given nodes.  The first option to parse successfully wins\n   */\n  static oneOf(\n    ...options: (string | RegExp | GrammarNode | (() => GrammarNode))[]\n  ) {\n    return new OrNode(...options.map(GrammarNode.toGrammarNode))\n  }\n\n  /**\n   * Matches one of the given nodes.  Tries all of the options, and the one that\n   * successfully parses the farthest in the input wins\n   */\n  static longestOf(\n    ...options: (string | RegExp | GrammarNode | (() => GrammarNode))[]\n  ) {\n    return new LongestOfNode(...options.map(GrammarNode.toGrammarNode))\n  }\n\n  /**\n   * Matches this node repeated the given number of times\n   */\n  repeat(count: number): RepeatNode\n  /**\n   * Matches this node repeated between min and max (inclusive) times\n   */\n  repeat(min: number, max: number): RepeatNode\n  repeat(countOrMin: number, max?: number): RepeatNode {\n    return new RepeatNode(this, max != null ? [countOrMin, max] : countOrMin)\n  }\n\n  static toGrammarNode(\n    factor: string | RegExp | GrammarNode | (() => GrammarNode)\n  ) {\n    return typeof factor === 'function'\n      ? new GrammarNodeRef(factor)\n      : factor instanceof GrammarNode\n      ? factor\n      : new TokenNode(factor)\n  }\n\n  /**\n   * Matches the given string or regular expression\n   */\n  static token(token: string | RegExp) {\n    return new TokenNode(token)\n  }\n\n  /**\n   * Matches the given nodes in sequence\n   */\n  static group(\n    ...sequence: (string | RegExp | GrammarNode | (() => GrammarNode))[]\n  ) {\n    return new GroupNode(undefined, ...sequence.map(GrammarNode.toGrammarNode))\n  }\n\n  /**\n   * Creates a named group that matches the given nodes in sequence.\n   * Same as {@link group} but the {@link ParseNode} returned by {@link parse}\n   * will have the given name.\n   */\n  static named(\n    name: string,\n    ...sequence: (string | RegExp | GrammarNode | (() => GrammarNode))[]\n  ) {\n    return new GroupNode(name, ...sequence.map(GrammarNode.toGrammarNode))\n  }\n\n  static negativeLookahead(\n    ...sequence: (string | RegExp | GrammarNode | (() => GrammarNode))[]\n  ) {\n    return new NegativeLookaheadNode(\n      sequence.length === 1\n        ? GrammarNode.toGrammarNode(sequence[0])\n        : GrammarNode.group(...sequence)\n    )\n  }\n}\n\nexport class GrammarNodeRef extends GrammarNode {\n  constructor(public ref: () => GrammarNode) {\n    super()\n  }\n\n  parse(state: ParseState): ParseNode {\n    return this.ref().parse(state)\n  }\n}\n\nexport class TokenNode extends GrammarNode {\n  constructor(public token: string | RegExp) {\n    super()\n  }\n\n  parse(state: ParseState): ParseNode {\n    const match = state.match(this.token)\n    if (match) {\n      state.index = match.index + match[0].length\n      return new ParseNode(undefined, match.index, state.index)\n    }\n    return ParseNode.error(state.index)\n  }\n}\n\nexport class MaybeNode extends GrammarNode {\n  constructor(public node: GrammarNode) {\n    super()\n  }\n\n  parse(state: ParseState): ParseNode {\n    const parsed = this.node.parse(state)\n    return parsed.isError ? ParseNode.empty(state.index) : parsed\n  }\n}\n\nexport class RepeatNode extends GrammarNode {\n  constructor(\n    public node: GrammarNode,\n    public count: number | [number, number]\n  ) {\n    super()\n  }\n\n  parse(state: ParseState): ParseNode {\n    const startIndex = state.index\n    const children: ParseNode[] = []\n    for (\n      let i = 0;\n      i < (Array.isArray(this.count) ? this.count[1] : this.count);\n      i++\n    ) {\n      const parsed = this.node.parse(state)\n      if (parsed.isError) {\n        if (i < (Array.isArray(this.count) ? this.count[0] : this.count)) {\n          state.index = startIndex\n          return parsed\n        }\n        break\n      }\n      if (!parsed.isEmpty) children.push(parsed)\n    }\n    return new ParseNode(undefined, startIndex, state.index, children)\n  }\n}\n\nexport class OrNode extends GrammarNode {\n  public options: GrammarNode[]\n  constructor(...options: GrammarNode[]) {\n    super()\n    this.options = options\n  }\n\n  parse(state: ParseState): ParseNode {\n    const startIndex = state.index\n    for (const option of this.options) {\n      const parsed = option.parse(state)\n      if (!parsed.isError) return parsed\n    }\n    state.index = startIndex\n    return ParseNode.error(startIndex)\n  }\n}\n\nexport class LongestOfNode extends GrammarNode {\n  public options: GrammarNode[]\n  constructor(...options: GrammarNode[]) {\n    super()\n    this.options = options\n  }\n\n  parse(state: ParseState): ParseNode {\n    const startIndex = state.index\n    let best: ParseNode = ParseNode.error(startIndex)\n    for (const option of this.options) {\n      state.index = startIndex\n      const parsed = option.parse(state)\n      if (!parsed.isError && (best.isError || parsed.to > best.to)) {\n        best = parsed\n        if (parsed.to === state.end) break\n      }\n    }\n    state.index = best.isError ? startIndex : best.to\n    return best as any\n  }\n}\n\nexport class GroupNode extends GrammarNode {\n  public factors: GrammarNode[]\n\n  constructor(public name: string | undefined, ...factors: GrammarNode[]) {\n    super()\n    this.factors = factors\n  }\n\n  parse(state: ParseState): ParseNode {\n    const startIndex = state.index\n    const children: ParseNode[] = []\n    for (const factor of this.factors) {\n      const parsed = factor.parse(state)\n      if (parsed.isError) {\n        state.index = startIndex\n        return parsed\n      }\n      if (!parsed.isEmpty) children.push(parsed)\n    }\n    return new ParseNode(this.name, startIndex, state.index, children)\n  }\n}\n\nexport class NegativeLookaheadNode extends GrammarNode {\n  constructor(public node: GrammarNode) {\n    super()\n  }\n\n  parse(state: ParseState): ParseNode {\n    const { index } = state\n    const parsed = this.node.parse(state)\n    if (!parsed.isError) return ParseNode.error(index)\n    state.index = index\n    return ParseNode.empty(index)\n  }\n}\n\nexport class ParseAsNode extends GrammarNode {\n  constructor(\n    public node: { parse: (state: ParseState) => ParseNode },\n    private parseAsClass: new (node: ParseNode) => ParseNode\n  ) {\n    super()\n  }\n\n  parse(state: ParseState): ParseNode {\n    const parsed = this.node.parse(state)\n    if (parsed.isError) return parsed\n    return new this.parseAsClass(parsed)\n  }\n}\n"],"mappings":"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","ignoreList":[]}