X-Git-Url: https://code.kerkeslager.com/?p=fur;a=blobdiff_plain;f=transformation.py;h=cd9d18d9983ee39d7ba677c9ea19a1ee3ea48a55;hp=b038b5d021a3cd442406b3e6896c93ddda8aa752;hb=a859f78651b4da2d31890b9c7b01a431fa7a93f6;hpb=fc17cc4f755333f182183d09b281471aec5d0cdd diff --git a/transformation.py b/transformation.py index b038b5d..cd9d18d 100644 --- a/transformation.py +++ b/transformation.py @@ -70,6 +70,63 @@ CIntegerDivisionExpression = collections.namedtuple( ], ) +CEqualityExpression = collections.namedtuple( + 'CEqualityExpression', + [ + 'left', + 'right', + ], +) + +CInequalityExpression = collections.namedtuple( + 'CInequalityExpression', + [ + 'left', + 'right', + ], +) + +CGreaterThanOrEqualExpression = collections.namedtuple( + 'CGreaterThanOrEqualExpression', + [ + 'left', + 'right', + ], +) + +CLessThanOrEqualExpression = collections.namedtuple( + 'CLessThanOrEqualExpression', + [ + 'left', + 'right', + ], +) + +CGreaterThanExpression = collections.namedtuple( + 'CGreaterThanExpression', + [ + 'left', + 'right', + ], +) + +CLessThanExpression = collections.namedtuple( + 'CLessThanExpression', + [ + 'left', + 'right', + ], +) + +CAndExpression = collections.namedtuple( + 'CAndExpression', + [ + 'left', + 'right', + ], +) + + CModularDivisionExpression = collections.namedtuple( 'CModularDivisionExpression', [ @@ -105,6 +162,46 @@ CProgram = collections.namedtuple( ], ) +EQUALITY_LEVEL_TYPE_MAPPING = { + parsing.FurEqualityExpression: CEqualityExpression, + parsing.FurInequalityExpression: CInequalityExpression, + parsing.FurLessThanOrEqualExpression: CLessThanOrEqualExpression, + parsing.FurGreaterThanOrEqualExpression: CGreaterThanOrEqualExpression, + parsing.FurLessThanExpression: CLessThanExpression, + parsing.FurGreaterThanExpression: CGreaterThanExpression, +} + +def transform_equality_level_expression(builtin_dependencies, symbol_list, expression): + # Transform expressions like 1 < 2 < 3 into expressions like 1 < 2 && 2 < 3 + if type(expression.left) in EQUALITY_LEVEL_TYPE_MAPPING: + left = transform_equality_level_expression( + builtin_dependencies, + symbol_list, + expression.left + ) + + middle = left.right + + right = transform_expression( + builtin_dependencies, + symbol_list, + expression.right, + ) + + # TODO Don't evaluate the middle expression twice + return CAndExpression( + left=left, + right=EQUALITY_LEVEL_TYPE_MAPPING[type(expression)]( + left=middle, + right=right, + ), + ) + + return EQUALITY_LEVEL_TYPE_MAPPING[type(expression)]( + left=transform_expression(builtin_dependencies, symbol_list, expression.left), + right=transform_expression(builtin_dependencies, symbol_list, expression.right), + ) + BUILTINS = { 'false': [], 'pow': ['math.h'], @@ -143,6 +240,9 @@ def transform_expression(builtin_dependencies, symbol_list, expression): if type(expression) in LITERAL_TYPE_MAPPING: return LITERAL_TYPE_MAPPING[type(expression)](value=expression.value) + if type(expression) in EQUALITY_LEVEL_TYPE_MAPPING: + return transform_equality_level_expression(builtin_dependencies, symbol_list, expression) + INFIX_TYPE_MAPPING = { parsing.FurAdditionExpression: CAdditionExpression, parsing.FurSubtractionExpression: CSubtractionExpression,