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