X-Git-Url: https://code.kerkeslager.com/?a=blobdiff_plain;f=generation.py;h=fa257183ff0f272ff3d5ee0bfdcf4c6c8cf6b71f;hb=e5e0dba41edce39475f839e29650007b37641be9;hp=149a5e247571dc322cdac5ac0352af9e4a324c39;hpb=2f7d76f2fc50763953b7268e0fe6558aac260187;p=fur diff --git a/generation.py b/generation.py index 149a5e2..fa25718 100644 --- a/generation.py +++ b/generation.py @@ -49,7 +49,7 @@ def generate_expression(expression): return LITERAL_TYPE_MAPPING[type(expression)](expression) if isinstance(expression, transformation.CFunctionCallForFurInfixOperator): - return 'builtin${}({}, {})'.format( + return 'operator${}({}, {})'.format( expression.name, generate_expression(expression.left), generate_expression(expression.right), @@ -60,17 +60,23 @@ def generate_expression(expression): }[type(expression)](expression) def generate_negation_expression(c_negation_expression): - return 'builtin$negate({})'.format( + return 'operator$negate({})'.format( generate_expression(c_negation_expression.value) ) -def generate_function_call(c_function_call): - return '{}({})'.format( - c_function_call.name, - ', '.join(generate_expression(argument) for argument in c_function_call.arguments), +def generate_function_call(function_call): + return 'Environment_get(environment, "{}").instance.closure(environment, {}, {})'.format( + function_call.name, + function_call.argument_count, + # TODO This is just a single item containing a reference to the items list--make that clearer + generate_expression(function_call.argument_items), ) def generate_expression_statement(statement): + # TODO Do this at an earlier pass + if isinstance(statement.expression, transformation.CVariableExpression): + return ''; + # TODO Do we need to garbage collect the results of arbitrary statements? return '{};'.format(generate_expression(statement.expression)) @@ -81,6 +87,12 @@ def generate_symbol_assignment_statement(c_assignment_statement): generate_expression(c_assignment_statement.expression), ) +def generate_array_variable_initialization_statement(statement): + return 'Object {}[] = {{ {} }};'.format( + statement.variable, + ', '.join(generate_expression(i) for i in statement.items), + ) + def generate_variable_initialization_statement(statement): return 'Object {} = {};'.format( statement.variable, @@ -99,17 +111,46 @@ def indent(s): def generate_if_else_statement(statement): # TODO Check that the argument is boolean - return 'if({}.instance.boolean)\n{{\n{}\n}}\nelse\n{{\n{}\n}}'.format( + condition_expression = '{}.instance.boolean'.format( generate_expression(statement.condition_expression), - indent('\n'.join(generate_statement(s) for s in statement.if_statements)), - indent('\n'.join(generate_statement(s) for s in statement.else_statements)), ) + if len(statement.if_statements) == 0: + condition_expression = '!({})'.format(condition_expression) + if_statements = statement.else_statements + else_statements = () + else: + if_statements = statement.if_statements + else_statements = statement.else_statements + + generated_if_clause = 'if({})'.format(condition_expression) + + if len(if_statements) == 0: + generated_if_statements = ';' + else: + generated_if_statements = indent('\n{{\n{}\n}}'.format( + indent('\n'.join(generate_statement(s) for s in if_statements)), + )) + + if len(else_statements) == 0: + generated_else_statements = '' + else: + generated_else_statements = indent('\nelse\n{{\n{}\n}}'.format( + indent('\n'.join(generate_statement(s) for s in else_statements)), + )) + + return generated_if_clause + generated_if_statements + generated_else_statements + +def generate_function_declaration(statement): + return 'Environment_set(environment, "{}", user${});'.format(statement.name, statement.name) + def generate_statement(statement): return { transformation.CExpressionStatement: generate_expression_statement, + transformation.CFunctionDeclaration: generate_function_declaration, transformation.CIfElseStatement: generate_if_else_statement, transformation.CSymbolAssignmentStatement: generate_symbol_assignment_statement, + transformation.CArrayVariableInitializationStatement: generate_array_variable_initialization_statement, transformation.CVariableInitializationStatement: generate_variable_initialization_statement, transformation.CVariableReassignmentStatement: generate_variable_reassignment_statement, }[type(statement)](statement) @@ -117,8 +158,10 @@ def generate_statement(statement): def generate(program): template = ENV.get_template('program.c') return template.render( - builtins=list(sorted(program.builtin_set)), - statements=[generate_statement(statement) for statement in program.statements], + builtins=tuple(sorted(program.builtin_set)), + function_definition_list=program.function_definition_list, + generate_statement=generate_statement, + statements=program.statements, standard_libraries=list(sorted(program.standard_libraries)), string_literal_list=program.string_literal_list, symbol_list=program.symbol_list,