{
  "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"]
}
