- if isinstance(expression, parsing.FurParenthesizedExpression):
- # Parentheses can be removed because everything in the C output is explicitly parenthesized
- return transform_expression(accumulators, expression.internal)
-
- if isinstance(expression, parsing.FurNegationExpression):
- return transform_negation_expression(accumulators, expression)
-
- if isinstance(expression, parsing.FurFunctionCallExpression):
- return transform_function_call_expression(accumulators, expression)
-
- if isinstance(expression, parsing.FurSymbolExpression):
- if expression.value in ['true', 'false']:
- return CConstantExpression(value=expression.value)
-
- if expression.value not in accumulators.symbol_list:
- symbol_list.append(expression.value)
-
- return CSymbolExpression(
- symbol=expression.value,
- symbol_list_index=accumulators.symbol_list.index(expression.value),
- )
-
- LITERAL_TYPE_MAPPING = {
- parsing.FurIntegerLiteralExpression: CIntegerLiteral,
- parsing.FurStringLiteralExpression: CStringLiteral,
- }
-
- if type(expression) in LITERAL_TYPE_MAPPING:
- return LITERAL_TYPE_MAPPING[type(expression)](value=expression.value)
-
- if isinstance(expression, parsing.FurInfixExpression):
- if expression.order == 'equality_level':
- return transform_equality_level_expression(accumulators, expression)
-
- INFIX_OPERATOR_TO_FUNCTION_NAME = {
- '+': 'add',
- '-': 'subtract',
- '*': 'multiply',
- '//': 'integerDivide',
- '%': 'modularDivide',
- 'and': 'and',
- 'or': 'or',
- }
-
- return CFunctionCallForFurInfixOperator(
- name=INFIX_OPERATOR_TO_FUNCTION_NAME[expression.operator],
- left=transform_expression(accumulators, expression.left),
- right=transform_expression(accumulators, expression.right),
- )
-
- raise Exception('Could not transform expression "{}"'.format(expression))
-
-def transform_assignment_statement(accumulators, assignment_statement):
+ return {
+ conversion.CPSFunctionCallExpression: transform_function_call_expression,
+ conversion.CPSIntegerLiteralExpression: transform_integer_literal_expression,
+ conversion.CPSLambdaExpression: transform_lambda_expression,
+ conversion.CPSListConstructExpression: transform_list_construct_expression,
+ conversion.CPSStructureLiteralExpression: transform_structure_literal_expression,
+ conversion.CPSStringLiteralExpression: transform_string_literal_expression,
+ conversion.CPSSymbolExpression: transform_symbol_expression,
+ conversion.CPSVariableExpression: transform_variable_expression,
+ }[type(expression)](accumulators, expression)
+
+def transform_symbol_assignment_statement(accumulators, assignment_statement):