-CInfixDeclaration = collections.namedtuple(
- 'CInfixDeclaration',
- [
- 'name',
- 'in_type',
- 'out_type',
- 'operator',
- ],
-)
-
-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='*'),
- '//': CInfixDeclaration(name='integerDivide', in_type='integer', out_type='integer', operator='/'),
- '%': CInfixDeclaration(name='modularDivide', in_type='integer', out_type='integer', operator='%'),
- 'and': CInfixDeclaration(name='and', in_type='boolean', out_type='boolean', operator='&&'),
- 'or': CInfixDeclaration(name='or', in_type='boolean', out_type='boolean', operator='||'),
- '==': CInfixDeclaration(name='equals', in_type='integer', out_type='boolean', operator='=='),
- '!=': CInfixDeclaration(name='notEquals', in_type='integer', out_type='boolean', operator='!='),
- '<=': CInfixDeclaration(name='lessThanOrEqual', in_type='integer', out_type='boolean', operator='<='),
- '>=': CInfixDeclaration(name='greaterThanOrEqual', in_type='integer', out_type='boolean', operator='>='),
- '<': CInfixDeclaration(name='lessThan', in_type='integer', out_type='boolean', operator='<'),
- '>': CInfixDeclaration(name='greaterThan', in_type='integer', out_type='boolean', operator='>'),
-}
-
-def transform_infix_operator_without_c_equivalent(accumulators, expression):
- return CFunctionCallForFurInfixOperator(
- metadata=expression.metadata,
- name='concatenate',
- )
-
-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)
-
- accumulators.operator_set.add(FUR_INFIX_OPERATOR_TO_C_INFIX_OPERATOR[expression.operator])
-
- return CFunctionCallForFurInfixOperator(
- metadata=expression.metadata,
- name=FUR_INFIX_OPERATOR_TO_C_INFIX_OPERATOR[expression.operator].name,
- )
-