5 CIntegerLiteral = collections.namedtuple(
12 CStringLiteral = collections.namedtuple(
19 CSymbolExpression = collections.namedtuple(
26 CNegationExpression = collections.namedtuple(
27 'CNegationExpression',
33 CAdditionExpression = collections.namedtuple(
34 'CAdditionExpression',
41 CSubtractionExpression = collections.namedtuple(
42 'CSubtractionExpression',
49 CMultiplicationExpression = collections.namedtuple(
50 'CMultiplicationExpression',
57 CIntegerDivisionExpression = collections.namedtuple(
58 'CIntegerDivisionExpression',
65 CModularDivisionExpression = collections.namedtuple(
66 'CModularDivisionExpression',
73 CFunctionCallExpression = collections.namedtuple(
74 'CFunctionCallExpression',
81 CAssignmentStatement = collections.namedtuple(
82 'CAssignmentStatement',
89 CProgram = collections.namedtuple(
100 'print': ['stdio.h'],
103 def transform_expression(builtin_dependencies, expression):
104 if isinstance(expression, parsing.FurNegationExpression):
105 return transform_negation_expression(builtin_dependencies, expression)
107 if isinstance(expression, parsing.FurFunctionCallExpression):
108 return transform_function_call_expression(builtin_dependencies, expression)
110 LITERAL_TYPE_MAPPING = {
111 parsing.FurIntegerLiteralExpression: CIntegerLiteral,
112 parsing.FurStringLiteralExpression: CStringLiteral,
113 parsing.FurSymbolExpression: CSymbolExpression,
116 if type(expression) in LITERAL_TYPE_MAPPING:
117 return LITERAL_TYPE_MAPPING[type(expression)](value=expression.value)
119 INFIX_TYPE_MAPPING = {
120 parsing.FurAdditionExpression: CAdditionExpression,
121 parsing.FurSubtractionExpression: CSubtractionExpression,
122 parsing.FurMultiplicationExpression: CMultiplicationExpression,
123 parsing.FurIntegerDivisionExpression: CIntegerDivisionExpression,
124 parsing.FurModularDivisionExpression: CModularDivisionExpression,
127 return INFIX_TYPE_MAPPING[type(expression)](
128 left=transform_expression(builtin_dependencies, expression.left),
129 right=transform_expression(builtin_dependencies, expression.right),
132 def transform_assignment_statement(builtin_dependencies, assignment_statement):
133 # TODO Check that target is not a builtin
134 return CAssignmentStatement(
135 target=assignment_statement.target,
136 expression=transform_expression(builtin_dependencies, assignment_statement.expression),
139 def transform_negation_expression(builtin_dependencies, negation_expression):
140 return CNegationExpression(value=transform_expression(builtin_dependencies, negation_expression.value))
142 def transform_function_call_expression(builtin_dependencies, function_call):
143 if function_call.function.value in BUILTINS.keys():
144 builtin_dependencies.add(function_call.function.value)
146 return CFunctionCallExpression(
147 name='builtin$' + function_call.function.value,
148 arguments=tuple(transform_expression(builtin_dependencies, arg) for arg in function_call.arguments),
153 def transform_statement(builtin_dependencies, statement):
155 parsing.FurAssignmentStatement: transform_assignment_statement,
156 parsing.FurFunctionCallExpression: transform_function_call_expression,
157 }[type(statement)](builtin_dependencies, statement)
159 def transform(program):
163 transform_statement(builtins, statement) for statement in program.statement_list
166 standard_libraries = set()
167 for builtin in builtins:
168 for standard_library in BUILTINS[builtin]:
169 standard_libraries.add(standard_library)
173 statements=c_statements,
174 standard_libraries=standard_libraries,
178 if __name__ == '__main__':