mermaid
Version:
Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.
8 lines (7 loc) • 7.38 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/diagrams/railroad/parser/ebnfParser.ts", "../../../src/diagrams/railroad/ebnfDiagram.ts"],
"sourcesContent": ["import {\n MermaidParseError,\n createRailroadEbnfServices,\n type RailroadEbnf,\n type EbnfChoice,\n type EbnfExceptionPostfix,\n type EbnfGroup,\n type EbnfNonTerminal,\n type EbnfOptional,\n type EbnfPostfix,\n type EbnfPrimary,\n type EbnfRepetition,\n type EbnfRule as LangiumEbnfRule,\n type EbnfSequence,\n type EbnfSpecial,\n type EbnfTerm,\n type EbnfTerminal,\n} from '@mermaid-js/parser';\n\nimport type { ParserDefinition } from '../../../diagram-api/types.js';\nimport { log } from '../../../logger.js';\nimport { populateCommonDb } from '../../common/populateCommonDb.js';\nimport { db } from '../railroadDb.js';\nimport type { ASTNode, RailroadRule } from '../railroadTypes.js';\n\nconst langiumParser = createRailroadEbnfServices().RailroadEbnf.parser.LangiumParser;\n\nconst transformChoice = (choice: EbnfChoice): ASTNode => {\n const alternatives = choice.alternatives.map(transformSequence);\n\n if (alternatives.length === 1) {\n return alternatives[0];\n }\n\n return {\n type: 'choice',\n alternatives,\n };\n};\n\nconst transformSequence = (sequence: EbnfSequence): ASTNode => {\n const elements = sequence.elements.map(transformTerm);\n\n if (elements.length === 1) {\n return elements[0];\n }\n\n return {\n type: 'sequence',\n elements,\n };\n};\n\nconst transformPrimary = (primary: EbnfPrimary): ASTNode => {\n switch (primary.$type) {\n case 'EbnfTerminal':\n return {\n type: 'terminal',\n value: (primary as EbnfTerminal).value,\n };\n case 'EbnfNonTerminal':\n return {\n type: 'nonterminal',\n name: (primary as EbnfNonTerminal).name,\n };\n case 'EbnfSpecial':\n return {\n type: 'special',\n text: (primary as EbnfSpecial).text,\n };\n case 'EbnfGroup':\n return transformChoice((primary as EbnfGroup).element);\n case 'EbnfOptional':\n return {\n type: 'optional',\n element: transformChoice((primary as EbnfOptional).element),\n };\n case 'EbnfRepetition':\n return {\n type: 'repetition',\n element: transformChoice((primary as EbnfRepetition).element),\n min: 0,\n max: Infinity,\n };\n default:\n throw new Error(`Unsupported EBNF primary node: ${primary.$type}`);\n }\n};\n\nconst transformPostfix = (node: ASTNode, postfix: EbnfPostfix): ASTNode => {\n switch (postfix.$type) {\n case 'EbnfOptionalPostfix':\n return {\n type: 'optional',\n element: node,\n };\n case 'EbnfZeroOrMorePostfix':\n return {\n type: 'repetition',\n element: node,\n min: 0,\n max: Infinity,\n };\n case 'EbnfOneOrMorePostfix':\n return {\n type: 'repetition',\n element: node,\n min: 1,\n max: Infinity,\n };\n case 'EbnfExceptionPostfix':\n return {\n type: 'sequence',\n elements: [\n node,\n { type: 'terminal', value: '-' },\n transformPrimary((postfix as EbnfExceptionPostfix).except),\n ],\n };\n default:\n throw new Error(`Unsupported EBNF postfix node: ${postfix.$type}`);\n }\n};\n\nconst transformTerm = (term: EbnfTerm): ASTNode => {\n return term.postfixes.reduce((currentNode, postfix) => {\n return transformPostfix(currentNode, postfix);\n }, transformPrimary(term.base));\n};\n\nconst transformRule = (rule: LangiumEbnfRule): RailroadRule => {\n return {\n name: rule.name,\n definition: transformChoice(rule.definition),\n };\n};\n\nconst populateDb = (ast: RailroadEbnf): void => {\n populateCommonDb(ast, db);\n\n if (ast.title) {\n db.setTitle(ast.title);\n }\n\n ast.rules.map((rule) => db.addRule(transformRule(rule)));\n};\n\nexport const parser: ParserDefinition = {\n parse: (input: string): void => {\n db.clear();\n log.debug('[EBNF Parser] Starting Langium parse');\n\n const result = langiumParser.parse<RailroadEbnf>(input);\n if (result.lexerErrors.length > 0 || result.parserErrors.length > 0) {\n throw new MermaidParseError(result);\n }\n\n const ast = result.value;\n log.debug('[EBNF Parser] Parsed rules:', ast.rules.length);\n\n populateDb(ast);\n log.debug('[EBNF Parser] Parse complete');\n },\n parser: {\n yy: db,\n },\n};\n\nexport default parser;\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\nimport { parser } from './parser/ebnfParser.js';\nimport { db } from './railroadDb.js';\nimport { renderer } from './railroadRenderer.js';\nimport { getStyles } from './styles.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n db,\n renderer,\n styles: getStyles,\n};\n"],
"mappings": "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",
"names": []
}