import type { GrammarRule, KeywordBlock } from "#types/grammar.types"; import { LINE_BREAK } from "#configuration/constants/code.constants"; import { ONTOLOGY } from "#core/assets/ontology.generated"; const HEADING = "# "; const GAP = "\n\n"; const PRODUCES = " ::= "; const OPEN = "<"; const CLOSE = ">"; export const joinRules = function joinRules(rules: readonly GrammarRule[]): string { return rules.map((rule) => HEADING + rule.title + LINE_BREAK + rule.grammar).join(GAP); }; export const keywordsOf = function keywordsOf(category: string): KeywordBlock { const group = ONTOLOGY.grammar.categories.find((entry) => entry.category === category); return { keywords: (group?.keywords ?? []).map((keyword) => ({ description: keyword.meaning, example: keyword.example, name: keyword.name, })), kind: "keyword", }; }; export const productionsOf = function productionsOf(group: string, title: string): GrammarRule { const found = ONTOLOGY.grammar.groups.find((entry) => entry.group === group); return { grammar: (found?.productions ?? []) .map((production) => OPEN + production.lhs + CLOSE + PRODUCES + production.rhs) .join(LINE_BREAK), title, }; }; export const templateBodyOf = function templateBodyOf(type: string): string { return ONTOLOGY.grammar.templates.find((template) => template.type === type)?.body ?? ""; }; export const templateConstraintsOf = function templateConstraintsOf(type: string): readonly string[] { return ONTOLOGY.grammar.templates.find((template) => template.type === type)?.constraints ?? []; };