X-Git-Url: https://code.kerkeslager.com/?p=fur;a=blobdiff_plain;f=transformation.py;h=7d47ed494100f2f8673f3b11e261b2418fd206ba;hp=c07f692437781a5b0815432de32dd23cfcc9f50d;hb=b47a0017d1dbfda8e8bae7989fff9ccb31897a28;hpb=62bbcc8f9242c7f404db4756460a927b1ce90aec diff --git a/transformation.py b/transformation.py index c07f692..7d47ed4 100644 --- a/transformation.py +++ b/transformation.py @@ -61,18 +61,23 @@ CNegationExpression = collections.namedtuple( CFunctionCallForFurInfixOperator = collections.namedtuple( 'CFunctionCallForFurInfixOperator', [ + 'metadata', 'name', - 'left', - 'right', ], ) +CPushStatement = collections.namedtuple( + 'CPushStatement', + ( + 'expression', + ), +) + CFunctionCallExpression = collections.namedtuple( 'CFunctionCallExpression', [ 'function_expression', 'argument_count', - 'argument_items', ], ) @@ -234,59 +239,21 @@ FUR_INFIX_OPERATOR_TO_C_INFIX_OPERATOR = { '>': CInfixDeclaration(name='greaterThan', in_type='integer', out_type='boolean', operator='>'), } -def transform_comparison_level_expression(accumulators, expression): - accumulators.operator_set.add(FUR_INFIX_OPERATOR_TO_C_INFIX_OPERATOR[expression.operator]) - - # Transform expressions like 1 < 2 < 3 into expressions like 1 < 2 && 2 < 3 - if isinstance(expression.left, parsing.FurInfixExpression) and expression.left.order == 'comparison_level': - left = transform_comparison_level_expression( - accumulators, - expression.left - ) - - middle = left.right - - right = transform_expression( - accumulators, - expression.right, - ) - - # TODO Don't evaluate the middle expression twice - return CFunctionCallForFurInfixOperator( - name='and', - left=left, - right=CFunctionCallForFurInfixOperator( - name=FUR_INFIX_OPERATOR_TO_C_INFIX_OPERATOR[expression.operator].name, - left=middle, - right=right, - ), - ) - - return CFunctionCallForFurInfixOperator( - name=FUR_INFIX_OPERATOR_TO_C_INFIX_OPERATOR[expression.operator].name, - left=transform_expression(accumulators, expression.left), - right=transform_expression(accumulators, expression.right), - ) - def transform_infix_operator_without_c_equivalent(accumulators, expression): return CFunctionCallForFurInfixOperator( + metadata=expression.metadata, name='concatenate', - left=transform_expression(accumulators, expression.left), - right=transform_expression(accumulators, expression.right), ) + def transform_infix_expression(accumulators, expression): if expression.operator in FUR_INFIX_OPERATOR_TO_C_FUNCTION: return transform_infix_operator_without_c_equivalent(accumulators, expression) - if expression.order == 'comparison_level': - return transform_comparison_level_expression(accumulators, expression) - accumulators.operator_set.add(FUR_INFIX_OPERATOR_TO_C_INFIX_OPERATOR[expression.operator]) return CFunctionCallForFurInfixOperator( + metadata=expression.metadata, name=FUR_INFIX_OPERATOR_TO_C_INFIX_OPERATOR[expression.operator].name, - left=transform_expression(accumulators, expression.left), - right=transform_expression(accumulators, expression.right), ) def transform_integer_literal_expression(accumulators, expression): @@ -398,7 +365,6 @@ def transform_function_call_expression(accumulators, function_call): return CFunctionCallExpression( function_expression=transform_expression(accumulators, function_call.function_expression), argument_count=function_call.argument_count, - argument_items=transform_expression(accumulators, function_call.argument_items), ) def transform_expression_statement(accumulators, statement): @@ -463,6 +429,9 @@ def transform_function_definition_statement(accumulators, statement): return CFunctionDeclaration(name=statement.name) +def transform_push_statement(accumulators, statement): + return CPushStatement(expression=transform_expression(accumulators, statement.expression)) + def transform_statement(accumulators, statement): return { parsing.FurExpressionStatement: transform_expression_statement, @@ -472,6 +441,7 @@ def transform_statement(accumulators, statement): normalization.NormalFunctionDefinitionStatement: transform_function_definition_statement, normalization.NormalIfElseStatement: transform_if_else_statement, normalization.NormalListAppendStatement: transform_list_append_statement, + normalization.NormalPushStatement: transform_push_statement, normalization.NormalSymbolArrayVariableInitializationStatement: transform_symbol_array_variable_initialization_statement, normalization.NormalVariableInitializationStatement: transform_variable_initialization_statement, normalization.NormalVariableReassignmentStatement: transform_variable_reassignment_statement,