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 CFunctionCallStatement = collections.namedtuple(
60 'CFunctionCallStatement',
67 CProgram = collections.namedtuple(
77 'print': ['stdio.h.'],
80 def transform_expression(builtin_dependencies, expression):
82 LITERAL_TYPE_MAPPING = {
83 parsing.FurIntegerLiteralExpression: CIntegerLiteral,
84 parsing.FurStringLiteralExpression: CStringLiteral,
87 if type(expression) in LITERAL_TYPE_MAPPING:
88 return LITERAL_TYPE_MAPPING[type(expression)](value=expression.value)
90 INFIX_TYPE_MAPPING = {
91 parsing.FurAdditionExpression: CAdditionExpression,
92 parsing.FurSubtractionExpression: CSubtractionExpression,
93 parsing.FurMultiplicationExpression: CMultiplicationExpression,
94 parsing.FurIntegerDivisionExpression: CIntegerDivisionExpression,
95 parsing.FurModularDivisionExpression: CModularDivisionExpression,
98 return INFIX_TYPE_MAPPING[type(expression)](
99 left=transform_expression(builtin_dependencies, expression.left),
100 right=transform_expression(builtin_dependencies, expression.right),
103 def transform_function_call_statement(builtin_dependencies, function_call):
104 if function_call.name in BUILTINS.keys():
105 builtin_dependencies.add(function_call.name)
107 return CFunctionCallStatement(
108 name='builtin$' + function_call.name,
109 arguments=tuple(transform_expression(builtin_dependencies, arg) for arg in function_call.arguments),
114 def transform(program):
118 transform_function_call_statement(builtins, statement) for statement in program.statement_list
121 standard_libraries = set()
122 for builtin in builtins:
123 for standard_library in BUILTINS[builtin]:
124 standard_libraries.add(standard_library)
128 statements=c_statements,
129 standard_libraries=standard_libraries,
133 if __name__ == '__main__':