+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),
+ )
+