Simon Zünd | aebbf4f | 2024-06-27 08:42:16 | [diff] [blame] | 1 | import { Line, Spec } from '../primitives.js'; |
| 2 | import { seedSpec } from '../util.js'; |
| 3 | import { Tokenizer } from './tokenizers/index.js'; |
Jack Franklin | fd72c07 | 2022-12-21 11:45:01 | [diff] [blame] | 4 | |
| 5 | export type Parser = (source: Line[]) => Spec; |
| 6 | |
| 7 | export interface Options { |
| 8 | tokenizers: Tokenizer[]; |
| 9 | } |
| 10 | |
| 11 | export default function getParser({ tokenizers }: Options): Parser { |
| 12 | return function parseSpec(source: Line[]): Spec { |
| 13 | let spec = seedSpec({ source }); |
| 14 | for (const tokenize of tokenizers) { |
| 15 | spec = tokenize(spec); |
| 16 | if (spec.problems[spec.problems.length - 1]?.critical) break; |
| 17 | } |
| 18 | return spec; |
| 19 | }; |
| 20 | } |