Refactor ugly if-elif chain in handle_binary_op

This commit is contained in:
Pragyansh Chaturvedi
2025-10-03 14:04:38 +05:30
parent 6d5895ebc2
commit d593969408

View File

@ -32,34 +32,28 @@ def get_operand_value(operand, builder, local_sym_tab):
def handle_binary_op(rval, module, builder, var_name, local_sym_tab, map_sym_tab, func): def handle_binary_op(rval, module, builder, var_name, local_sym_tab, map_sym_tab, func):
logger.info(f"module {module}")
op = rval.op op = rval.op
left = get_operand_value(rval.left, builder, local_sym_tab) left = get_operand_value(rval.left, builder, local_sym_tab)
right = get_operand_value(rval.right, builder, local_sym_tab) right = get_operand_value(rval.right, builder, local_sym_tab)
logger.info(f"left is {left}, right is {right}, op is {op}") logger.info(f"left is {left}, right is {right}, op is {op}")
if isinstance(op, ast.Add): # Map AST operation nodes to LLVM IR builder methods
builder.store(builder.add(left, right), local_sym_tab[var_name].var) op_map = {
elif isinstance(op, ast.Sub): ast.Add: builder.add,
builder.store(builder.sub(left, right), local_sym_tab[var_name].var) ast.Sub: builder.sub,
elif isinstance(op, ast.Mult): ast.Mult: builder.mul,
builder.store(builder.mul(left, right), local_sym_tab[var_name].var) ast.Div: builder.sdiv,
elif isinstance(op, ast.Div): ast.Mod: builder.srem,
builder.store(builder.sdiv(left, right), local_sym_tab[var_name].var) ast.LShift: builder.shl,
elif isinstance(op, ast.Mod): ast.RShift: builder.lshr,
builder.store(builder.srem(left, right), local_sym_tab[var_name].var) ast.BitOr: builder.or_,
elif isinstance(op, ast.LShift): ast.BitXor: builder.xor,
builder.store(builder.shl(left, right), local_sym_tab[var_name].var) ast.BitAnd: builder.and_,
elif isinstance(op, ast.RShift): ast.FloorDiv: builder.udiv,
builder.store(builder.lshr(left, right), local_sym_tab[var_name].var) }
elif isinstance(op, ast.BitOr):
builder.store(builder.or_(left, right), local_sym_tab[var_name].var) if type(op) in op_map:
elif isinstance(op, ast.BitXor): result = op_map[type(op)](left, right)
builder.store(builder.xor(left, right), local_sym_tab[var_name].var) builder.store(result, local_sym_tab[var_name].var)
elif isinstance(op, ast.BitAnd):
builder.store(builder.and_(left, right), local_sym_tab[var_name].var)
elif isinstance(op, ast.FloorDiv):
builder.store(builder.udiv(left, right), local_sym_tab[var_name].var)
else: else:
raise SyntaxError("Unsupported binary operation") raise SyntaxError("Unsupported binary operation")