6 NormalVariableExpression = collections.namedtuple(
7 'NormalVariableExpression',
13 NormalIntegerLiteralExpression = collections.namedtuple(
14 'NormalIntegerLiteralExpression',
20 NormalLambdaExpression = collections.namedtuple(
21 'NormalLambdaExpression',
29 NormalStringLiteralExpression = collections.namedtuple(
30 'NormalStringLiteralExpression',
36 NormalSymbolExpression = collections.namedtuple(
37 'NormalSymbolExpression',
43 NormalPushStatement = collections.namedtuple(
44 'NormalPushStatement',
50 NormalFunctionCallExpression = collections.namedtuple(
51 'NormalFunctionCallExpression',
54 'function_expression',
59 NormalArrayVariableInitializationStatement = collections.namedtuple(
60 'NormalArrayVariableInitializationStatement',
67 NormalSymbolArrayVariableInitializationStatement = collections.namedtuple(
68 'NormalSymbolArrayVariableInitializationStatement',
75 NormalVariableInitializationStatement = collections.namedtuple(
76 'NormalVariableInitializationStatement',
83 NormalExpressionStatement = collections.namedtuple(
84 'NormalExpressionStatement',
90 NormalAssignmentStatement = collections.namedtuple(
91 'NormalAssignmentStatement',
98 NormalIfElseExpression = collections.namedtuple(
99 'NormalIfElseExpression',
101 'condition_expression',
103 'else_statement_list',
107 NormalProgram = collections.namedtuple(
114 def normalize_integer_literal_expression(counter, expression):
118 NormalIntegerLiteralExpression(integer=expression.integer),
121 def normalize_lambda_expression(counter, expression):
122 variable = '${}'.format(counter)
124 _, statement_list = normalize_statement_list(
126 expression.statement_list,
132 NormalVariableInitializationStatement(
134 expression=NormalLambdaExpression(
135 name=expression.name,
136 argument_name_list=expression.argument_name_list,
137 statement_list=statement_list,
141 NormalVariableExpression(variable=variable),
144 NormalListConstructExpression = collections.namedtuple(
145 'NormalListConstructExpression',
151 NormalListAppendStatement = collections.namedtuple(
152 'NormalListAppendStatement',
159 def normalize_list_literal_expression(counter, expression):
160 list_variable = '${}'.format(counter)
164 NormalVariableInitializationStatement(
165 variable=list_variable,
166 expression=NormalListConstructExpression(allocate=len(expression.item_expression_list)),
170 list_expression = NormalVariableExpression(variable=list_variable)
172 for item_expression in expression.item_expression_list:
173 counter, item_expression_prestatements, normalized = normalize_expression(
178 for p in item_expression_prestatements:
179 prestatements.append(p)
181 prestatements.append(
182 NormalListAppendStatement(
183 list_expression=list_expression,
184 item_expression=normalized,
190 tuple(prestatements),
194 def normalize_string_literal_expression(counter, expression):
198 NormalStringLiteralExpression(string=expression.string),
201 NormalStructureLiteralExpression = collections.namedtuple(
202 'NormalStructureLiteralExpression',
205 'symbol_list_variable',
206 'value_list_variable',
210 def normalize_structure_literal_expression(counter, expression):
212 field_symbol_array = []
213 field_value_array = []
215 for symbol_expression_pair in expression.fields:
216 counter, field_prestatements, field_expression = normalize_expression(
218 symbol_expression_pair.expression,
221 for p in field_prestatements:
222 prestatements.append(p)
224 field_symbol_array.append(symbol_expression_pair.symbol)
225 field_value_array.append(field_expression)
227 symbol_array_variable = '${}'.format(counter)
230 prestatements.append(
231 NormalSymbolArrayVariableInitializationStatement(
232 variable=symbol_array_variable,
233 symbol_list=tuple(field_symbol_array),
237 value_array_variable = '${}'.format(counter)
240 prestatements.append(
241 NormalArrayVariableInitializationStatement(
242 variable=value_array_variable,
243 items=tuple(field_value_array),
247 variable = '${}'.format(counter)
249 prestatements.append(
250 NormalVariableInitializationStatement(
252 expression=NormalStructureLiteralExpression(
253 field_count=len(expression.fields),
254 symbol_list_variable=symbol_array_variable,
255 value_list_variable=value_array_variable,
262 tuple(prestatements),
263 NormalVariableExpression(variable=variable),
267 def normalize_symbol_expression(counter, expression):
271 NormalSymbolExpression(symbol=expression.symbol),
274 def normalize_function_call_expression(counter, expression):
277 for argument in expression.argument_list:
278 counter, argument_prestatements, normalized_argument = normalize_expression(counter, argument)
280 for s in argument_prestatements:
281 prestatements.append(s)
283 prestatements.append(
285 expression=normalized_argument,
289 counter, function_prestatements, function_expression = normalize_expression(
294 for ps in function_prestatements:
295 prestatements.append(ps)
297 result_variable = '${}'.format(counter)
299 prestatements.append(
300 NormalVariableInitializationStatement(
301 variable=result_variable,
302 expression=NormalFunctionCallExpression(
303 metadata=expression.metadata,
304 function_expression=function_expression,
305 argument_count=len(expression.argument_list),
312 tuple(prestatements),
313 NormalVariableExpression(variable=result_variable),
316 def normalize_if_expression(counter, expression):
317 counter, condition_prestatements, condition_expression = normalize_expression(
319 expression.condition_expression,
322 counter, if_statement_list = normalize_statement_list(
324 expression.if_statement_list,
326 counter, else_statement_list = normalize_statement_list(
328 expression.else_statement_list,
333 condition_prestatements,
334 NormalIfElseExpression(
335 condition_expression=condition_expression,
336 if_statement_list=if_statement_list,
337 else_statement_list=else_statement_list,
341 def normalize_expression(counter, expression):
343 desugaring.DesugaredFunctionCallExpression: normalize_function_call_expression,
344 desugaring.DesugaredIfExpression: normalize_if_expression,
345 desugaring.DesugaredIntegerLiteralExpression: normalize_integer_literal_expression,
346 desugaring.DesugaredLambdaExpression: normalize_lambda_expression,
347 desugaring.DesugaredListLiteralExpression: normalize_list_literal_expression,
348 desugaring.DesugaredStringLiteralExpression: normalize_string_literal_expression,
349 desugaring.DesugaredStructureLiteralExpression: normalize_structure_literal_expression,
350 desugaring.DesugaredSymbolExpression: normalize_symbol_expression,
351 }[type(expression)](counter, expression)
353 def normalize_expression_statement(counter, statement):
354 # TODO Normalized will be a NormalVariableExpression, which will go unused
355 # for expression statements in every case except when it's a return
356 # statement. This cases warnings on C compilation. We should only generate
357 # this variable when it will be used on return.
358 counter, prestatements, normalized = normalize_expression(counter, statement.expression)
363 NormalExpressionStatement(expression=normalized),
366 def normalize_assignment_statement(counter, statement):
367 counter, prestatements, normalized_expression = normalize_expression(counter, statement.expression)
371 NormalAssignmentStatement(
372 target=statement.target,
373 expression=normalized_expression,
377 def normalize_statement(counter, statement):
379 desugaring.DesugaredAssignmentStatement: normalize_assignment_statement,
380 desugaring.DesugaredExpressionStatement: normalize_expression_statement,
381 }[type(statement)](counter, statement)
383 @util.force_generator(tuple)
384 def normalize_statement_list(counter, statement_list):
385 result_statement_list = []
387 for statement in statement_list:
388 counter, prestatements, normalized = normalize_statement(counter, statement)
389 for s in prestatements:
390 result_statement_list.append(s)
391 result_statement_list.append(normalized)
395 result_statement_list,
398 def normalize(program):
399 _, statement_list = normalize_statement_list(0, program.statement_list)
401 return NormalProgram(
402 statement_list=statement_list,