{
  "version": 3,
  "sources": ["../../../src/diagrams/railroad/parser/abnfParser.ts", "../../../src/diagrams/railroad/abnfDiagram.ts"],
  "sourcesContent": ["import {\n  MermaidParseError,\n  createRailroadAbnfServices,\n  type RailroadAbnf,\n  type AbnfAlternation,\n  type AbnfConcatenation,\n  type AbnfElement,\n  type AbnfGroup,\n  type AbnfNumVal,\n  type AbnfOptionalGroup,\n  type AbnfPrimary,\n  type AbnfRule as LangiumAbnfRule,\n  type AbnfRuleName,\n  type AbnfStringLiteral,\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 = createRailroadAbnfServices().RailroadAbnf.parser.LangiumParser;\n\nconst transformAlternation = (alt: AbnfAlternation): ASTNode => {\n  const alternatives = alt.alternatives.map(transformConcatenation);\n\n  if (alternatives.length === 1) {\n    return alternatives[0];\n  }\n\n  return {\n    type: 'choice',\n    alternatives,\n  };\n};\n\nconst transformConcatenation = (concat: AbnfConcatenation): ASTNode => {\n  const elements = concat.elements.map(transformElement);\n\n  if (elements.length === 1) {\n    return elements[0];\n  }\n\n  return {\n    type: 'sequence',\n    elements,\n  };\n};\n\nconst parseRepeat = (repeat: string): { min: number; max: number } => {\n  if (repeat.includes('*')) {\n    const [minStr, maxStr] = repeat.split('*');\n    const min = minStr ? parseInt(minStr, 10) : 0;\n    const max = maxStr ? parseInt(maxStr, 10) : Infinity;\n    return { min, max };\n  }\n  // Exact repeat: \"3\" means exactly 3\n  const exact = parseInt(repeat, 10);\n  return { min: exact, max: exact };\n};\n\nconst transformElement = (element: AbnfElement): ASTNode => {\n  const inner = transformPrimary(element.primary);\n\n  if (!element.repeat) {\n    return inner;\n  }\n\n  const { min, max } = parseRepeat(element.repeat);\n\n  if (min === 0 && max === 1) {\n    return { type: 'optional', element: inner };\n  }\n\n  return {\n    type: 'repetition',\n    element: inner,\n    min,\n    max,\n  };\n};\n\nconst transformPrimary = (primary: AbnfPrimary): ASTNode => {\n  switch (primary.$type) {\n    case 'AbnfStringLiteral':\n      return {\n        type: 'terminal',\n        value: (primary as AbnfStringLiteral).value,\n      };\n    case 'AbnfNumVal':\n      return {\n        type: 'terminal',\n        value: (primary as AbnfNumVal).value,\n      };\n    case 'AbnfRuleName':\n      return {\n        type: 'nonterminal',\n        name: (primary as AbnfRuleName).name,\n      };\n    case 'AbnfGroup':\n      return transformAlternation((primary as AbnfGroup).element);\n    case 'AbnfOptionalGroup':\n      return {\n        type: 'optional',\n        element: transformAlternation((primary as AbnfOptionalGroup).element),\n      };\n    default:\n      throw new Error(`Unsupported ABNF primary node: ${primary.$type}`);\n  }\n};\n\nconst transformRule = (rule: LangiumAbnfRule): RailroadRule => {\n  return {\n    name: rule.name,\n    definition: transformAlternation(rule.definition),\n  };\n};\n\nconst populateDb = (ast: RailroadAbnf): 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('[ABNF Parser] Starting Langium parse');\n\n    const result = langiumParser.parse<RailroadAbnf>(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('[ABNF Parser] Parsed rules:', ast.rules.length);\n\n    populateDb(ast);\n    log.debug('[ABNF 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/abnfParser.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": "4uBAsBA,IAAMA,EAAgBC,EAA2B,EAAE,aAAa,OAAO,cAEjEC,EAAuBC,EAACC,GAAkC,CAC9D,IAAMC,EAAeD,EAAI,aAAa,IAAIE,CAAsB,EAEhE,OAAID,EAAa,SAAW,EACnBA,EAAa,CAAC,EAGhB,CACL,KAAM,SACN,aAAAA,CACF,CACF,EAX6B,wBAavBC,EAAyBH,EAACI,GAAuC,CACrE,IAAMC,EAAWD,EAAO,SAAS,IAAIE,CAAgB,EAErD,OAAID,EAAS,SAAW,EACfA,EAAS,CAAC,EAGZ,CACL,KAAM,WACN,SAAAA,CACF,CACF,EAX+B,0BAazBE,EAAcP,EAACQ,GAAiD,CACpE,GAAIA,EAAO,SAAS,GAAG,EAAG,CACxB,GAAM,CAACC,EAAQC,CAAM,EAAIF,EAAO,MAAM,GAAG,EACnCG,EAAMF,EAAS,SAASA,EAAQ,EAAE,EAAI,EACtCG,EAAMF,EAAS,SAASA,EAAQ,EAAE,EAAI,IAC5C,MAAO,CAAE,IAAAC,EAAK,IAAAC,CAAI,CACpB,CAEA,IAAMC,EAAQ,SAASL,EAAQ,EAAE,EACjC,MAAO,CAAE,IAAKK,EAAO,IAAKA,CAAM,CAClC,EAVoB,eAYdP,EAAmBN,EAACc,GAAkC,CAC1D,IAAMC,EAAQC,EAAiBF,EAAQ,OAAO,EAE9C,GAAI,CAACA,EAAQ,OACX,OAAOC,EAGT,GAAM,CAAE,IAAAJ,EAAK,IAAAC,CAAI,EAAIL,EAAYO,EAAQ,MAAM,EAE/C,OAAIH,IAAQ,GAAKC,IAAQ,EAChB,CAAE,KAAM,WAAY,QAASG,CAAM,EAGrC,CACL,KAAM,aACN,QAASA,EACT,IAAAJ,EACA,IAAAC,CACF,CACF,EAnByB,oBAqBnBI,EAAmBhB,EAACiB,GAAkC,CAC1D,OAAQA,EAAQ,MAAO,CACrB,IAAK,oBACH,MAAO,CACL,KAAM,WACN,MAAQA,EAA8B,KACxC,EACF,IAAK,aACH,MAAO,CACL,KAAM,WACN,MAAQA,EAAuB,KACjC,EACF,IAAK,eACH,MAAO,CACL,KAAM,cACN,KAAOA,EAAyB,IAClC,EACF,IAAK,YACH,OAAOlB,EAAsBkB,EAAsB,OAAO,EAC5D,IAAK,oBACH,MAAO,CACL,KAAM,WACN,QAASlB,EAAsBkB,EAA8B,OAAO,CACtE,EACF,QACE,MAAM,IAAI,MAAM,kCAAkCA,EAAQ,KAAK,EAAE,CACrE,CACF,EA3ByB,oBA6BnBC,EAAgBlB,EAACmB,IACd,CACL,KAAMA,EAAK,KACX,WAAYpB,EAAqBoB,EAAK,UAAU,CAClD,GAJoB,iBAOhBC,EAAapB,EAACqB,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,MAAOxB,EAACyB,GAAwB,CAC9BF,EAAG,MAAM,EACTG,EAAI,MAAM,sCAAsC,EAEhD,IAAMC,EAAS9B,EAAc,MAAoB4B,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,EC9IO,IAAMM,EAA6B,CACxC,OAAAC,EACA,GAAAC,EACA,SAAAC,EACA,OAAQC,CACV",
  "names": ["langiumParser", "createRailroadAbnfServices", "transformAlternation", "__name", "alt", "alternatives", "transformConcatenation", "concat", "elements", "transformElement", "parseRepeat", "repeat", "minStr", "maxStr", "min", "max", "exact", "element", "inner", "transformPrimary", "primary", "transformRule", "rule", "populateDb", "ast", "populateCommonDb", "db", "parser", "input", "log", "result", "MermaidParseError", "diagram", "parser", "db", "renderer", "getStyles"]
}
