X-Git-Url: https://code.kerkeslager.com/?a=blobdiff_plain;f=transformation.py;h=1a9f2c67ed7e986742494f2ac2c737d73a565064;hb=02d64def49065ad614fe0ee2a85060666552192e;hp=51b02448ad78b607cabd9ee3c945f89de07a3fa0;hpb=3297817843cd6bd087505a70d8e108f1baa35cff;p=fur diff --git a/transformation.py b/transformation.py index 51b0244..1a9f2c6 100644 --- a/transformation.py +++ b/transformation.py @@ -140,6 +140,7 @@ CProgram = collections.namedtuple( ) BUILTINS = { + 'concatenate': [], 'false': [], 'pow': ['math.h'], 'print': ['stdio.h'], @@ -185,7 +186,11 @@ CInfixDeclaration = collections.namedtuple( ], ) -INFIX_OPERATOR_TO_DECLARATION = { +FUR_INFIX_OPERATOR_TO_C_FUNCTION = { + '++': 'concatenate', +} + +FUR_INFIX_OPERATOR_TO_C_INFIX_OPERATOR = { '+': CInfixDeclaration(name='add', in_type='integer', out_type='integer', operator='+'), '-': CInfixDeclaration(name='subtract', in_type='integer', out_type='integer', operator='-'), '*': CInfixDeclaration(name='multiply', in_type='integer', out_type='integer', operator='*'), @@ -202,7 +207,7 @@ INFIX_OPERATOR_TO_DECLARATION = { } def transform_comparison_level_expression(accumulators, expression): - accumulators.operator_set.add(INFIX_OPERATOR_TO_DECLARATION[expression.operator]) + 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': @@ -223,26 +228,35 @@ def transform_comparison_level_expression(accumulators, expression): name='and', left=left, right=CFunctionCallForFurInfixOperator( - name=INFIX_OPERATOR_TO_DECLARATION[expression.operator].name, + name=FUR_INFIX_OPERATOR_TO_C_INFIX_OPERATOR[expression.operator].name, left=middle, right=right, ), ) return CFunctionCallForFurInfixOperator( - name=INFIX_OPERATOR_TO_DECLARATION[expression.operator].name, + 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( + 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(INFIX_OPERATOR_TO_DECLARATION[expression.operator]) + accumulators.operator_set.add(FUR_INFIX_OPERATOR_TO_C_INFIX_OPERATOR[expression.operator]) return CFunctionCallForFurInfixOperator( - name=INFIX_OPERATOR_TO_DECLARATION[expression.operator].name, + name=FUR_INFIX_OPERATOR_TO_C_INFIX_OPERATOR[expression.operator].name, left=transform_expression(accumulators, expression.left), right=transform_expression(accumulators, expression.right), ) @@ -418,11 +432,6 @@ def transform(program): transform_statement(accumulators, statement) for statement in program.statement_list ] - # This prevents warnings about normalized variables being entire C statements - last_statement = statement_list[-1] - if isinstance(last_statement, normalization.NormalExpressionStatement) and isinstance(last_statement.expression, normalization.NormalVariableExpression): - del statement_list[-1] - standard_library_set = set() for builtin in accumulators.builtin_set: for standard_library in BUILTINS[builtin]: