X-Git-Url: https://code.kerkeslager.com/?p=fur;a=blobdiff_plain;f=transformation.py;h=e06bcf02638636b826c9fcd39d984460fa4890f7;hp=51b02448ad78b607cabd9ee3c945f89de07a3fa0;hb=151f60b119247efb1bcf05a664f4324b71fac782;hpb=3297817843cd6bd087505a70d8e108f1baa35cff diff --git a/transformation.py b/transformation.py index 51b0244..e06bcf0 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), )