UNPKG

python2ib

Version:

Convert Python code to IB Pseudocode format

183 lines 5.01 kB
/** * Intermediate Representation (IR) for Python to IB Pseudocode conversion * * This IR uses a recursive tree structure where each node can have children, * allowing for proper representation of nested structures (IF/WHILE/FOR/FUNCTION blocks) */ /** Factory functions for creating IR nodes */ export class IRFactory { static program() { return { kind: 'program', text: '', children: [], meta: {} }; } static assign(variable, value, lineNumber) { return { kind: 'assign', text: `${variable} = ${value}`, children: [], meta: { variable, lineNumber } }; } static output(expression, lineNumber) { return { kind: 'output', text: `output ${expression}`, children: [], meta: { lineNumber } }; } static input(variable, lineNumber) { const text = variable ? `${variable} = INPUT` : 'INPUT'; return { kind: 'input', text, children: [], meta: { variable, lineNumber } }; } static if(condition, lineNumber) { return { kind: 'if', text: `if ${condition} then`, children: [], meta: { condition, lineNumber } }; } static elseif(condition, lineNumber) { return { kind: 'elseif', text: `else if ${condition} then`, children: [], meta: { condition, lineNumber } }; } static else(lineNumber) { return { kind: 'else', text: 'else', children: [], meta: { lineNumber } }; } static endif(lineNumber) { return { kind: 'endif', text: 'end if', children: [], meta: { lineNumber } }; } static while(condition, lineNumber) { return { kind: 'while', text: `loop while ${condition}`, children: [], meta: { condition, lineNumber } }; } static until(condition, lineNumber) { return { kind: 'until', text: `loop until ${condition}`, children: [], meta: { condition, lineNumber } }; } static endwhile(lineNumber) { return { kind: 'endwhile', text: 'end loop', children: [], meta: { lineNumber } }; } static for(variable, start, end, step, lineNumber) { const stepText = step && step !== '1' ? ` step ${step}` : ''; return { kind: 'for', text: `loop ${variable} from ${start} to ${end}${stepText}`, children: [], meta: { variable, start, end, step: step || '1', lineNumber } }; } static next(variable, lineNumber) { return { kind: 'next', text: `end loop`, children: [], meta: { variable, lineNumber } }; } static function(name, parameters, returnType, lineNumber) { const params = parameters.join(', '); return { kind: 'function', text: `FUNCTION ${name}(${params}) RETURNS ${returnType}`, children: [], meta: { functionName: name, parameters, returnType, lineNumber } }; } static endfunction(lineNumber) { return { kind: 'endfunction', text: 'end FUNCTION', children: [], meta: { lineNumber } }; } static procedure(name, parameters, lineNumber) { const params = parameters.join(', '); return { kind: 'procedure', text: `PROCEDURE ${name}(${params})`, children: [], meta: { functionName: name, parameters, lineNumber } }; } static endprocedure(lineNumber) { return { kind: 'endprocedure', text: 'end PROCEDURE', children: [], meta: { lineNumber } }; } static return(value, lineNumber) { const text = value ? `RETURN ${value}` : 'RETURN'; return { kind: 'return', text, children: [], meta: { value, lineNumber } }; } static comment(text, lineNumber) { return { kind: 'comment', text: `// ${text}`, children: [], meta: { lineNumber } }; } static expression(text, lineNumber) { return { kind: 'expression', text, children: [], meta: { lineNumber } }; } static block(lineNumber) { return { kind: 'block', text: '', children: [], meta: { lineNumber } }; } } //# sourceMappingURL=ir.js.map