-def transform_equality_level_expression(builtin_dependencies, symbol_list, expression):
- # Transform expressions like 1 < 2 < 3 into expressions like 1 < 2 && 2 < 3
- if isinstance(expression.left, parsing.FurEqualityLevelExpression):
- 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_OPERATOR_MAPPING[expression.operator](
- left=middle,
- right=right,
- ),
- )
-
- return EQUALITY_LEVEL_OPERATOR_MAPPING[expression.operator](
- left=transform_expression(builtin_dependencies, symbol_list, expression.left),
- right=transform_expression(builtin_dependencies, symbol_list, expression.right),
+def transform_variable_expression(accumulators, expression):
+ assert isinstance(expression, conversion.CPSVariableExpression)
+ return CVariableExpression(variable=expression.variable)
+
+def transform_string_literal_expression(accumulators, expression):
+ value = expression.string
+
+ try:
+ index = accumulators.string_literal_list.index(value)
+ except ValueError:
+ index = len(accumulators.string_literal_list)
+ accumulators.string_literal_list.append(value)
+
+ return CStringLiteral(index=index, value=value)
+
+def transform_symbol_expression(accumulators, expression):
+ if expression.symbol in BUILTINS:
+ accumulators.builtin_set.add(expression.symbol)
+
+ try:
+ symbol_list_index = accumulators.symbol_list.index(expression.symbol)
+ except ValueError:
+ symbol_list_index = len(accumulators.symbol_list)
+ accumulators.symbol_list.append(expression.symbol)
+
+ return CSymbolExpression(
+ symbol=expression.symbol,
+ symbol_list_index=symbol_list_index,