@terminals-tech/py2bend 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/parser.ts","../src/transforms.ts","../src/stdlib.ts","../src/codegen.ts","../src/index.ts"],"sourcesContent":["// Regex-based recursive descent parser for the Python subset.\n// Targets: def, class, if/elif/else, for, while, try/except, return, assignments,\n// augmented assignments, lambda, list/dict literals, attribute access, subscript,\n// binary/unary/comparison/boolean ops, function calls.\n\nimport type {\n PyModule,\n PyNode,\n PyFunctionDef,\n PyReturn,\n PyAssign,\n PyAugAssign,\n PyIf,\n PyFor,\n PyWhile,\n PyExpr,\n PyBinOp,\n PyUnaryOp,\n PyCompare,\n PyBoolOp,\n PyCall,\n PyName,\n PyConstant,\n PyAttribute,\n PySubscript,\n PyList,\n PyDict,\n PyLambda,\n PyClassDef,\n PyTry,\n ParseResult,\n CompileError,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Line tokenizer\n// ---------------------------------------------------------------------------\n\ninterface Line {\n text: string;\n indent: number;\n lineNo: number;\n}\n\nfunction tokenizeLines(source: string): Line[] {\n return source\n .split(\"\\n\")\n .map((raw, i) => {\n const text = raw;\n const trimmed = raw.trimStart();\n const indent = raw.length - trimmed.length;\n return { text: trimmed, indent, lineNo: i + 1 };\n })\n .filter((l) => l.text.length > 0 && !l.text.startsWith(\"#\"));\n}\n\n// ---------------------------------------------------------------------------\n// Block cursor\n// ---------------------------------------------------------------------------\n\nclass Cursor {\n constructor(\n public lines: Line[],\n public pos: number = 0,\n ) {}\n\n done(): boolean {\n return this.pos >= this.lines.length;\n }\n\n peek(): Line | null {\n return this.done() ? null : this.lines[this.pos];\n }\n\n advance(): Line {\n return this.lines[this.pos++];\n }\n\n /** Collect the body block: all lines with indent > parentIndent */\n collectBlock(parentIndent: number): Line[] {\n const block: Line[] = [];\n while (!this.done()) {\n const next = this.peek()!;\n if (next.indent <= parentIndent) break;\n block.push(this.advance());\n }\n return block;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Unsupported syntax detection\n// ---------------------------------------------------------------------------\n\nconst UNSUPPORTED_KEYWORDS = [\n /^async\\s+def\\b/,\n /^await\\b/,\n /^yield\\b/,\n /^import\\b/,\n /^from\\s+\\S+\\s+import\\b/,\n /^with\\b/,\n /^assert\\b/,\n /^raise\\b/,\n /^del\\b/,\n /^global\\b/,\n /^nonlocal\\b/,\n];\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function parsePython(source: string): ParseResult {\n const errors: CompileError[] = [];\n const lines = tokenizeLines(source);\n\n try {\n const cursor = new Cursor(lines);\n const body = parseBlock(cursor, -1, errors);\n return { ast: { type: \"Module\", body } as PyModule, errors };\n } catch (e) {\n errors.push({\n message: (e as Error).message,\n severity: \"error\",\n });\n return { ast: null, errors };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Statement parser\n// ---------------------------------------------------------------------------\n\nfunction parseBlock(\n cursor: Cursor,\n parentIndent: number,\n errors: CompileError[],\n): PyNode[] {\n const stmts: PyNode[] = [];\n\n while (!cursor.done()) {\n const line = cursor.peek()!;\n if (line.indent <= parentIndent) break;\n\n cursor.advance();\n\n const stmt = parseStatement(line, cursor, errors);\n if (stmt) stmts.push(stmt);\n }\n\n return stmts;\n}\n\nfunction parseStatement(\n line: Line,\n cursor: Cursor,\n errors: CompileError[],\n): PyNode | null {\n const text = line.text;\n\n // Check unsupported syntax first\n for (const pattern of UNSUPPORTED_KEYWORDS) {\n if (pattern.test(text)) {\n errors.push({\n message: `Unsupported syntax: ${text}`,\n line: line.lineNo,\n severity: \"error\",\n });\n // Skip the block body if any\n cursor.collectBlock(line.indent);\n return null;\n }\n }\n\n // Decorated definitions\n if (text.startsWith(\"@\")) {\n // Collect decorators, then parse the def/class\n const decorators: string[] = [text.slice(1).trim()];\n while (!cursor.done() && cursor.peek()!.text.startsWith(\"@\")) {\n decorators.push(cursor.advance().text.slice(1).trim());\n }\n if (!cursor.done()) {\n const defLine = cursor.advance();\n const stmt = parseStatement(defLine, cursor, errors);\n if (stmt && stmt.type === \"FunctionDef\") {\n (stmt as PyFunctionDef).decorators = decorators;\n }\n return stmt;\n }\n return null;\n }\n\n // def\n if (text.startsWith(\"def \")) {\n return parseFunctionDef(text, line, cursor, errors);\n }\n\n // class\n if (text.startsWith(\"class \")) {\n return parseClassDef(text, line, cursor, errors);\n }\n\n // if\n if (text.startsWith(\"if \")) {\n return parseIf(text, line, cursor, errors);\n }\n\n // for\n if (text.startsWith(\"for \")) {\n return parseFor(text, line, cursor, errors);\n }\n\n // while\n if (text.startsWith(\"while \")) {\n return parseWhile(text, line, cursor, errors);\n }\n\n // try\n if (text.startsWith(\"try:\")) {\n return parseTry(line, cursor, errors);\n }\n\n // return\n if (text === \"return\" || text.startsWith(\"return \")) {\n return parseReturn(text, line, errors);\n }\n\n // pass (no-op)\n if (text === \"pass\") {\n return null;\n }\n\n // elif / else / except — these should be consumed by their parent parser,\n // but if they appear here it means they're orphaned. Skip gracefully.\n if (\n text.startsWith(\"elif \") ||\n text === \"else:\" ||\n text.startsWith(\"except\")\n ) {\n cursor.collectBlock(line.indent);\n return null;\n }\n\n // Augmented assignment: x += expr, x -= expr, etc.\n const augMatch = text.match(\n /^([A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)*)\\s*(\\+\\=|\\-\\=|\\*\\=|\\/\\=|\\/\\/\\=|%\\=|\\*\\*\\=|&\\=|\\|\\=)\\s*(.+)$/,\n );\n if (augMatch) {\n return {\n type: \"AugAssign\",\n target: augMatch[1],\n op: augMatch[2],\n value: parseExpr(augMatch[3].trim(), line.lineNo, errors),\n } as PyAugAssign;\n }\n\n // Assignment: x = expr (or x.attr = expr)\n const assignMatch = text.match(\n /^([A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)*(?:\\[[^\\]]+\\])?)\\s*=\\s*(.+)$/,\n );\n if (assignMatch) {\n // Make sure it's not `==`\n const afterTarget = text.slice(assignMatch[1].length).trimStart();\n if (afterTarget.startsWith(\"==\")) {\n // This is actually a comparison expression, fall through\n } else {\n return {\n type: \"Assign\",\n target: assignMatch[1],\n value: parseExpr(assignMatch[2].trim(), line.lineNo, errors),\n } as PyAssign;\n }\n }\n\n // Bare expression (function call, etc.)\n const expr = parseExpr(text, line.lineNo, errors);\n return {\n type: \"Expr\",\n value: expr,\n } as PyExpr;\n}\n\n// ---------------------------------------------------------------------------\n// Compound statement parsers\n// ---------------------------------------------------------------------------\n\nfunction parseFunctionDef(\n text: string,\n line: Line,\n cursor: Cursor,\n errors: CompileError[],\n): PyFunctionDef {\n // def name(params):\n const match = text.match(/^def\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*\\(([^)]*)\\)\\s*:/);\n if (!match) {\n errors.push({\n message: `Invalid function definition: ${text}`,\n line: line.lineNo,\n severity: \"error\",\n });\n cursor.collectBlock(line.indent);\n return {\n type: \"FunctionDef\",\n name: \"unknown\",\n params: [],\n body: [],\n decorators: [],\n };\n }\n\n const name = match[1];\n const paramsStr = match[2].trim();\n const params = paramsStr\n ? paramsStr.split(\",\").map((p) => {\n // Handle default values: x=None -> just \"x\"\n const cleaned = p.trim().split(\"=\")[0].trim();\n // Handle type annotations: x: int -> just \"x\"\n return cleaned.split(\":\")[0].trim();\n })\n : [];\n\n const bodyLines = cursor.collectBlock(line.indent);\n const bodyCursor = new Cursor(bodyLines);\n const body = parseBlock(bodyCursor, line.indent, errors);\n\n return {\n type: \"FunctionDef\",\n name,\n params,\n body,\n decorators: [],\n };\n}\n\nfunction parseClassDef(\n text: string,\n line: Line,\n cursor: Cursor,\n errors: CompileError[],\n): PyClassDef {\n // class Name(bases): or class Name:\n const match = text.match(\n /^class\\s+([A-Za-z_][A-Za-z0-9_]*)(?:\\(([^)]*)\\))?\\s*:/,\n );\n if (!match) {\n errors.push({\n message: `Invalid class definition: ${text}`,\n line: line.lineNo,\n severity: \"error\",\n });\n cursor.collectBlock(line.indent);\n return { type: \"ClassDef\", name: \"unknown\", bases: [], body: [] };\n }\n\n const name = match[1];\n const basesStr = match[2]?.trim() ?? \"\";\n const bases = basesStr\n ? basesStr.split(\",\").map((b) => b.trim())\n : [];\n\n const bodyLines = cursor.collectBlock(line.indent);\n const bodyCursor = new Cursor(bodyLines);\n const body = parseBlock(bodyCursor, line.indent, errors);\n\n return { type: \"ClassDef\", name, bases, body };\n}\n\nfunction parseIf(\n text: string,\n line: Line,\n cursor: Cursor,\n errors: CompileError[],\n): PyIf {\n // if condition:\n const condStr = text.replace(/^if\\s+/, \"\").replace(/\\s*:\\s*$/, \"\");\n const test = parseExpr(condStr, line.lineNo, errors);\n\n const bodyLines = cursor.collectBlock(line.indent);\n const bodyCursor = new Cursor(bodyLines);\n const body = parseBlock(bodyCursor, line.indent, errors);\n\n let orelse: PyNode[] = [];\n\n // Check for elif / else at the same indent level\n if (!cursor.done()) {\n const next = cursor.peek()!;\n if (next.indent === line.indent && next.text.startsWith(\"elif \")) {\n cursor.advance();\n // Convert elif to nested If in orelse\n const elifText = next.text.replace(/^elif\\s+/, \"if \");\n const elifIf = parseIf(elifText, next, cursor, errors);\n orelse = [elifIf];\n } else if (next.indent === line.indent && next.text === \"else:\") {\n cursor.advance();\n const elseLines = cursor.collectBlock(line.indent);\n const elseCursor = new Cursor(elseLines);\n orelse = parseBlock(elseCursor, line.indent, errors);\n }\n }\n\n return { type: \"If\", test, body, orelse };\n}\n\nfunction parseFor(\n text: string,\n line: Line,\n cursor: Cursor,\n errors: CompileError[],\n): PyFor {\n // for target in iter:\n const match = text.match(\n /^for\\s+([A-Za-z_][A-Za-z0-9_]*)\\s+in\\s+(.+)\\s*:\\s*$/,\n );\n if (!match) {\n errors.push({\n message: `Invalid for loop: ${text}`,\n line: line.lineNo,\n severity: \"error\",\n });\n cursor.collectBlock(line.indent);\n return {\n type: \"For\",\n target: \"unknown\",\n iter: { type: \"Name\", id: \"unknown\" } as PyName,\n body: [],\n };\n }\n\n const target = match[1];\n const iterExpr = parseExpr(match[2].trim(), line.lineNo, errors);\n\n const bodyLines = cursor.collectBlock(line.indent);\n const bodyCursor = new Cursor(bodyLines);\n const body = parseBlock(bodyCursor, line.indent, errors);\n\n return { type: \"For\", target, iter: iterExpr, body };\n}\n\nfunction parseWhile(\n text: string,\n line: Line,\n cursor: Cursor,\n errors: CompileError[],\n): PyWhile {\n // while condition:\n const condStr = text.replace(/^while\\s+/, \"\").replace(/\\s*:\\s*$/, \"\");\n const test = parseExpr(condStr, line.lineNo, errors);\n\n const bodyLines = cursor.collectBlock(line.indent);\n const bodyCursor = new Cursor(bodyLines);\n const body = parseBlock(bodyCursor, line.indent, errors);\n\n return { type: \"While\", test, body };\n}\n\nfunction parseTry(\n line: Line,\n cursor: Cursor,\n errors: CompileError[],\n): PyTry {\n // try: block\n const tryBodyLines = cursor.collectBlock(line.indent);\n const tryCursor = new Cursor(tryBodyLines);\n const tryBody = parseBlock(tryCursor, line.indent, errors);\n\n let handler: PyTry[\"handler\"] = null;\n\n // Check for except at same indent\n if (!cursor.done()) {\n const next = cursor.peek()!;\n if (next.indent === line.indent && next.text.startsWith(\"except\")) {\n cursor.advance();\n // except ExceptionType as name:\n const exceptMatch = next.text.match(\n /^except\\s*(?:([A-Za-z_][A-Za-z0-9_]*))?(?:\\s+as\\s+([A-Za-z_][A-Za-z0-9_]*))?\\s*:\\s*$/,\n );\n const handlerType = exceptMatch?.[1] ?? null;\n const handlerName = exceptMatch?.[2] ?? null;\n\n const handlerBodyLines = cursor.collectBlock(line.indent);\n const handlerCursor = new Cursor(handlerBodyLines);\n const handlerBody = parseBlock(handlerCursor, line.indent, errors);\n\n handler = { type: handlerType, name: handlerName, body: handlerBody };\n }\n }\n\n return { type: \"Try\", body: tryBody, handler };\n}\n\nfunction parseReturn(\n text: string,\n line: Line,\n errors: CompileError[],\n): PyReturn {\n const valueStr = text.replace(/^return\\s*/, \"\").trim();\n if (!valueStr) {\n return { type: \"Return\", value: null };\n }\n return { type: \"Return\", value: parseExpr(valueStr, line.lineNo, errors) };\n}\n\n// ---------------------------------------------------------------------------\n// Expression parser — recursive descent with precedence\n//\n// Precedence (low to high):\n// lambda\n// or\n// and\n// not\n// comparisons: <, <=, >, >=, ==, !=, in, not in\n// arithmetic: +, -\n// term: *, /, //, %\n// power: **\n// unary: -, +, not\n// primary: literals, names, calls, attr, subscript, parens, list, dict\n// ---------------------------------------------------------------------------\n\nfunction parseExpr(\n text: string,\n lineNo: number,\n errors: CompileError[],\n): PyNode {\n text = text.trim();\n if (!text) {\n return { type: \"Constant\", value: null, kind: \"none\" } as PyConstant;\n }\n\n // Lambda at top level\n if (text.startsWith(\"lambda\")) {\n return parseLambda(text, lineNo, errors);\n }\n\n return parseBoolOr(text, lineNo, errors);\n}\n\nfunction parseLambda(\n text: string,\n lineNo: number,\n errors: CompileError[],\n): PyLambda {\n // lambda params: body\n const match = text.match(/^lambda\\s*([^:]*)\\s*:\\s*(.+)$/);\n if (!match) {\n return { type: \"Lambda\", params: [], body: { type: \"Constant\", value: null, kind: \"none\" } as PyConstant };\n }\n const paramsStr = match[1].trim();\n const params = paramsStr ? paramsStr.split(\",\").map((p) => p.trim()) : [];\n const body = parseExpr(match[2].trim(), lineNo, errors);\n return { type: \"Lambda\", params, body };\n}\n\n// --- Boolean OR ---\n\nfunction parseBoolOr(\n text: string,\n lineNo: number,\n errors: CompileError[],\n): PyNode {\n const parts = splitTopLevel(text, \" or \");\n if (parts.length === 1) return parseBoolAnd(parts[0], lineNo, errors);\n\n const values = parts.map((p) => parseBoolAnd(p, lineNo, errors));\n return { type: \"BoolOp\", op: \"or\", values } as PyBoolOp;\n}\n\n// --- Boolean AND ---\n\nfunction parseBoolAnd(\n text: string,\n lineNo: number,\n errors: CompileError[],\n): PyNode {\n const parts = splitTopLevel(text, \" and \");\n if (parts.length === 1) return parseNot(parts[0], lineNo, errors);\n\n const values = parts.map((p) => parseNot(p, lineNo, errors));\n return { type: \"BoolOp\", op: \"and\", values } as PyBoolOp;\n}\n\n// --- Not ---\n\nfunction parseNot(\n text: string,\n lineNo: number,\n errors: CompileError[],\n): PyNode {\n text = text.trim();\n if (text.startsWith(\"not \")) {\n const operand = parseNot(text.slice(4).trim(), lineNo, errors);\n return { type: \"UnaryOp\", op: \"not\", operand } as PyUnaryOp;\n }\n return parseComparison(text, lineNo, errors);\n}\n\n// --- Comparison ---\n\nconst COMPARISON_OPS = [\" not in \", \" in \", \"<=\", \">=\", \"!=\", \"==\", \"<\", \">\"];\n\nfunction parseComparison(\n text: string,\n lineNo: number,\n errors: CompileError[],\n): PyNode {\n // Find comparison operators at the top level (not inside parens/brackets)\n let bestIdx = -1;\n let bestOp = \"\";\n\n for (const op of COMPARISON_OPS) {\n const idx = findTopLevel(text, op);\n if (idx !== -1 && (bestIdx === -1 || idx < bestIdx)) {\n bestIdx = idx;\n bestOp = op;\n }\n }\n\n if (bestIdx === -1) {\n return parseAddSub(text, lineNo, errors);\n }\n\n const left = parseAddSub(text.slice(0, bestIdx).trim(), lineNo, errors);\n const right = parseComparison(\n text.slice(bestIdx + bestOp.length).trim(),\n lineNo,\n errors,\n );\n\n // For chained comparisons, flatten into ops/comparators\n if (right.type === \"Compare\") {\n const rightCmp = right as PyNode & {\n left: PyNode;\n ops: string[];\n comparators: PyNode[];\n };\n return {\n type: \"Compare\",\n left,\n ops: [bestOp.trim(), ...rightCmp.ops],\n comparators: [rightCmp.left, ...rightCmp.comparators],\n } as PyCompare;\n }\n\n return {\n type: \"Compare\",\n left,\n ops: [bestOp.trim()],\n comparators: [right],\n } as PyCompare;\n}\n\n// --- Addition / Subtraction ---\n\nfunction parseAddSub(\n text: string,\n lineNo: number,\n errors: CompileError[],\n): PyNode {\n // Find the last top-level + or - (left-associative)\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n let inStr: string | null = null;\n let splitIdx = -1;\n let splitOp = \"\";\n\n for (let i = text.length - 1; i >= 1; i--) {\n const ch = text[i];\n\n // Track strings\n if ((ch === '\"' || ch === \"'\") && text[i - 1] !== \"\\\\\") {\n if (inStr === ch) {\n inStr = null;\n continue;\n } else if (!inStr) {\n inStr = ch;\n continue;\n }\n }\n if (inStr) continue;\n\n if (ch === \")\") parenDepth++;\n else if (ch === \"(\") parenDepth--;\n else if (ch === \"]\") bracketDepth++;\n else if (ch === \"[\") bracketDepth--;\n else if (ch === \"}\") braceDepth++;\n else if (ch === \"{\") braceDepth--;\n\n if (parenDepth === 0 && bracketDepth === 0 && braceDepth === 0) {\n if ((ch === \"+\" || ch === \"-\") && text[i - 1] !== \"*\" && text[i + 1] !== \"=\" && text[i - 1] !== \"=\") {\n // Make sure this isn't part of ** or unary at start\n const before = text.slice(0, i).trim();\n if (before.length > 0 && !before.endsWith(\"(\") && !before.endsWith(\",\") && !before.endsWith(\"[\")) {\n splitIdx = i;\n splitOp = ch;\n break;\n }\n }\n }\n }\n\n if (splitIdx === -1) {\n return parseMulDiv(text, lineNo, errors);\n }\n\n const left = parseAddSub(text.slice(0, splitIdx).trim(), lineNo, errors);\n const right = parseMulDiv(text.slice(splitIdx + 1).trim(), lineNo, errors);\n return { type: \"BinOp\", left, op: splitOp, right } as PyBinOp;\n}\n\n// --- Multiplication / Division / Modulo ---\n\nfunction parseMulDiv(\n text: string,\n lineNo: number,\n errors: CompileError[],\n): PyNode {\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n let inStr: string | null = null;\n let splitIdx = -1;\n let splitOp = \"\";\n\n // Scan right to left for left-associative\n for (let i = text.length - 1; i >= 0; i--) {\n const ch = text[i];\n\n if ((ch === '\"' || ch === \"'\") && (i === 0 || text[i - 1] !== \"\\\\\")) {\n if (inStr === ch) {\n inStr = null;\n continue;\n } else if (!inStr) {\n inStr = ch;\n continue;\n }\n }\n if (inStr) continue;\n\n if (ch === \")\") parenDepth++;\n else if (ch === \"(\") parenDepth--;\n else if (ch === \"]\") bracketDepth++;\n else if (ch === \"[\") bracketDepth--;\n else if (ch === \"}\") braceDepth++;\n else if (ch === \"{\") braceDepth--;\n\n if (parenDepth === 0 && bracketDepth === 0 && braceDepth === 0) {\n if (ch === \"*\" && i > 0 && text[i - 1] !== \"*\" && (i + 1 >= text.length || text[i + 1] !== \"*\")) {\n splitIdx = i;\n splitOp = \"*\";\n break;\n }\n if (ch === \"/\" && i > 0) {\n if (text[i - 1] === \"/\") {\n splitIdx = i - 1;\n splitOp = \"//\";\n break;\n }\n splitIdx = i;\n splitOp = \"/\";\n break;\n }\n if (ch === \"%\") {\n splitIdx = i;\n splitOp = \"%\";\n break;\n }\n }\n }\n\n if (splitIdx === -1) {\n return parsePower(text, lineNo, errors);\n }\n\n const left = parseMulDiv(text.slice(0, splitIdx).trim(), lineNo, errors);\n const right = parsePower(\n text.slice(splitIdx + splitOp.length).trim(),\n lineNo,\n errors,\n );\n return { type: \"BinOp\", left, op: splitOp, right } as PyBinOp;\n}\n\n// --- Power ---\n\nfunction parsePower(\n text: string,\n lineNo: number,\n errors: CompileError[],\n): PyNode {\n const idx = findTopLevel(text, \"**\");\n if (idx === -1) {\n return parseUnary(text, lineNo, errors);\n }\n\n // Right-associative\n const left = parseUnary(text.slice(0, idx).trim(), lineNo, errors);\n const right = parsePower(text.slice(idx + 2).trim(), lineNo, errors);\n return { type: \"BinOp\", left, op: \"**\", right } as PyBinOp;\n}\n\n// --- Unary ---\n\nfunction parseUnary(\n text: string,\n lineNo: number,\n errors: CompileError[],\n): PyNode {\n text = text.trim();\n if (text.startsWith(\"-\") && text.length > 1) {\n // Check it's not a negative number literal — let parsePrimary handle those\n const rest = text.slice(1).trim();\n if (rest && !/^\\d/.test(rest)) {\n const operand = parseUnary(rest, lineNo, errors);\n return { type: \"UnaryOp\", op: \"-\", operand } as PyUnaryOp;\n }\n }\n if (text.startsWith(\"+\") && text.length > 1) {\n const rest = text.slice(1).trim();\n if (rest && !/^\\d/.test(rest)) {\n const operand = parseUnary(rest, lineNo, errors);\n return { type: \"UnaryOp\", op: \"+\", operand } as PyUnaryOp;\n }\n }\n return parsePostfix(text, lineNo, errors);\n}\n\n// --- Postfix: attribute access, subscript, function call ---\n\nfunction parsePostfix(\n text: string,\n lineNo: number,\n errors: CompileError[],\n): PyNode {\n text = text.trim();\n const parsed = parsePrimaryWithPostfix(text, lineNo, errors);\n return parsed;\n}\n\nfunction parsePrimaryWithPostfix(\n text: string,\n lineNo: number,\n errors: CompileError[],\n): PyNode {\n text = text.trim();\n let pos = 0;\n\n // Parse the base primary\n const { node, endPos } = parsePrimaryAt(text, pos, lineNo, errors);\n pos = endPos;\n\n let current = node;\n\n // Apply postfix chain\n while (pos < text.length) {\n const ch = text[pos];\n\n if (ch === \".\") {\n // Attribute access\n pos++; // skip '.'\n const attrMatch = text.slice(pos).match(/^[A-Za-z_][A-Za-z0-9_]*/);\n if (attrMatch) {\n const attr = attrMatch[0];\n pos += attr.length;\n current = { type: \"Attribute\", value: current, attr } as PyAttribute;\n } else {\n break;\n }\n } else if (ch === \"[\") {\n // Subscript\n const closeIdx = findMatchingClose(text, pos, \"[\", \"]\");\n if (closeIdx === -1) break;\n const sliceStr = text.slice(pos + 1, closeIdx).trim();\n const sliceNode = parseExpr(sliceStr, lineNo, errors);\n current = { type: \"Subscript\", value: current, slice: sliceNode } as PySubscript;\n pos = closeIdx + 1;\n } else if (ch === \"(\") {\n // Function call\n const closeIdx = findMatchingClose(text, pos, \"(\", \")\");\n if (closeIdx === -1) break;\n const argsStr = text.slice(pos + 1, closeIdx).trim();\n const { args, kwargs } = parseCallArgs(argsStr, lineNo, errors);\n current = { type: \"Call\", func: current, args, kwargs } as PyCall;\n pos = closeIdx + 1;\n } else if (ch === \" \" || ch === \"\\t\") {\n pos++;\n } else {\n break;\n }\n }\n\n return current;\n}\n\nfunction parsePrimaryAt(\n text: string,\n pos: number,\n lineNo: number,\n errors: CompileError[],\n): { node: PyNode; endPos: number } {\n // Skip whitespace\n while (pos < text.length && (text[pos] === \" \" || text[pos] === \"\\t\")) pos++;\n\n if (pos >= text.length) {\n return {\n node: { type: \"Constant\", value: null, kind: \"none\" } as PyConstant,\n endPos: pos,\n };\n }\n\n const remaining = text.slice(pos);\n\n // Parenthesized expression\n if (remaining[0] === \"(\") {\n const closeIdx = findMatchingClose(text, pos, \"(\", \")\");\n if (closeIdx !== -1) {\n const inner = text.slice(pos + 1, closeIdx).trim();\n const node = parseExpr(inner, lineNo, errors);\n return { node, endPos: closeIdx + 1 };\n }\n }\n\n // List literal\n if (remaining[0] === \"[\") {\n const closeIdx = findMatchingClose(text, pos, \"[\", \"]\");\n if (closeIdx !== -1) {\n const inner = text.slice(pos + 1, closeIdx).trim();\n const elts = inner\n ? splitArgs(inner).map((e) => parseExpr(e.trim(), lineNo, errors))\n : [];\n return {\n node: { type: \"List\", elts } as PyList,\n endPos: closeIdx + 1,\n };\n }\n }\n\n // Dict literal\n if (remaining[0] === \"{\") {\n const closeIdx = findMatchingClose(text, pos, \"{\", \"}\");\n if (closeIdx !== -1) {\n const inner = text.slice(pos + 1, closeIdx).trim();\n const keys: PyNode[] = [];\n const values: PyNode[] = [];\n if (inner) {\n const entries = splitArgs(inner);\n for (const entry of entries) {\n const colonIdx = findTopLevel(entry, \":\");\n if (colonIdx !== -1) {\n keys.push(\n parseExpr(entry.slice(0, colonIdx).trim(), lineNo, errors),\n );\n values.push(\n parseExpr(entry.slice(colonIdx + 1).trim(), lineNo, errors),\n );\n }\n }\n }\n return {\n node: { type: \"Dict\", keys, values } as PyDict,\n endPos: closeIdx + 1,\n };\n }\n }\n\n // String literal\n if (remaining[0] === '\"' || remaining[0] === \"'\") {\n const quote = remaining[0];\n // Handle triple quotes\n if (remaining.startsWith(quote + quote + quote)) {\n const endQuote = remaining.indexOf(quote + quote + quote, 3);\n if (endQuote !== -1) {\n const value = remaining.slice(3, endQuote);\n return {\n node: { type: \"Constant\", value, kind: \"str\" } as PyConstant,\n endPos: pos + endQuote + 3,\n };\n }\n }\n // Single quoted string\n let i = 1;\n while (i < remaining.length) {\n if (remaining[i] === \"\\\\\" && i + 1 < remaining.length) {\n i += 2;\n continue;\n }\n if (remaining[i] === quote) {\n const value = remaining.slice(1, i);\n return {\n node: { type: \"Constant\", value, kind: \"str\" } as PyConstant,\n endPos: pos + i + 1,\n };\n }\n i++;\n }\n // Unterminated string — take everything\n return {\n node: {\n type: \"Constant\",\n value: remaining.slice(1),\n kind: \"str\",\n } as PyConstant,\n endPos: pos + remaining.length,\n };\n }\n\n // f-string: f\"...\" — treat as string constant for now\n if (\n (remaining[0] === \"f\" || remaining[0] === \"F\") &&\n remaining.length > 1 &&\n (remaining[1] === '\"' || remaining[1] === \"'\")\n ) {\n const quote = remaining[1];\n let i = 2;\n while (i < remaining.length) {\n if (remaining[i] === \"\\\\\" && i + 1 < remaining.length) {\n i += 2;\n continue;\n }\n if (remaining[i] === quote) {\n const value = remaining.slice(2, i);\n return {\n node: { type: \"Constant\", value, kind: \"str\" } as PyConstant,\n endPos: pos + i + 1,\n };\n }\n i++;\n }\n return {\n node: {\n type: \"Constant\",\n value: remaining.slice(2),\n kind: \"str\",\n } as PyConstant,\n endPos: pos + remaining.length,\n };\n }\n\n // Number literal (including negative)\n const numMatch = remaining.match(/^-?\\d+(\\.\\d+)?/);\n if (numMatch) {\n const numStr = numMatch[0];\n const isFloat = numStr.includes(\".\");\n return {\n node: {\n type: \"Constant\",\n value: isFloat ? parseFloat(numStr) : parseInt(numStr, 10),\n kind: isFloat ? \"float\" : \"int\",\n } as PyConstant,\n endPos: pos + numStr.length,\n };\n }\n\n // Boolean / None / Name\n const identMatch = remaining.match(/^[A-Za-z_][A-Za-z0-9_]*/);\n if (identMatch) {\n const id = identMatch[0];\n const endPos = pos + id.length;\n\n if (id === \"True\") {\n return {\n node: { type: \"Constant\", value: true, kind: \"bool\" } as PyConstant,\n endPos,\n };\n }\n if (id === \"False\") {\n return {\n node: { type: \"Constant\", value: false, kind: \"bool\" } as PyConstant,\n endPos,\n };\n }\n if (id === \"None\") {\n return {\n node: { type: \"Constant\", value: null, kind: \"none\" } as PyConstant,\n endPos,\n };\n }\n\n return {\n node: { type: \"Name\", id } as PyName,\n endPos,\n };\n }\n\n // Fallback: treat remaining as a name\n errors.push({\n message: `Unexpected token: ${remaining.slice(0, 20)}`,\n line: lineNo,\n severity: \"error\",\n });\n return {\n node: { type: \"Name\", id: remaining.trim() } as PyName,\n endPos: pos + remaining.length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Split a string by a delimiter, but only at the top level (not inside parens/brackets/braces/strings) */\nfunction splitTopLevel(text: string, delimiter: string): string[] {\n const parts: string[] = [];\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n let inStr: string | null = null;\n let start = 0;\n\n for (let i = 0; i <= text.length - delimiter.length; i++) {\n const ch = text[i];\n\n // Track strings\n if ((ch === '\"' || ch === \"'\") && (i === 0 || text[i - 1] !== \"\\\\\")) {\n if (inStr === ch) {\n inStr = null;\n continue;\n } else if (!inStr) {\n inStr = ch;\n continue;\n }\n }\n if (inStr) continue;\n\n if (ch === \"(\") parenDepth++;\n else if (ch === \")\") parenDepth--;\n else if (ch === \"[\") bracketDepth++;\n else if (ch === \"]\") bracketDepth--;\n else if (ch === \"{\") braceDepth++;\n else if (ch === \"}\") braceDepth--;\n\n if (\n parenDepth === 0 &&\n bracketDepth === 0 &&\n braceDepth === 0 &&\n text.slice(i, i + delimiter.length) === delimiter\n ) {\n parts.push(text.slice(start, i).trim());\n start = i + delimiter.length;\n i = start - 1; // -1 because the loop will increment\n }\n }\n\n parts.push(text.slice(start).trim());\n return parts;\n}\n\n/** Find the first top-level occurrence of a substring */\nfunction findTopLevel(text: string, needle: string): number {\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n let inStr: string | null = null;\n\n for (let i = 0; i <= text.length - needle.length; i++) {\n const ch = text[i];\n\n if ((ch === '\"' || ch === \"'\") && (i === 0 || text[i - 1] !== \"\\\\\")) {\n if (inStr === ch) {\n inStr = null;\n continue;\n } else if (!inStr) {\n inStr = ch;\n continue;\n }\n }\n if (inStr) continue;\n\n if (ch === \"(\") parenDepth++;\n else if (ch === \")\") parenDepth--;\n else if (ch === \"[\") bracketDepth++;\n else if (ch === \"]\") bracketDepth--;\n else if (ch === \"{\") braceDepth++;\n else if (ch === \"}\") braceDepth--;\n\n if (\n parenDepth === 0 &&\n bracketDepth === 0 &&\n braceDepth === 0 &&\n text.slice(i, i + needle.length) === needle\n ) {\n return i;\n }\n }\n\n return -1;\n}\n\n/** Find the matching closing bracket/paren/brace */\nfunction findMatchingClose(\n text: string,\n openIdx: number,\n open: string,\n close: string,\n): number {\n let depth = 0;\n let inStr: string | null = null;\n\n for (let i = openIdx; i < text.length; i++) {\n const ch = text[i];\n\n if ((ch === '\"' || ch === \"'\") && (i === 0 || text[i - 1] !== \"\\\\\")) {\n if (inStr === ch) {\n inStr = null;\n continue;\n } else if (!inStr) {\n inStr = ch;\n continue;\n }\n }\n if (inStr) continue;\n\n if (ch === open) depth++;\n else if (ch === close) {\n depth--;\n if (depth === 0) return i;\n }\n }\n\n return -1;\n}\n\n/** Split function arguments at top-level commas */\nfunction splitArgs(text: string): string[] {\n return splitTopLevel(text, \",\");\n}\n\n/** Parse function call arguments into positional args and keyword args */\nfunction parseCallArgs(\n text: string,\n lineNo: number,\n errors: CompileError[],\n): { args: PyNode[]; kwargs: Array<{ key: string; value: PyNode }> } {\n if (!text.trim()) return { args: [], kwargs: [] };\n\n const parts = splitArgs(text);\n const args: PyNode[] = [];\n const kwargs: Array<{ key: string; value: PyNode }> = [];\n\n for (const part of parts) {\n const trimmed = part.trim();\n // Check for keyword argument: key=value (but not ==)\n const kwMatch = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*=(?!=)\\s*(.+)$/);\n if (kwMatch) {\n kwargs.push({\n key: kwMatch[1],\n value: parseExpr(kwMatch[2].trim(), lineNo, errors),\n });\n } else {\n args.push(parseExpr(trimmed, lineNo, errors));\n }\n }\n\n return { args, kwargs };\n}\n","// Transforms Python AST nodes into Bend IR nodes.\n//\n// Mapping:\n// PyFor -> BendFold (for loops -> fold over lists)\n// PyWhile -> BendLoop (while loops -> bend/fork recursive generation)\n// PyClassDef -> BendObject (classes -> Bend ADTs, fields from __init__ self.X)\n// PyTry -> BendWith (try/except -> with Result: monadic)\n// PyFunctionDef -> BendFunctionDef (1:1, body recursively transformed)\n// Everything else -> BendPassthrough\n\nimport type {\n PyModule,\n PyNode,\n PyFunctionDef,\n PyFor,\n PyWhile,\n PyClassDef,\n PyTry,\n PyAssign,\n PyAugAssign,\n BendModule,\n BendNode,\n BendFunctionDef,\n BendFold,\n BendLoop,\n BendObject,\n BendWith,\n BendPassthrough,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Transform a parsed Python module AST into Bend IR */\nexport function transformModule(ast: PyModule): BendModule {\n return {\n type: \"BendModule\",\n source: \"Module\",\n body: transformNodes(ast.body),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Node dispatcher\n// ---------------------------------------------------------------------------\n\nfunction transformNodes(nodes: PyNode[]): BendNode[] {\n return nodes.map(transformNode);\n}\n\nfunction transformNode(node: PyNode): BendNode {\n switch (node.type) {\n case \"FunctionDef\":\n return transformFunctionDef(node as PyFunctionDef);\n case \"For\":\n return transformFor(node as PyFor);\n case \"While\":\n return transformWhile(node as PyWhile);\n case \"ClassDef\":\n return transformClass(node as PyClassDef);\n case \"Try\":\n return transformTry(node as PyTry);\n default:\n return passthrough(node);\n }\n}\n\n// ---------------------------------------------------------------------------\n// FunctionDef -> BendFunctionDef (1:1, recursive body transform)\n// ---------------------------------------------------------------------------\n\nfunction transformFunctionDef(node: PyFunctionDef): BendFunctionDef {\n return {\n type: \"BendFunctionDef\",\n source: \"FunctionDef\",\n name: node.name,\n params: node.params,\n body: transformNodes(node.body),\n decorators: node.decorators,\n };\n}\n\n// ---------------------------------------------------------------------------\n// For -> BendFold (fold over list)\n// ---------------------------------------------------------------------------\n\nfunction transformFor(node: PyFor): BendFold {\n // Detect accumulator pattern: if body contains an AugAssign, use its target\n const accumulator = findAccumulator(node.body);\n\n return {\n type: \"BendFold\",\n source: \"For\",\n target: node.target,\n iter: node.iter,\n body: transformNodes(node.body),\n accumulator,\n };\n}\n\n/** Scan body for AugAssign nodes and return the first target as the accumulator */\nfunction findAccumulator(body: PyNode[]): string | null {\n for (const stmt of body) {\n if (stmt.type === \"AugAssign\") {\n return (stmt as PyAugAssign).target;\n }\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// While -> BendLoop (bend/fork recursive generation)\n// ---------------------------------------------------------------------------\n\nfunction transformWhile(node: PyWhile): BendLoop {\n return {\n type: \"BendLoop\",\n source: \"While\",\n test: node.test,\n body: transformNodes(node.body),\n stateVars: [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// ClassDef -> BendObject (Bend ADT)\n// ---------------------------------------------------------------------------\n\nfunction transformClass(node: PyClassDef): BendObject {\n const fields = extractFields(node.body);\n const methods: BendFunctionDef[] = [];\n\n for (const member of node.body) {\n if (member.type === \"FunctionDef\") {\n methods.push(transformFunctionDef(member as PyFunctionDef));\n }\n }\n\n return {\n type: \"BendObject\",\n source: \"ClassDef\",\n name: node.name,\n bases: node.bases,\n fields,\n methods,\n };\n}\n\n/**\n * Extract fields from a class body by finding the __init__ method\n * and scanning for `self.X = ...` assignments.\n */\nfunction extractFields(body: PyNode[]): string[] {\n const fields: string[] = [];\n\n // Find __init__ method\n const initMethod = body.find(\n (n) => n.type === \"FunctionDef\" && (n as PyFunctionDef).name === \"__init__\",\n ) as PyFunctionDef | undefined;\n\n if (!initMethod) return fields;\n\n // Scan __init__ body for assignments where target starts with \"self.\"\n for (const stmt of initMethod.body) {\n if (stmt.type === \"Assign\") {\n const assign = stmt as PyAssign;\n if (assign.target.startsWith(\"self.\")) {\n fields.push(assign.target.slice(5)); // strip \"self.\" prefix\n }\n }\n }\n\n return fields;\n}\n\n// ---------------------------------------------------------------------------\n// Try -> BendWith (with Result: monadic error handling)\n// ---------------------------------------------------------------------------\n\nfunction transformTry(node: PyTry): BendWith {\n return {\n type: \"BendWith\",\n source: \"Try\",\n body: transformNodes(node.body),\n handler: node.handler\n ? {\n name: node.handler.name,\n type: node.handler.type,\n body: transformNodes(node.handler.body),\n }\n : null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Passthrough — nodes that don't need structural transformation\n// ---------------------------------------------------------------------------\n\nfunction passthrough(node: PyNode): BendPassthrough {\n return {\n type: \"BendPassthrough\",\n source: node.type,\n node,\n };\n}\n","/** Python builtin functions -> Bend stdlib equivalents */\nexport const BUILTIN_MAP: Record<string, string> = {\n len: \"List/len\",\n print: \"IO/print\",\n range: \"List/range\",\n int: \"Num/to_int\",\n float: \"Num/to_float\",\n str: \"Str/from\",\n bool: \"Bool/from\",\n abs: \"Num/abs\",\n min: \"Num/min\",\n max: \"Num/max\",\n sum: \"List/sum\",\n sorted: \"List/sort\",\n reversed: \"List/reverse\",\n enumerate: \"List/enumerate\",\n zip: \"List/zip\",\n map: \"List/map\",\n filter: \"List/filter\",\n any: \"List/any\",\n all: \"List/all\",\n isinstance: \"Type/is\",\n type: \"Type/of\",\n input: \"IO/input\",\n open: \"IO/open\",\n round: \"Num/round\",\n list: \"List/from\",\n dict: \"Map/from\",\n tuple: \"Tuple/from\",\n set: \"Set/from\",\n};\n\n/** Python binary/unary/boolean operators -> Bend operators */\nexport const OP_MAP: Record<string, string> = {\n \"+\": \"+\",\n \"-\": \"-\",\n \"*\": \"*\",\n \"/\": \"/\",\n \"//\": \"/\",\n \"%\": \"%\",\n \"**\": \"**\",\n \"&\": \"&\",\n \"|\": \"|\",\n \"==\": \"==\",\n \"!=\": \"!=\",\n \"<\": \"<\",\n \">\": \">\",\n \"<=\": \"<=\",\n \">=\": \">=\",\n and: \"&\",\n or: \"|\",\n not: \"!\",\n in: \"List/contains\",\n \"not in\": \"List/not_contains\",\n};\n\n/** Python method calls -> Bend function equivalents */\nexport const METHOD_MAP: Record<string, string> = {\n // list methods\n \"list.append\": \"List/push\",\n \"list.pop\": \"List/pop\",\n \"list.insert\": \"List/insert\",\n \"list.remove\": \"List/remove\",\n \"list.index\": \"List/index\",\n \"list.count\": \"List/count\",\n \"list.sort\": \"List/sort\",\n \"list.reverse\": \"List/reverse\",\n \"list.extend\": \"List/concat\",\n \"list.copy\": \"List/copy\",\n \"list.clear\": \"List/clear\",\n\n // dict methods\n \"dict.get\": \"Map/get\",\n \"dict.keys\": \"Map/keys\",\n \"dict.values\": \"Map/values\",\n \"dict.items\": \"Map/items\",\n \"dict.update\": \"Map/merge\",\n \"dict.pop\": \"Map/remove\",\n \"dict.setdefault\": \"Map/get_or_set\",\n \"dict.clear\": \"Map/clear\",\n \"dict.copy\": \"Map/copy\",\n\n // str methods\n \"str.split\": \"Str/split\",\n \"str.join\": \"Str/join\",\n \"str.strip\": \"Str/trim\",\n \"str.lower\": \"Str/lower\",\n \"str.upper\": \"Str/upper\",\n \"str.replace\": \"Str/replace\",\n \"str.startswith\": \"Str/starts_with\",\n \"str.endswith\": \"Str/ends_with\",\n \"str.find\": \"Str/find\",\n \"str.format\": \"Str/format\",\n};\n","// Bend source code generation from the Bend IR.\n// Takes BendModule (output of transforms) and produces Bend Imp syntax.\n\nimport type {\n PyNode,\n PyBinOp,\n PyUnaryOp,\n PyCompare,\n PyBoolOp,\n PyCall,\n PyName,\n PyConstant,\n PyAttribute,\n PySubscript,\n PyList,\n PyDict,\n PyLambda,\n PyReturn,\n PyAssign,\n PyAugAssign,\n PyIf,\n PyExpr,\n BendModule,\n BendNode,\n BendFunctionDef,\n BendFold,\n BendLoop,\n BendObject,\n BendWith,\n BendPassthrough,\n} from \"./types\";\nimport { BUILTIN_MAP, OP_MAP } from \"./stdlib\";\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Generate Bend source code from a BendModule IR */\nexport function generateBend(module: BendModule): string {\n const lines: string[] = [];\n for (const node of module.body) {\n lines.push(generateNode(node, 0));\n }\n return lines.join(\"\\n\\n\") + \"\\n\";\n}\n\n// ---------------------------------------------------------------------------\n// Node dispatcher\n// ---------------------------------------------------------------------------\n\nfunction generateNode(node: BendNode, depth: number): string {\n switch (node.type) {\n case \"BendFunctionDef\":\n return generateFunctionDef(node as BendFunctionDef, depth);\n case \"BendFold\":\n return generateFold(node as BendFold, depth);\n case \"BendLoop\":\n return generateLoop(node as BendLoop, depth);\n case \"BendObject\":\n return generateObject(node as BendObject, depth);\n case \"BendWith\":\n return generateWith(node as BendWith, depth);\n case \"BendPassthrough\":\n return generatePassthrough(node as BendPassthrough, depth);\n default:\n return indent(depth) + `# unsupported: ${node.type}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// BendFunctionDef -> def name(params): body\n// ---------------------------------------------------------------------------\n\nfunction generateFunctionDef(node: BendFunctionDef, depth: number): string {\n const params = node.params.join(\", \");\n const head = `${indent(depth)}def ${node.name}(${params}):`;\n const bodyLines = node.body.map((n) => generateNode(n, depth + 1));\n if (bodyLines.length === 0) {\n return head + \"\\n\" + indent(depth + 1) + \"return *\";\n }\n return head + \"\\n\" + bodyLines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// BendFold -> fold iter: case List/Cons: ... case List/Nil: ...\n// ---------------------------------------------------------------------------\n\nfunction generateFold(node: BendFold, depth: number): string {\n const iterExpr = generateExpr(node.iter, depth);\n const head = `${indent(depth)}fold ${iterExpr}:`;\n const consCase = `${indent(depth + 1)}case List/Cons:`;\n const bodyLines = node.body.map((n) => generateNode(n, depth + 2));\n const nilCase = `${indent(depth + 1)}case List/Nil:`;\n const nilBody = node.accumulator\n ? `${indent(depth + 2)}${node.accumulator}`\n : `${indent(depth + 2)}*`;\n\n return [head, consCase, ...bodyLines, nilCase, nilBody].join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// BendLoop -> bend x = 0: when test: ... fork(...) else: ...\n// ---------------------------------------------------------------------------\n\nfunction generateLoop(node: BendLoop, depth: number): string {\n const testExpr = generateExpr(node.test, depth);\n const head = `${indent(depth)}bend x = 0:`;\n const whenLine = `${indent(depth + 1)}when ${testExpr}:`;\n const bodyLines = node.body.map((n) => generateNode(n, depth + 2));\n const forkLine = `${indent(depth + 2)}fork(x + 1)`;\n const elseLine = `${indent(depth + 1)}else:`;\n const elseBody = `${indent(depth + 2)}x`;\n\n return [head, whenLine, ...bodyLines, forkLine, elseLine, elseBody].join(\n \"\\n\",\n );\n}\n\n// ---------------------------------------------------------------------------\n// BendObject -> object Name { field1, field2 }\n// ---------------------------------------------------------------------------\n\nfunction generateObject(node: BendObject, depth: number): string {\n const fieldsStr =\n node.fields.length > 0 ? ` { ${node.fields.join(\", \")} }` : \"\";\n const head = `${indent(depth)}object ${node.name}${fieldsStr}`;\n\n if (node.methods.length === 0) {\n return head;\n }\n\n // Filter out __init__ (fields are already declared above)\n const nonInitMethods = node.methods.filter((m) => m.name !== \"__init__\");\n if (nonInitMethods.length === 0) {\n return head;\n }\n\n const methodLines = nonInitMethods.map((m) =>\n generateFunctionDef(m, depth),\n );\n return head + \"\\n\\n\" + methodLines.join(\"\\n\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// BendWith -> with Result: body ... (handler)\n// ---------------------------------------------------------------------------\n\nfunction generateWith(node: BendWith, depth: number): string {\n const head = `${indent(depth)}with Result:`;\n const bodyLines = node.body.map((n) => generateNode(n, depth + 1));\n\n if (!node.handler) {\n return [head, ...bodyLines].join(\"\\n\");\n }\n\n const handlerLines = node.handler.body.map((n) =>\n generateNode(n, depth + 1),\n );\n const handlerHead = node.handler.name\n ? `${indent(depth)}catch ${node.handler.name}:`\n : `${indent(depth)}catch _err:`;\n\n return [head, ...bodyLines, handlerHead, ...handlerLines].join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// BendPassthrough -> delegate to PyNode expression/statement generators\n// ---------------------------------------------------------------------------\n\nfunction generatePassthrough(node: BendPassthrough, depth: number): string {\n return generatePyStatement(node.node, depth);\n}\n\n// ---------------------------------------------------------------------------\n// Python statement generators (for passthrough nodes)\n// ---------------------------------------------------------------------------\n\nfunction generatePyStatement(node: PyNode, depth: number): string {\n switch (node.type) {\n case \"Return\":\n return generateReturn(node as PyReturn, depth);\n case \"Assign\":\n return generateAssign(node as PyAssign, depth);\n case \"AugAssign\":\n return generateAugAssign(node as PyAugAssign, depth);\n case \"If\":\n return generateIf(node as PyIf, depth);\n case \"Expr\":\n return indent(depth) + generateExpr((node as PyExpr).value, depth);\n default:\n return indent(depth) + generateExpr(node, depth);\n }\n}\n\nfunction generateReturn(node: PyReturn, depth: number): string {\n if (!node.value) {\n return `${indent(depth)}return *`;\n }\n return `${indent(depth)}return ${generateExpr(node.value, depth)}`;\n}\n\nfunction generateAssign(node: PyAssign, depth: number): string {\n return `${indent(depth)}let ${node.target} = ${generateExpr(node.value, depth)}`;\n}\n\nfunction generateAugAssign(node: PyAugAssign, depth: number): string {\n // Bend doesn't have augmented assignment; desugar: x = x op value\n const op = node.op.slice(0, -1); // \"+=\" -> \"+\"\n const mappedOp = OP_MAP[op] ?? op;\n return `${indent(depth)}let ${node.target} = (${node.target} ${mappedOp} ${generateExpr(node.value, depth)})`;\n}\n\nfunction generateIf(node: PyIf, depth: number): string {\n const testExpr = generateExpr(node.test, depth);\n const head = `${indent(depth)}if ${testExpr}:`;\n const bodyLines = (node.body as PyNode[]).map((n) =>\n generatePyStatement(n, depth + 1),\n );\n\n if (!node.orelse || (node.orelse as PyNode[]).length === 0) {\n return [head, ...bodyLines].join(\"\\n\");\n }\n\n const elseLine = `${indent(depth)}else:`;\n const elseLines = (node.orelse as PyNode[]).map((n) =>\n generatePyStatement(n, depth + 1),\n );\n return [head, ...bodyLines, elseLine, ...elseLines].join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Expression generators\n// ---------------------------------------------------------------------------\n\nfunction generateExpr(node: PyNode, _depth: number): string {\n switch (node.type) {\n case \"Name\":\n return (node as PyName).id;\n\n case \"Constant\":\n return generateConstant(node as PyConstant);\n\n case \"BinOp\": {\n const binop = node as PyBinOp;\n const mappedOp = OP_MAP[binop.op] ?? binop.op;\n return `(${generateExpr(binop.left, _depth)} ${mappedOp} ${generateExpr(binop.right, _depth)})`;\n }\n\n case \"UnaryOp\": {\n const unary = node as PyUnaryOp;\n const mappedOp = OP_MAP[unary.op] ?? unary.op;\n if (mappedOp === \"!\") {\n return `(!${generateExpr(unary.operand, _depth)})`;\n }\n return `(${mappedOp}${generateExpr(unary.operand, _depth)})`;\n }\n\n case \"Compare\": {\n const cmp = node as PyCompare;\n if (cmp.ops.length === 1) {\n const mappedOp = OP_MAP[cmp.ops[0]] ?? cmp.ops[0];\n return `(${generateExpr(cmp.left, _depth)} ${mappedOp} ${generateExpr(cmp.comparators[0], _depth)})`;\n }\n // Chained comparison: a < b < c -> (a < b) & (b < c)\n const parts: string[] = [];\n let prevExpr = generateExpr(cmp.left, _depth);\n for (let i = 0; i < cmp.ops.length; i++) {\n const mappedOp = OP_MAP[cmp.ops[i]] ?? cmp.ops[i];\n const rightExpr = generateExpr(cmp.comparators[i], _depth);\n parts.push(`(${prevExpr} ${mappedOp} ${rightExpr})`);\n prevExpr = rightExpr;\n }\n return parts.join(\" & \");\n }\n\n case \"BoolOp\": {\n const boolop = node as PyBoolOp;\n const mappedOp = OP_MAP[boolop.op] ?? boolop.op;\n const exprs = boolop.values.map((v) => generateExpr(v, _depth));\n return `(${exprs.join(` ${mappedOp} `)})`;\n }\n\n case \"Call\": {\n const call = node as PyCall;\n const funcName = generateExpr(call.func, _depth);\n // Check builtin map\n const mappedName = BUILTIN_MAP[funcName] ?? funcName;\n const args = call.args.map((a) => generateExpr(a, _depth));\n const kwargs = call.kwargs.map(\n (kw) => `${kw.key}=${generateExpr(kw.value, _depth)}`,\n );\n const allArgs = [...args, ...kwargs].join(\", \");\n return `${mappedName}(${allArgs})`;\n }\n\n case \"Attribute\": {\n const attr = node as PyAttribute;\n return `${generateExpr(attr.value, _depth)}.${attr.attr}`;\n }\n\n case \"Subscript\": {\n const sub = node as PySubscript;\n return `List/get(${generateExpr(sub.value, _depth)}, ${generateExpr(sub.slice, _depth)})`;\n }\n\n case \"List\": {\n const list = node as PyList;\n const elts = list.elts.map((e) => generateExpr(e, _depth));\n return `[${elts.join(\", \")}]`;\n }\n\n case \"Dict\": {\n const dict = node as PyDict;\n const entries = dict.keys.map(\n (k, i) =>\n `${generateExpr(k, _depth)}: ${generateExpr(dict.values[i], _depth)}`,\n );\n return `{${entries.join(\", \")}}`;\n }\n\n case \"Lambda\": {\n const lam = node as PyLambda;\n const params = lam.params.join(\", \");\n return `@${params} ${generateExpr(lam.body, _depth)}`;\n }\n\n default:\n return `/* unsupported: ${node.type} */`;\n }\n}\n\nfunction generateConstant(node: PyConstant): string {\n switch (node.kind) {\n case \"str\":\n return `\"${String(node.value).replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n case \"int\":\n case \"float\":\n return String(node.value);\n case \"bool\":\n return node.value ? \"True\" : \"False\";\n case \"none\":\n return \"*\";\n default:\n return String(node.value);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction indent(depth: number): string {\n return \" \".repeat(depth);\n}\n","export { parsePython } from \"./parser\";\nexport { transformModule } from \"./transforms\";\nexport { generateBend } from \"./codegen\";\nexport { BUILTIN_MAP, OP_MAP, METHOD_MAP } from \"./stdlib\";\nexport type {\n PyNode,\n PyModule,\n PyFunctionDef,\n PyReturn,\n PyAssign,\n PyAugAssign,\n PyIf,\n PyFor,\n PyWhile,\n PyExpr,\n PyBinOp,\n PyUnaryOp,\n PyCompare,\n PyBoolOp,\n PyCall,\n PyName,\n PyConstant,\n PyAttribute,\n PySubscript,\n PyList,\n PyDict,\n PyLambda,\n PyClassDef,\n PyTry,\n BendNode,\n BendModule,\n BendFunctionDef,\n BendFold,\n BendLoop,\n BendObject,\n BendWith,\n BendPassthrough,\n CompileResult,\n CompileError,\n ParseResult,\n} from \"./types\";\n\nimport { parsePython } from \"./parser\";\nimport { transformModule } from \"./transforms\";\nimport { generateBend } from \"./codegen\";\nimport type { CompileResult } from \"./types\";\n\n/**\n * Compile Python source to Bend source code.\n * Chains: parse -> transform -> generate\n */\nexport function compile(pythonSource: string): CompileResult {\n const warnings: string[] = [];\n\n // Phase 1: Parse\n const { ast, errors: parseErrors } = parsePython(pythonSource);\n\n if (!ast) {\n return {\n bend: \"\",\n errors: parseErrors,\n warnings,\n };\n }\n\n // Collect parse warnings (non-fatal errors)\n const errors = parseErrors.filter((e) => e.severity === \"error\");\n const parseWarnings = parseErrors.filter((e) => e.severity === \"warning\");\n warnings.push(...parseWarnings.map((w) => w.message));\n\n // Phase 2: Transform\n const bendModule = transformModule(ast);\n\n // Phase 3: Generate\n const bend = generateBend(bendModule);\n\n return {\n bend,\n errors,\n warnings,\n };\n}\n"],"mappings":"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","names":["indent"]}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@terminals-tech/py2bend",
3
+ "version": "0.1.0",
4
+ "description": "Python-to-Bend transpiler — compile Python source to Bend's interaction net language",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsup",
21
+ "dev": "tsup --watch",
22
+ "typecheck": "tsc --noEmit",
23
+ "test": "vitest run"
24
+ },
25
+ "devDependencies": {
26
+ "tsup": "^8.0.0",
27
+ "typescript": "^5.0.0",
28
+ "vitest": "^3.0.0"
29
+ },
30
+ "engines": {
31
+ "node": ">=18"
32
+ },
33
+ "author": "terminals.tech",
34
+ "license": "MIT",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/terminals-tech/terminals-landing-new.git",
38
+ "directory": "packages/py2bend"
39
+ },
40
+ "publishConfig": {
41
+ "access": "public"
42
+ },
43
+ "keywords": [
44
+ "python",
45
+ "bend",
46
+ "transpiler",
47
+ "compiler",
48
+ "interaction-nets",
49
+ "hvm"
50
+ ]
51
+ }