python2ib
Version:
Convert Python code to IB Pseudocode format
183 lines • 5.01 kB
JavaScript
/**
* 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