5 CIntegerLiteral = collections.namedtuple(
12 CStringLiteral = collections.namedtuple(
19 CConstantExpression = collections.namedtuple(
20 'CConstantExpression',
26 CSymbolExpression = collections.namedtuple(
34 CNegationExpression = collections.namedtuple(
35 'CNegationExpression',
41 CAdditionExpression = collections.namedtuple(
42 'CAdditionExpression',
49 CSubtractionExpression = collections.namedtuple(
50 'CSubtractionExpression',
57 CMultiplicationExpression = collections.namedtuple(
58 'CMultiplicationExpression',
65 CIntegerDivisionExpression = collections.namedtuple(
66 'CIntegerDivisionExpression',
73 CModularDivisionExpression = collections.namedtuple(
74 'CModularDivisionExpression',
81 CFunctionCallExpression = collections.namedtuple(
82 'CFunctionCallExpression',
89 CAssignmentStatement = collections.namedtuple(
90 'CAssignmentStatement',
93 'target_symbol_list_index',
98 CProgram = collections.namedtuple(
103 'standard_libraries',
111 'print': ['stdio.h'],
115 def transform_expression(builtin_dependencies, symbol_list, expression):
116 if isinstance(expression, parsing.FurNegationExpression):
117 return transform_negation_expression(builtin_dependencies, symbol_list, expression)
119 if isinstance(expression, parsing.FurFunctionCallExpression):
120 return transform_function_call_expression(builtin_dependencies, symbol_list, expression)
122 if isinstance(expression, parsing.FurSymbolExpression):
123 if expression.value in ['true', 'false']:
124 return CConstantExpression(value=expression.value)
126 if expression.value not in symbol_list:
127 symbol_list.append(expression.value)
129 return CSymbolExpression(
130 symbol=expression.value,
131 symbol_list_index=symbol_list.index(expression.value),
134 LITERAL_TYPE_MAPPING = {
135 parsing.FurIntegerLiteralExpression: CIntegerLiteral,
136 parsing.FurStringLiteralExpression: CStringLiteral,
139 if type(expression) in LITERAL_TYPE_MAPPING:
140 return LITERAL_TYPE_MAPPING[type(expression)](value=expression.value)
142 INFIX_TYPE_MAPPING = {
143 parsing.FurAdditionExpression: CAdditionExpression,
144 parsing.FurSubtractionExpression: CSubtractionExpression,
145 parsing.FurMultiplicationExpression: CMultiplicationExpression,
146 parsing.FurIntegerDivisionExpression: CIntegerDivisionExpression,
147 parsing.FurModularDivisionExpression: CModularDivisionExpression,
150 return INFIX_TYPE_MAPPING[type(expression)](
151 left=transform_expression(builtin_dependencies, symbol_list, expression.left),
152 right=transform_expression(builtin_dependencies, symbol_list, expression.right),
155 def transform_assignment_statement(builtin_dependencies, symbol_list, assignment_statement):
156 # TODO Check that target is not a builtin
157 if assignment_statement.target not in symbol_list:
158 symbol_list.append(assignment_statement.target)
160 return CAssignmentStatement(
161 target=assignment_statement.target,
162 target_symbol_list_index=symbol_list.index(assignment_statement.target),
163 expression=transform_expression(
164 builtin_dependencies,
166 assignment_statement.expression,
170 def transform_negation_expression(builtin_dependencies, symbol_list, negation_expression):
171 return CNegationExpression(
172 value=transform_expression(builtin_dependencies, symbol_list, negation_expression.value),
175 def transform_function_call_expression(builtin_dependencies, symbol_list, function_call):
176 if function_call.function.value in BUILTINS.keys():
177 # TODO Check that the builtin is actually callable
178 builtin_dependencies.add(function_call.function.value)
180 return CFunctionCallExpression(
181 name='builtin$' + function_call.function.value,
183 transform_expression(builtin_dependencies, symbol_list, arg)
184 for arg in function_call.arguments
190 def transform_statement(builtin_dependencies, symbol_list, statement):
192 parsing.FurAssignmentStatement: transform_assignment_statement,
193 parsing.FurFunctionCallExpression: transform_function_call_expression,
194 }[type(statement)](builtin_dependencies, symbol_list, statement)
196 def transform(program):
201 transform_statement(builtins, symbol_list, statement) for statement in program.statement_list
204 standard_libraries = set()
205 for builtin in builtins:
206 for standard_library in BUILTINS[builtin]:
207 standard_libraries.add(standard_library)
211 statements=c_statements,
212 standard_libraries=standard_libraries,
213 symbol_list=symbol_list,
217 if __name__ == '__main__':