@@ -32,34 +32,28 @@ def get_operand_value(operand, builder, local_sym_tab):
3232
3333
3434def handle_binary_op (rval , module , builder , var_name , local_sym_tab , map_sym_tab , func ):
35- logger .info (f"module { module } " )
3635 op = rval .op
37-
3836 left = get_operand_value (rval .left , builder , local_sym_tab )
3937 right = get_operand_value (rval .right , builder , local_sym_tab )
4038 logger .info (f"left is { left } , right is { right } , op is { op } " )
4139
42- if isinstance (op , ast .Add ):
43- builder .store (builder .add (left , right ), local_sym_tab [var_name ].var )
44- elif isinstance (op , ast .Sub ):
45- builder .store (builder .sub (left , right ), local_sym_tab [var_name ].var )
46- elif isinstance (op , ast .Mult ):
47- builder .store (builder .mul (left , right ), local_sym_tab [var_name ].var )
48- elif isinstance (op , ast .Div ):
49- builder .store (builder .sdiv (left , right ), local_sym_tab [var_name ].var )
50- elif isinstance (op , ast .Mod ):
51- builder .store (builder .srem (left , right ), local_sym_tab [var_name ].var )
52- elif isinstance (op , ast .LShift ):
53- builder .store (builder .shl (left , right ), local_sym_tab [var_name ].var )
54- elif isinstance (op , ast .RShift ):
55- builder .store (builder .lshr (left , right ), local_sym_tab [var_name ].var )
56- elif isinstance (op , ast .BitOr ):
57- builder .store (builder .or_ (left , right ), local_sym_tab [var_name ].var )
58- elif isinstance (op , ast .BitXor ):
59- builder .store (builder .xor (left , right ), local_sym_tab [var_name ].var )
60- elif isinstance (op , ast .BitAnd ):
61- builder .store (builder .and_ (left , right ), local_sym_tab [var_name ].var )
62- elif isinstance (op , ast .FloorDiv ):
63- builder .store (builder .udiv (left , right ), local_sym_tab [var_name ].var )
40+ # Map AST operation nodes to LLVM IR builder methods
41+ op_map = {
42+ ast .Add : builder .add ,
43+ ast .Sub : builder .sub ,
44+ ast .Mult : builder .mul ,
45+ ast .Div : builder .sdiv ,
46+ ast .Mod : builder .srem ,
47+ ast .LShift : builder .shl ,
48+ ast .RShift : builder .lshr ,
49+ ast .BitOr : builder .or_ ,
50+ ast .BitXor : builder .xor ,
51+ ast .BitAnd : builder .and_ ,
52+ ast .FloorDiv : builder .udiv ,
53+ }
54+
55+ if type (op ) in op_map :
56+ result = op_map [type (op )](left , right )
57+ builder .store (result , local_sym_tab [var_name ].var )
6458 else :
6559 raise SyntaxError ("Unsupported binary operation" )
0 commit comments