X-Git-Url: https://code.kerkeslager.com/?p=fur;a=blobdiff_plain;f=crossplatform_ir_generation.py;h=49e7408116e4c91fe3669b738bd39bcce48d26ae;hp=7f8a6ec40f6ada6b26b9448e90273c65be053ea5;hb=4efcfd00920263da31dc2bb216050df4041299e7;hpb=909476f4bdcdaea7d5724019d2fb46ec304cc755 diff --git a/crossplatform_ir_generation.py b/crossplatform_ir_generation.py index 7f8a6ec..49e7408 100644 --- a/crossplatform_ir_generation.py +++ b/crossplatform_ir_generation.py @@ -36,7 +36,41 @@ def generate_string_literal(string): def generate_symbol_literal(symbol): return 'sym({})'.format(symbol) +def generate_instruction_name_from_builtin(builtin): + try: + return { + '__add__': 'add', + '__integer_divide__': 'idiv', + '__modular_divide__': 'mod', + '__multiply__': 'mul', + '__negate__': 'neg', + '__subtract__': 'sub', + + '__eq__': 'eq', + '__neq__': 'neq', + '__lt__': 'lt', + '__lte__': 'lte', + '__gt__': 'gt', + '__gte__': 'gte', + }[builtin] + + except KeyError: + import ipdb; ipdb.set_trace() + def generate_function_call_expression(counters, expression): + if isinstance(expression.function_expression, conversion.CPSBuiltinExpression): + return ( + (), + ( + CIRInstruction( + instruction=generate_instruction_name_from_builtin( + expression.function_expression.symbol, + ), + argument=expression.argument_count, + ), + ) + ) + referenced_entry_list, instruction_list = generate_expression( counters, expression.function_expression, @@ -54,7 +88,7 @@ def generate_function_call_expression(counters, expression): def generate_integer_literal_expression(counters, expression): referenced_entry_list = () instruction_list = (CIRInstruction( - instruction='push_value', + instruction='push_integer', argument=generate_integer_literal(expression.integer), ),) @@ -113,7 +147,7 @@ def generate_list_construct_expression(counters, expression): def generate_string_literal_expression(counters, expression): referenced_entry_list = () instruction_list = (CIRInstruction( - instruction='push_value', + instruction='push_string', argument=generate_string_literal(expression.string), ),) @@ -140,7 +174,7 @@ def generate_symbol_expression(counters, expression): def generate_symbol_literal_expression(counters, expression): referenced_entry_list = () instruction_list = (CIRInstruction( - instruction='push_value', + instruction='push_symbol', argument=generate_symbol_literal(expression.symbol), ),) @@ -301,7 +335,9 @@ def generate(converted): return CIRProgram( entry_list=flatten(referenced_entry_list_list) + ( CIRLabel(label='__main__'), - ) + flatten(instruction_list_list), + ) + flatten(instruction_list_list) + ( + CIRInstruction(instruction='end', argument=None), + ) ) NO_ARGUMENT_INSTRUCTIONS = set([