5 CIntegerLiteral = collections.namedtuple(
12 CStringLiteral = collections.namedtuple(
19 CNegationExpression = collections.namedtuple(
20 'CNegationExpression',
26 CAdditionExpression = collections.namedtuple(
27 'CAdditionExpression',
34 CSubtractionExpression = collections.namedtuple(
35 'CSubtractionExpression',
42 CMultiplicationExpression = collections.namedtuple(
43 'CMultiplicationExpression',
50 CIntegerDivisionExpression = collections.namedtuple(
51 'CIntegerDivisionExpression',
58 CModularDivisionExpression = collections.namedtuple(
59 'CModularDivisionExpression',
66 CFunctionCallExpression = collections.namedtuple(
67 'CFunctionCallExpression',
74 CProgram = collections.namedtuple(
88 def transform_expression(builtin_dependencies, expression):
89 if isinstance(expression, parsing.FurNegationExpression):
90 return transform_negation_expression(builtin_dependencies, expression)
92 if isinstance(expression, parsing.FurFunctionCallExpression):
93 return transform_function_call_expression(builtin_dependencies, expression)
95 LITERAL_TYPE_MAPPING = {
96 parsing.FurIntegerLiteralExpression: CIntegerLiteral,
97 parsing.FurStringLiteralExpression: CStringLiteral,
100 if type(expression) in LITERAL_TYPE_MAPPING:
101 return LITERAL_TYPE_MAPPING[type(expression)](value=expression.value)
103 INFIX_TYPE_MAPPING = {
104 parsing.FurAdditionExpression: CAdditionExpression,
105 parsing.FurSubtractionExpression: CSubtractionExpression,
106 parsing.FurMultiplicationExpression: CMultiplicationExpression,
107 parsing.FurIntegerDivisionExpression: CIntegerDivisionExpression,
108 parsing.FurModularDivisionExpression: CModularDivisionExpression,
111 return INFIX_TYPE_MAPPING[type(expression)](
112 left=transform_expression(builtin_dependencies, expression.left),
113 right=transform_expression(builtin_dependencies, expression.right),
116 def transform_negation_expression(builtin_dependencies, negation_expression):
117 return CNegationExpression(value=transform_expression(builtin_dependencies, negation_expression.value))
119 def transform_function_call_expression(builtin_dependencies, function_call):
120 if function_call.name in BUILTINS.keys():
121 builtin_dependencies.add(function_call.name)
123 return CFunctionCallExpression(
124 name='builtin$' + function_call.name,
125 arguments=tuple(transform_expression(builtin_dependencies, arg) for arg in function_call.arguments),
130 def transform(program):
134 transform_function_call_expression(builtins, statement) for statement in program.statement_list
137 standard_libraries = set()
138 for builtin in builtins:
139 for standard_library in BUILTINS[builtin]:
140 standard_libraries.add(standard_library)
144 statements=c_statements,
145 standard_libraries=standard_libraries,
149 if __name__ == '__main__':