tell-me-when
Version:
human relative date and time parser
1 lines • 15.1 kB
Source Map (JSON)
{"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","token","RegExp","RegExpNode","StringTokenNode","group","sequence","GroupNode","undefined","named","name","negativeLookahead","NegativeLookaheadNode","length","constructor","ref","parse","state","toLowerCase","start","index","testLowerCase","error","sticky","source","flags","testRegex","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 : GrammarNode.token(factor)\n }\n\n /**\n * Matches the given string or regular expression\n */\n static token(token: string | RegExp) {\n return token instanceof RegExp\n ? new RegExpNode(token)\n : new StringTokenNode(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 StringTokenNode extends GrammarNode {\n constructor(public token: string) {\n super()\n this.token = this.token.toLowerCase()\n }\n\n parse(state: ParseState): ParseNode {\n const start = state.index\n if (state.testLowerCase(this.token)) {\n return new ParseNode(undefined, start, state.index)\n }\n return ParseNode.error(start)\n }\n}\n\nexport class RegExpNode extends GrammarNode {\n constructor(public token: RegExp) {\n super()\n if (!token.sticky) {\n this.token = new RegExp(token.source, `${token.flags}y`)\n }\n }\n\n parse(state: ParseState): ParseNode {\n const start = state.index\n if (state.testRegex(this.token)) {\n return new ParseNode(undefined, start, state.index)\n }\n return ParseNode.error(start)\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":[]}