5 CIntegerLiteral = collections.namedtuple(
12 CStringLiteral = collections.namedtuple(
19 CAdditionExpression = collections.namedtuple(
20 'CAdditionExpression',
27 CSubtractionExpression = collections.namedtuple(
28 'CSubtractionExpression',
35 CMultiplicationExpression = collections.namedtuple(
36 'CMultiplicationExpression',
43 CIntegerDivisionExpression = collections.namedtuple(
44 'CIntegerDivisionExpression',
51 CModularDivisionExpression = collections.namedtuple(
52 'CModularDivisionExpression',
59 CFunctionCallExpression = collections.namedtuple(
60 'CFunctionCallExpression',
67 CProgram = collections.namedtuple(
81 def transform_expression(builtin_dependencies, expression):
82 if isinstance(expression, parsing.FurFunctionCallExpression):
83 return transform_function_call_expression(builtin_dependencies, expression)
85 LITERAL_TYPE_MAPPING = {
86 parsing.FurIntegerLiteralExpression: CIntegerLiteral,
87 parsing.FurStringLiteralExpression: CStringLiteral,
90 if type(expression) in LITERAL_TYPE_MAPPING:
91 return LITERAL_TYPE_MAPPING[type(expression)](value=expression.value)
93 INFIX_TYPE_MAPPING = {
94 parsing.FurAdditionExpression: CAdditionExpression,
95 parsing.FurSubtractionExpression: CSubtractionExpression,
96 parsing.FurMultiplicationExpression: CMultiplicationExpression,
97 parsing.FurIntegerDivisionExpression: CIntegerDivisionExpression,
98 parsing.FurModularDivisionExpression: CModularDivisionExpression,
101 return INFIX_TYPE_MAPPING[type(expression)](
102 left=transform_expression(builtin_dependencies, expression.left),
103 right=transform_expression(builtin_dependencies, expression.right),
106 def transform_function_call_expression(builtin_dependencies, function_call):
107 if function_call.name in BUILTINS.keys():
108 builtin_dependencies.add(function_call.name)
110 return CFunctionCallExpression(
111 name='builtin$' + function_call.name,
112 arguments=tuple(transform_expression(builtin_dependencies, arg) for arg in function_call.arguments),
117 def transform(program):
121 transform_function_call_expression(builtins, statement) for statement in program.statement_list
124 standard_libraries = set()
125 for builtin in builtins:
126 for standard_library in BUILTINS[builtin]:
127 standard_libraries.add(standard_library)
131 statements=c_statements,
132 standard_libraries=standard_libraries,
136 if __name__ == '__main__':