5 CIntegerLiteral = collections.namedtuple(
12 CStringLiteral = collections.namedtuple(
19 CSymbolExpression = collections.namedtuple(
27 CNegationExpression = collections.namedtuple(
28 'CNegationExpression',
34 CAdditionExpression = collections.namedtuple(
35 'CAdditionExpression',
42 CSubtractionExpression = collections.namedtuple(
43 'CSubtractionExpression',
50 CMultiplicationExpression = collections.namedtuple(
51 'CMultiplicationExpression',
58 CIntegerDivisionExpression = collections.namedtuple(
59 'CIntegerDivisionExpression',
66 CModularDivisionExpression = collections.namedtuple(
67 'CModularDivisionExpression',
74 CFunctionCallExpression = collections.namedtuple(
75 'CFunctionCallExpression',
82 CAssignmentStatement = collections.namedtuple(
83 'CAssignmentStatement',
86 'target_symbol_list_index',
91 CProgram = collections.namedtuple(
103 'print': ['stdio.h'],
106 def transform_expression(builtin_dependencies, symbol_list, expression):
107 if isinstance(expression, parsing.FurNegationExpression):
108 return transform_negation_expression(builtin_dependencies, symbol_list, expression)
110 if isinstance(expression, parsing.FurFunctionCallExpression):
111 return transform_function_call_expression(builtin_dependencies, symbol_list, expression)
113 if isinstance(expression, parsing.FurSymbolExpression):
114 if expression.value not in symbol_list:
115 symbol_list.append(expression.value)
117 return CSymbolExpression(
118 symbol=expression.value,
119 symbol_list_index=symbol_list.index(expression.value),
122 LITERAL_TYPE_MAPPING = {
123 parsing.FurIntegerLiteralExpression: CIntegerLiteral,
124 parsing.FurStringLiteralExpression: CStringLiteral,
127 if type(expression) in LITERAL_TYPE_MAPPING:
128 return LITERAL_TYPE_MAPPING[type(expression)](value=expression.value)
130 INFIX_TYPE_MAPPING = {
131 parsing.FurAdditionExpression: CAdditionExpression,
132 parsing.FurSubtractionExpression: CSubtractionExpression,
133 parsing.FurMultiplicationExpression: CMultiplicationExpression,
134 parsing.FurIntegerDivisionExpression: CIntegerDivisionExpression,
135 parsing.FurModularDivisionExpression: CModularDivisionExpression,
138 return INFIX_TYPE_MAPPING[type(expression)](
139 left=transform_expression(builtin_dependencies, symbol_list, expression.left),
140 right=transform_expression(builtin_dependencies, symbol_list, expression.right),
143 def transform_assignment_statement(builtin_dependencies, symbol_list, assignment_statement):
144 # TODO Check that target is not a builtin
145 if assignment_statement.target not in symbol_list:
146 symbol_list.append(assignment_statement.target)
148 return CAssignmentStatement(
149 target=assignment_statement.target,
150 target_symbol_list_index=symbol_list.index(assignment_statement.target),
151 expression=transform_expression(
152 builtin_dependencies,
154 assignment_statement.expression,
158 def transform_negation_expression(builtin_dependencies, symbol_list, negation_expression):
159 return CNegationExpression(
160 value=transform_expression(builtin_dependencies, symbol_list, negation_expression.value),
163 def transform_function_call_expression(builtin_dependencies, symbol_list, function_call):
164 if function_call.function.value in BUILTINS.keys():
165 builtin_dependencies.add(function_call.function.value)
167 return CFunctionCallExpression(
168 name='builtin$' + function_call.function.value,
170 transform_expression(builtin_dependencies, symbol_list, arg)
171 for arg in function_call.arguments
177 def transform_statement(builtin_dependencies, symbol_list, statement):
179 parsing.FurAssignmentStatement: transform_assignment_statement,
180 parsing.FurFunctionCallExpression: transform_function_call_expression,
181 }[type(statement)](builtin_dependencies, symbol_list, statement)
183 def transform(program):
188 transform_statement(builtins, symbol_list, statement) for statement in program.statement_list
191 standard_libraries = set()
192 for builtin in builtins:
193 for standard_library in BUILTINS[builtin]:
194 standard_libraries.add(standard_library)
198 statements=c_statements,
199 standard_libraries=standard_libraries,
200 symbol_list=symbol_list,
204 if __name__ == '__main__':