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