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.35 kB
{ "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": "ivBAyBA,IAAMA,EAAgBC,EAA2B,EAAE,aAAa,OAAO,cAEjEC,EAAkBC,EAACC,GAAgC,CACvD,IAAMC,EAAeD,EAAO,aAAa,IAAIE,CAAiB,EAE9D,OAAID,EAAa,SAAW,EACnBA,EAAa,CAAC,EAGhB,CACL,KAAM,SACN,aAAAA,CACF,CACF,EAXwB,mBAalBC,EAAoBH,EAACI,GAAoC,CAC7D,IAAMC,EAAWD,EAAS,SAAS,IAAIE,CAAa,EAEpD,OAAID,EAAS,SAAW,EACfA,EAAS,CAAC,EAGZ,CACL,KAAM,WACN,SAAAA,CACF,CACF,EAX0B,qBAapBE,EAAmBP,EAACQ,GAAkC,CAC1D,OAAQA,EAAQ,MAAO,CACrB,IAAK,eACH,MAAO,CACL,KAAM,WACN,MAAQA,EAAyB,KACnC,EACF,IAAK,kBACH,MAAO,CACL,KAAM,cACN,KAAOA,EAA4B,IACrC,EACF,IAAK,cACH,MAAO,CACL,KAAM,UACN,KAAOA,EAAwB,IACjC,EACF,IAAK,YACH,OAAOT,EAAiBS,EAAsB,OAAO,EACvD,IAAK,eACH,MAAO,CACL,KAAM,WACN,QAAST,EAAiBS,EAAyB,OAAO,CAC5D,EACF,IAAK,iBACH,MAAO,CACL,KAAM,aACN,QAAST,EAAiBS,EAA2B,OAAO,EAC5D,IAAK,EACL,IAAK,GACP,EACF,QACE,MAAM,IAAI,MAAM,kCAAkCA,EAAQ,KAAK,EAAE,CACrE,CACF,EAlCyB,oBAoCnBC,EAAmBT,EAAA,CAACU,EAAeC,IAAkC,CACzE,OAAQA,EAAQ,MAAO,CACrB,IAAK,sBACH,MAAO,CACL,KAAM,WACN,QAASD,CACX,EACF,IAAK,wBACH,MAAO,CACL,KAAM,aACN,QAASA,EACT,IAAK,EACL,IAAK,GACP,EACF,IAAK,uBACH,MAAO,CACL,KAAM,aACN,QAASA,EACT,IAAK,EACL,IAAK,GACP,EACF,IAAK,uBACH,MAAO,CACL,KAAM,WACN,SAAU,CACRA,EACA,CAAE,KAAM,WAAY,MAAO,GAAI,EAC/BH,EAAkBI,EAAiC,MAAM,CAC3D,CACF,EACF,QACE,MAAM,IAAI,MAAM,kCAAkCA,EAAQ,KAAK,EAAE,CACrE,CACF,EAjCyB,oBAmCnBL,EAAgBN,EAACY,GACdA,EAAK,UAAU,OAAO,CAACC,EAAaF,IAClCF,EAAiBI,EAAaF,CAAO,EAC3CJ,EAAiBK,EAAK,IAAI,CAAC,EAHV,iBAMhBE,EAAgBd,EAACe,IACd,CACL,KAAMA,EAAK,KACX,WAAYhB,EAAgBgB,EAAK,UAAU,CAC7C,GAJoB,iBAOhBC,EAAahB,EAACiB,GAA4B,CAC9CC,EAAiBD,EAAKE,CAAE,EAEpBF,EAAI,OACNE,EAAG,SAASF,EAAI,KAAK,EAGvBA,EAAI,MAAM,IAAKF,GAASI,EAAG,QAAQL,EAAcC,CAAI,CAAC,CAAC,CACzD,EARmB,cAUNK,EAA2B,CACtC,MAAOpB,EAACqB,GAAwB,CAC9BF,EAAG,MAAM,EACTG,EAAI,MAAM,sCAAsC,EAEhD,IAAMC,EAAS1B,EAAc,MAAoBwB,CAAK,EACtD,GAAIE,EAAO,YAAY,OAAS,GAAKA,EAAO,aAAa,OAAS,EAChE,MAAM,IAAIC,EAAkBD,CAAM,EAGpC,IAAMN,EAAMM,EAAO,MACnBD,EAAI,MAAM,8BAA+BL,EAAI,MAAM,MAAM,EAEzDD,EAAWC,CAAG,EACdK,EAAI,MAAM,8BAA8B,CAC1C,EAdO,SAeP,OAAQ,CACN,GAAIH,CACN,CACF,EChKO,IAAMM,EAA6B,CACxC,OAAAC,EACA,GAAAC,EACA,SAAAC,EACA,OAAQC,CACV", "names": ["langiumParser", "createRailroadEbnfServices", "transformChoice", "__name", "choice", "alternatives", "transformSequence", "sequence", "elements", "transformTerm", "transformPrimary", "primary", "transformPostfix", "node", "postfix", "term", "currentNode", "transformRule", "rule", "populateDb", "ast", "populateCommonDb", "db", "parser", "input", "log", "result", "MermaidParseError", "diagram", "parser", "db", "renderer", "getStyles"] }