UNPKG

mermaid

Version:

Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.

8 lines (7 loc) 7.09 kB
{ "version": 3, "sources": ["../../../src/diagrams/railroad/parser/pegParser.ts", "../../../src/diagrams/railroad/pegDiagram.ts"], "sourcesContent": ["import {\n MermaidParseError,\n createRailroadPegServices,\n type RailroadPeg,\n type PegAny,\n type PegGroup,\n type PegIdentifier,\n type PegLiteral,\n type PegOrderedChoice,\n type PegPrefix,\n type PegPrimary,\n type PegRule as LangiumPegRule,\n type PegSequence,\n type PegSuffix,\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 = createRailroadPegServices().RailroadPeg.parser.LangiumParser;\n\nconst transformOrderedChoice = (choice: PegOrderedChoice): 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: PegSequence): ASTNode => {\n const elements = sequence.elements.map(transformPrefix);\n\n if (elements.length === 1) {\n return elements[0];\n }\n\n return {\n type: 'sequence',\n elements,\n };\n};\n\nconst transformPrefix = (prefix: PegPrefix): ASTNode => {\n const inner = transformSuffix(prefix.suffix);\n\n if (!prefix.operator) {\n return inner;\n }\n\n // & and ! are lookahead operators - render as special nodes\n const label = prefix.operator === '&' ? `&${nodeToLabel(inner)}` : `!${nodeToLabel(inner)}`;\n return {\n type: 'special',\n text: label,\n };\n};\n\nconst nodeToLabel = (node: ASTNode): string => {\n switch (node.type) {\n case 'terminal':\n return `\"${node.value}\"`;\n case 'nonterminal':\n return node.name;\n case 'special':\n return node.text;\n default:\n return '(...)';\n }\n};\n\nconst transformSuffix = (suffix: PegSuffix): ASTNode => {\n const inner = transformPrimary(suffix.primary);\n\n if (!suffix.operator) {\n return inner;\n }\n\n switch (suffix.operator) {\n case '?':\n return { type: 'optional', element: inner };\n case '*':\n return { type: 'repetition', element: inner, min: 0, max: Infinity };\n case '+':\n return { type: 'repetition', element: inner, min: 1, max: Infinity };\n default:\n throw new Error(`Unsupported PEG suffix operator: ${suffix.operator}`);\n }\n};\n\nconst transformPrimary = (primary: PegPrimary): ASTNode => {\n switch (primary.$type) {\n case 'PegLiteral':\n return {\n type: 'terminal',\n value: (primary as PegLiteral).value,\n };\n case 'PegIdentifier':\n return {\n type: 'nonterminal',\n name: (primary as PegIdentifier).name,\n };\n case 'PegGroup':\n return transformOrderedChoice((primary as PegGroup).element);\n case 'PegAny':\n return {\n type: 'special',\n text: (primary as PegAny).dot,\n };\n default:\n throw new Error(`Unsupported PEG primary node: ${primary.$type}`);\n }\n};\n\nconst transformRule = (rule: LangiumPegRule): RailroadRule => {\n return {\n name: rule.name,\n definition: transformOrderedChoice(rule.definition),\n };\n};\n\nconst populateDb = (ast: RailroadPeg): 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('[PEG Parser] Starting Langium parse');\n\n const result = langiumParser.parse<RailroadPeg>(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('[PEG Parser] Parsed rules:', ast.rules.length);\n\n populateDb(ast);\n log.debug('[PEG 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/pegParser.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": ["langiumParser", "createRailroadPegServices", "transformOrderedChoice", "__name", "choice", "alternatives", "transformSequence", "sequence", "elements", "transformPrefix", "prefix", "inner", "transformSuffix", "nodeToLabel", "node", "suffix", "transformPrimary", "primary", "transformRule", "rule", "populateDb", "ast", "populateCommonDb", "db", "parser", "input", "log", "result", "MermaidParseError", "diagram", "parser", "db", "renderer", "getStyles"] }