{
  "version": 3,
  "sources": ["../../../src/parser/grammar.ts"],
  "sourcesContent": [
    "/**\n * Grammar rules and operator precedence for formula parsing\n */\n\nimport type { BinaryOpNode } from \"./ast.cjs\";\n\n/**\n * Operator precedence levels (higher number = higher precedence)\n */\nexport const OPERATOR_PRECEDENCE: Record<string, number> = {\n  // Comparison operators (lowest precedence)\n  \"=\": 1,\n  \"<>\": 1,\n  \"<\": 1,\n  \">\": 1,\n  \"<=\": 1,\n  \">=\": 1,\n\n  // Concatenation\n  \"&\": 2,\n\n  // Addition and subtraction\n  \"+\": 3,\n  \"-\": 3,\n\n  // Multiplication and division\n  \"*\": 4,\n  \"/\": 4,\n\n  // Exponentiation (highest precedence)\n  \"^\": 5,\n};\n\n/**\n * Operator associativity\n */\ntype Associativity = \"left\" | \"right\";\n\nexport const OPERATOR_ASSOCIATIVITY: Record<string, Associativity> = {\n  \"=\": \"left\",\n  \"<>\": \"left\",\n  \"<\": \"left\",\n  \">\": \"left\",\n  \"<=\": \"left\",\n  \">=\": \"left\",\n  \"&\": \"left\",\n  \"+\": \"left\",\n  \"-\": \"left\",\n  \"*\": \"left\",\n  \"/\": \"left\",\n  \"^\": \"right\", // Exponentiation is right-associative\n};\n\n/**\n * Check if a string is a valid binary operator\n */\nexport function isBinaryOperator(op: string): op is BinaryOpNode[\"operator\"] {\n  return op in OPERATOR_PRECEDENCE;\n}\n\n/**\n * Get operator precedence\n */\nexport function getOperatorPrecedence(op: string): number {\n  return OPERATOR_PRECEDENCE[op] || 0;\n}\n\n/**\n * Get operator associativity\n */\nexport function getOperatorAssociativity(op: string): Associativity {\n  return OPERATOR_ASSOCIATIVITY[op] || \"left\";\n}\n\n/**\n * Compare operator precedence\n * Returns:\n *  - positive if op1 has higher precedence than op2\n *  - negative if op1 has lower precedence than op2\n *  - 0 if they have the same precedence\n */\nexport function compareOperatorPrecedence(op1: string, op2: string): number {\n  return getOperatorPrecedence(op1) - getOperatorPrecedence(op2);\n}\n\n/**\n * Built-in function names that don't require parentheses in some contexts\n */\nexport const SPECIAL_FUNCTIONS = new Set([\n  \"PI\", // PI() can be written as PI\n  \"TRUE\", // TRUE() can be written as TRUE\n  \"FALSE\", // FALSE() can be written as FALSE\n  \"NA\", // NA() can be written as NA\n]);\n\n/**\n * Special constants\n */\nexport const SPECIAL_CONSTANTS = new Set([\n  \"INFINITY\", // Infinity literal\n]);\n\n/**\n * Functions that accept variable number of arguments\n */\nexport const VARIADIC_FUNCTIONS = new Set([\n  \"SUM\",\n  \"PRODUCT\",\n  \"COUNT\",\n  \"MAX\",\n  \"MIN\",\n  \"AND\",\n  \"OR\",\n  \"XOR\",\n  \"CONCATENATE\",\n  \"CHOOSE\",\n  \"IFS\",\n  \"SWITCH\",\n]);\n\n/**\n * Functions that require at least one argument\n */\nexport const REQUIRED_ARG_FUNCTIONS = new Set([\n  \"SUM\",\n  \"PRODUCT\",\n  \"COUNT\",\n  \"MAX\",\n  \"MIN\",\n  \"AVERAGE\",\n  \"MEDIAN\",\n  \"STDEV\",\n  \"VAR\",\n  \"AND\",\n  \"OR\",\n  \"XOR\",\n  \"CONCATENATE\",\n]);\n\n/**\n * Reserved keywords that cannot be used as names\n */\nexport const RESERVED_KEYWORDS = new Set([\n  \"TRUE\",\n  \"FALSE\",\n  \"NULL\",\n  \"DIV\",\n  \"MOD\",\n  \"AND\",\n  \"OR\",\n  \"NOT\",\n  \"XOR\",\n]);\n\n/**\n * Check if a name is a reserved keyword\n */\nexport function isReservedKeyword(name: string): boolean {\n  return RESERVED_KEYWORDS.has(name.toUpperCase());\n}\n\n/**\n * Grammar production rules (in BNF-like notation):\n *\n * Formula ::= Expression\n *\n * Expression ::= ComparisonExpr\n *\n * ComparisonExpr ::= ConcatExpr (ComparisonOp ConcatExpr)*\n * ComparisonOp ::= '=' | '<>' | '<' | '>' | '<=' | '>='\n *\n * ConcatExpr ::= AddExpr ('&' AddExpr)*\n *\n * AddExpr ::= MultExpr (AddOp MultExpr)*\n * AddOp ::= '+' | '-'\n *\n * MultExpr ::= PowerExpr (MultOp PowerExpr)*\n * MultOp ::= '*' | '/'\n *\n * PowerExpr ::= UnaryExpr ('^' PowerExpr)?  // Right associative\n *\n * UnaryExpr ::= UnaryOp UnaryExpr | PostfixExpr\n * UnaryOp ::= '+' | '-'\n *\n * PostfixExpr ::= PrimaryExpr ('%')?\n *\n * PrimaryExpr ::= Number\n *              | String\n *              | Boolean\n *              | Error\n *              | CellReference\n *              | RangeReference\n *              | NamedExpression\n *              | FunctionCall\n *              | ArrayLiteral\n *              | '(' Expression ')'\n *\n * CellReference ::= (SheetName '!')? AbsoluteIndicator? Column AbsoluteIndicator? Row\n * RangeReference ::= CellReference ':' CellReference\n *\n * SheetName ::= Identifier | '\\'' AnyCharsExceptQuote '\\''\n * AbsoluteIndicator ::= '$'\n *\n * NamedExpression ::= Identifier  // Not followed by '(' or ':'\n *\n * FunctionCall ::= FunctionName '(' ArgumentList? ')'\n * ArgumentList ::= Expression (',' Expression)*\n *\n * ArrayLiteral ::= '{' ArrayRows '}'\n * ArrayRows ::= ArrayRow (';' ArrayRow)*\n * ArrayRow ::= Expression (',' Expression)*\n *\n * Number ::= [+-]? [0-9]+ ('.' [0-9]+)? ([eE] [+-]? [0-9]+)?\n * String ::= '\"' (AnyCharExceptQuote | '\"\"')* '\"'\n * Boolean ::= 'TRUE' | 'FALSE'\n * Error ::= '#DIV/0!' | '#N/A' | '#NAME?' | '#NUM!' | '#REF!' | '#VALUE!' | '#CYCLE!' | '#ERROR!'\n * Identifier ::= [A-Za-z_][A-Za-z0-9_]*\n * FunctionName ::= Identifier\n */\n\n/**\n * Cell reference patterns\n */\nexport const CELL_REFERENCE_PATTERNS = {\n  // Column patterns\n  COLUMN: /^[A-Z]+$/i,\n  COLUMN_WITH_ABSOLUTE: /^\\$?[A-Z]+$/i,\n\n  // Row patterns\n  ROW: /^[1-9][0-9]*$/,\n  ROW_WITH_ABSOLUTE: /^\\$?[1-9][0-9]*$/,\n\n  // Full cell reference (e.g., A1, $A$1)\n  CELL: /^(\\$)?([A-Z]+)(\\$)?([1-9][0-9]*)$/i,\n\n  // Sheet qualified reference (e.g., Sheet1!A1, 'My Sheet'!$A$1)\n  SHEET_QUALIFIED: /^(?:([A-Za-z_][A-Za-z0-9_]*)|'([^']+)')!(.+)$/,\n\n  // 3D range sheet reference (e.g., Sheet1:Sheet5!A1)\n  SHEET_RANGE_QUALIFIED:\n    /^(?:(?:([A-Za-z_][A-Za-z0-9_]*)|'([^']+)'):(?:([A-Za-z_][A-Za-z0-9_]*)|'([^']+)'))!(.+)$/,\n\n  // Infinite column range (e.g., A:A, $B:$B)\n  INFINITE_COLUMN: /^(\\$)?([A-Z]+):(\\$)?([A-Z]+)$/i,\n\n  // Infinite row range (e.g., 5:5, $10:$10)\n  INFINITE_ROW: /^(\\$)?([1-9][0-9]*):(\\$)?([1-9][0-9]*)$/i,\n\n  // Open-ended range patterns\n  // A5:INFINITY (both row and column unbounded)\n  OPEN_ENDED_INFINITY: /^(\\$)?([A-Z]+)(\\$)?([1-9][0-9]*):INFINITY$/i,\n  \n  // A5:D (open down only - bounded columns, unbounded rows)\n  OPEN_ENDED_COLUMN: /^(\\$)?([A-Z]+)(\\$)?([1-9][0-9]*):(\\$)?([A-Z]+)$/i,\n  \n  // A5:15 (open right only - bounded rows, unbounded columns)\n  OPEN_ENDED_ROW: /^(\\$)?([A-Z]+)(\\$)?([1-9][0-9]*):(\\$)?([1-9][0-9]*)$/i,\n\n  // Structured reference patterns\n  TABLE_REFERENCE: /^([A-Za-z_][A-Za-z0-9_]*)\\[(.+)\\]$/,\n  CURRENT_ROW_REFERENCE: /^@([A-Za-z_][A-Za-z0-9_]*)$/,\n  TABLE_SELECTOR: /^#(All|Data|Headers)$/i,\n};\n\n/**\n * Validate a column reference\n */\nexport function isValidColumn(col: string): boolean {\n  return CELL_REFERENCE_PATTERNS.COLUMN.test(col);\n}\n\n/**\n * Validate a row reference\n */\nexport function isValidRow(row: string): boolean {\n  return CELL_REFERENCE_PATTERNS.ROW.test(row);\n}\n\n/**\n * Parse a cell reference into components\n */\ninterface ParsedCellReference {\n  sheet?: string;\n  colAbsolute: boolean;\n  col: string;\n  rowAbsolute: boolean;\n  row: string;\n}\n\ninterface ParsedInfiniteRange {\n  sheet?: string;\n  type: \"column\" | \"row\";\n  startAbsolute: boolean;\n  start: string;\n  endAbsolute: boolean;\n  end: string;\n}\n\nexport function parseCellReference(ref: string): ParsedCellReference | null {\n  // Check for sheet qualifier\n  const sheetMatch = ref.match(CELL_REFERENCE_PATTERNS.SHEET_QUALIFIED);\n  let sheet: string | undefined;\n  let cellPart: string;\n\n  if (sheetMatch && sheetMatch[3]) {\n    sheet = sheetMatch[1] || sheetMatch[2]; // Either unquoted or quoted sheet name\n    cellPart = sheetMatch[3];\n  } else {\n    cellPart = ref;\n  }\n\n  // Parse cell part\n  const cellMatch = cellPart.match(CELL_REFERENCE_PATTERNS.CELL);\n  if (!cellMatch || !cellMatch[2] || !cellMatch[4]) {\n    return null;\n  }\n\n  return {\n    sheet,\n    colAbsolute: cellMatch[1] === \"$\",\n    col: cellMatch[2].toUpperCase(),\n    rowAbsolute: cellMatch[3] === \"$\",\n    row: cellMatch[4],\n  };\n}\n\nexport function parseInfiniteRange(ref: string): ParsedInfiniteRange | null {\n  // Check for sheet qualifier\n  const sheetMatch = ref.match(CELL_REFERENCE_PATTERNS.SHEET_QUALIFIED);\n  let sheet: string | undefined;\n  let rangePart: string;\n\n  if (sheetMatch && sheetMatch[3]) {\n    sheet = sheetMatch[1] || sheetMatch[2]; // Either unquoted or quoted sheet name\n    rangePart = sheetMatch[3];\n  } else {\n    rangePart = ref;\n  }\n\n  // Check for infinite column range (e.g., A:A, B:C)\n  const colMatch = rangePart.match(CELL_REFERENCE_PATTERNS.INFINITE_COLUMN);\n  if (colMatch && colMatch[2] && colMatch[4]) {\n    return {\n      sheet,\n      type: \"column\",\n      startAbsolute: colMatch[1] === \"$\",\n      start: colMatch[2].toUpperCase(),\n      endAbsolute: colMatch[3] === \"$\",\n      end: colMatch[4].toUpperCase(),\n    };\n  }\n\n  // Check for infinite row range (e.g., 5:5, 1:10)\n  const rowMatch = rangePart.match(CELL_REFERENCE_PATTERNS.INFINITE_ROW);\n  if (rowMatch && rowMatch[2] && rowMatch[4]) {\n    return {\n      sheet,\n      type: \"row\",\n      startAbsolute: rowMatch[1] === \"$\",\n      start: rowMatch[2],\n      endAbsolute: rowMatch[3] === \"$\",\n      end: rowMatch[4],\n    };\n  }\n\n  return null;\n}\n\n/**\n * Parse open-ended range patterns (A5:INFINITY, A5:D, A5:15)\n */\ninterface ParsedOpenEndedRange {\n  sheet?: string;\n  type: \"infinity\" | \"column-bounded\" | \"row-bounded\";\n  startCol: string;\n  startRow: string;\n  startColAbsolute: boolean;\n  startRowAbsolute: boolean;\n  endCol?: string;\n  endRow?: string;\n  endColAbsolute?: boolean;\n  endRowAbsolute?: boolean;\n}\n\nexport function parseOpenEndedRange(ref: string): ParsedOpenEndedRange | null {\n  // Check for sheet qualifier\n  const sheetMatch = ref.match(CELL_REFERENCE_PATTERNS.SHEET_QUALIFIED);\n  let sheet: string | undefined;\n  let rangePart: string;\n\n  if (sheetMatch && sheetMatch[3]) {\n    sheet = sheetMatch[1] || sheetMatch[2]; // Either unquoted or quoted sheet name\n    rangePart = sheetMatch[3];\n  } else {\n    rangePart = ref;\n  }\n\n  // Check for A5:INFINITY pattern\n  const infinityMatch = rangePart.match(CELL_REFERENCE_PATTERNS.OPEN_ENDED_INFINITY);\n  if (infinityMatch && infinityMatch[2] && infinityMatch[4]) {\n    return {\n      sheet,\n      type: \"infinity\",\n      startCol: infinityMatch[2].toUpperCase(),\n      startRow: infinityMatch[4],\n      startColAbsolute: infinityMatch[1] === \"$\",\n      startRowAbsolute: infinityMatch[3] === \"$\",\n    };\n  }\n\n  // Check for A5:D pattern (open down only)\n  // We need to be more careful here to distinguish from normal cell ranges\n  const colonIndex = rangePart.indexOf(':');\n  if (colonIndex !== -1) {\n    const startPart = rangePart.substring(0, colonIndex);\n    const endPart = rangePart.substring(colonIndex + 1);\n    \n    // Parse start part as a cell reference\n    const startMatch = startPart.match(/^(\\$)?([A-Z]+)(\\$)?([1-9][0-9]*)$/i);\n    if (startMatch && startMatch[2] && startMatch[4]) {\n      // Check if end part is just a column (A5:D pattern)\n      const endColMatch = endPart.match(/^(\\$)?([A-Z]+)$/i);\n      if (endColMatch && endColMatch[2]) {\n        return {\n          sheet,\n          type: \"column-bounded\",\n          startCol: startMatch[2].toUpperCase(),\n          startRow: startMatch[4],\n          startColAbsolute: startMatch[1] === \"$\",\n          startRowAbsolute: startMatch[3] === \"$\",\n          endCol: endColMatch[2].toUpperCase(),\n          endColAbsolute: endColMatch[1] === \"$\",\n        };\n      }\n      \n      // Check if end part is just a row number (A5:15 pattern)\n      const endRowMatch = endPart.match(/^(\\$)?([1-9][0-9]*)$/);\n      if (endRowMatch && endRowMatch[2]) {\n        return {\n          sheet,\n          type: \"row-bounded\",\n          startCol: startMatch[2].toUpperCase(),\n          startRow: startMatch[4],\n          startColAbsolute: startMatch[1] === \"$\",\n          startRowAbsolute: startMatch[3] === \"$\",\n          endRow: endRowMatch[2],\n          endRowAbsolute: endRowMatch[1] === \"$\",\n        };\n      }\n    }\n  }\n\n  return null;\n}\n\n/**\n * Parse a 3D range reference (e.g., Sheet1:Sheet3!A1)\n */\ninterface Parsed3DReference {\n  startSheet: string;\n  endSheet: string;\n  reference: string;\n}\n\nexport function parse3DReference(ref: string): Parsed3DReference | null {\n  const match = ref.match(CELL_REFERENCE_PATTERNS.SHEET_RANGE_QUALIFIED);\n  if (!match || !match[5]) {\n    return null;\n  }\n\n  const startSheet = match[1] || match[2]; // Unquoted or quoted start sheet\n  const endSheet = match[3] || match[4]; // Unquoted or quoted end sheet\n\n  if (!startSheet || !endSheet) {\n    return null;\n  }\n\n  return {\n    startSheet,\n    endSheet,\n    reference: match[5],\n  };\n}\n\n/**\n * Parse a structured reference (e.g., Table1[Column1])\n */\ninterface ParsedStructuredReference {\n  tableName: string;\n  columnSpec: string;\n  isCurrentRow?: boolean;\n  selector?: string;\n  cols?: {\n    startCol: string;\n    endCol: string;\n  };\n}\n\nexport function parseStructuredReference(\n  ref: string\n): ParsedStructuredReference | null {\n  // Check for current row reference (e.g., [@Column])\n  if (ref.startsWith(\"@\")) {\n    const colName = ref.substring(1);\n    if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(colName)) {\n      return {\n        tableName: \"\",\n        columnSpec: colName,\n        isCurrentRow: true,\n        cols: {\n          startCol: colName,\n          endCol: colName,\n        },\n      };\n    }\n  }\n\n  // Check for table reference (e.g., Table1[Column1])\n  const match = ref.match(CELL_REFERENCE_PATTERNS.TABLE_REFERENCE);\n  if (!match || !match[1] || !match[2]) {\n    return null;\n  }\n\n  const tableName = match[1];\n  const columnSpec = match[2];\n\n  // Parse column spec for selectors and column name/range\n  let selector: string | undefined;\n  let cols: { startCol: string; endCol: string } | undefined;\n\n  // Check if column spec contains selector (e.g., [#Headers],[Column1])\n  const selectorMatch = columnSpec.match(/^\\[#(All|Data|Headers)\\],\\[(.+)\\]$/i);\n  if (selectorMatch && selectorMatch[1] && selectorMatch[2]) {\n    selector = \"#\" + selectorMatch[1];\n    const colSpec = selectorMatch[2];\n\n    // Check if it's a column range [Column1]:[Column2]\n    const rangeMatch = colSpec.match(/^(.+):(.+)$/);\n    if (rangeMatch && rangeMatch[1] && rangeMatch[2]) {\n      cols = {\n        startCol: rangeMatch[1].trim(),\n        endCol: rangeMatch[2].trim(),\n      };\n    } else {\n      cols = {\n        startCol: colSpec,\n        endCol: colSpec,\n      };\n    }\n  } else if (columnSpec.startsWith(\"@\")) {\n    // Table with current row reference (e.g., Table1[@Column1])\n    const colName = columnSpec.substring(1);\n    return {\n      tableName,\n      columnSpec: colName,\n      isCurrentRow: true,\n      cols: {\n        startCol: colName,\n        endCol: colName,\n      },\n    };\n  } else if (columnSpec.startsWith(\"#\")) {\n    // Just a selector (e.g., Table1[#Data])\n    const selectorMatch = columnSpec.match(/^#(All|Data|Headers)$/i);\n    if (selectorMatch) {\n      selector = columnSpec;\n    }\n  } else {\n    // Check if it's a column range [Column1]:[Column2]\n    const rangeMatch = columnSpec.match(/^(.+):(.+)$/);\n    if (rangeMatch && rangeMatch[1] && rangeMatch[2]) {\n      cols = {\n        startCol: rangeMatch[1].trim(),\n        endCol: rangeMatch[2].trim(),\n      };\n    } else {\n      // Simple column reference\n      cols = {\n        startCol: columnSpec,\n        endCol: columnSpec,\n      };\n    }\n  }\n\n  return {\n    tableName,\n    columnSpec,\n    selector,\n    cols,\n  };\n}\n"
  ],
  "mappings": "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",
  "debugId": "638E802D80827AB664756E2164756E21",
  "names": []
}