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 NormalVariableReassignmentStatement = collections.namedtuple(
84 'NormalVariableReassignmentStatement',
91 NormalExpressionStatement = collections.namedtuple(
92 'NormalExpressionStatement',
98 NormalAssignmentStatement = collections.namedtuple(
99 'NormalAssignmentStatement',
106 NormalIfElseStatement = collections.namedtuple(
107 'NormalIfElseStatement',
109 'condition_expression',
111 'else_statement_list',
115 NormalProgram = collections.namedtuple(
122 def normalize_integer_literal_expression(counter, expression):
123 variable = '${}'.format(counter)
127 NormalVariableInitializationStatement(
129 expression=NormalIntegerLiteralExpression(integer=expression.integer),
132 NormalVariableExpression(variable=variable),
135 def normalize_lambda_expression(counter, expression):
136 variable = '${}'.format(counter)
138 _, statement_list = normalize_statement_list(
140 expression.statement_list,
141 assign_result_to='result',
147 NormalVariableInitializationStatement(
149 expression=NormalLambdaExpression(
150 name=expression.name,
151 argument_name_list=expression.argument_name_list,
152 statement_list=statement_list,
156 NormalVariableExpression(variable=variable),
159 NormalListConstructExpression = collections.namedtuple(
160 'NormalListConstructExpression',
166 NormalListAppendStatement = collections.namedtuple(
167 'NormalListAppendStatement',
174 def normalize_list_literal_expression(counter, expression):
175 list_variable = '${}'.format(counter)
179 NormalVariableInitializationStatement(
180 variable=list_variable,
181 expression=NormalListConstructExpression(allocate=len(expression.item_expression_list)),
185 list_expression = NormalVariableExpression(variable=list_variable)
187 for item_expression in expression.item_expression_list:
188 counter, item_expression_prestatements, normalized = normalize_expression(
193 for p in item_expression_prestatements:
194 prestatements.append(p)
196 prestatements.append(
197 NormalListAppendStatement(
198 list_expression=list_expression,
199 item_expression=normalized,
205 tuple(prestatements),
209 def normalize_string_literal_expression(counter, expression):
213 NormalStringLiteralExpression(string=expression.string),
216 NormalStructureLiteralExpression = collections.namedtuple(
217 'NormalStructureLiteralExpression',
220 'symbol_list_variable',
221 'value_list_variable',
225 def normalize_structure_literal_expression(counter, expression):
227 field_symbol_array = []
228 field_value_array = []
230 for symbol_expression_pair in expression.fields:
231 counter, field_prestatements, field_expression = normalize_expression(
233 symbol_expression_pair.expression,
236 for p in field_prestatements:
237 prestatements.append(p)
239 field_symbol_array.append(symbol_expression_pair.symbol)
240 field_value_array.append(field_expression)
242 symbol_array_variable = '${}'.format(counter)
245 prestatements.append(
246 NormalSymbolArrayVariableInitializationStatement(
247 variable=symbol_array_variable,
248 symbol_list=tuple(field_symbol_array),
252 value_array_variable = '${}'.format(counter)
255 prestatements.append(
256 NormalArrayVariableInitializationStatement(
257 variable=value_array_variable,
258 items=tuple(field_value_array),
262 variable = '${}'.format(counter)
264 prestatements.append(
265 NormalVariableInitializationStatement(
267 expression=NormalStructureLiteralExpression(
268 field_count=len(expression.fields),
269 symbol_list_variable=symbol_array_variable,
270 value_list_variable=value_array_variable,
277 tuple(prestatements),
278 NormalVariableExpression(variable=variable),
282 def normalize_symbol_expression(counter, expression):
283 variable = '${}'.format(counter)
287 NormalVariableInitializationStatement(
289 expression=NormalSymbolExpression(symbol=expression.symbol),
292 NormalVariableExpression(variable=variable),
295 def normalize_function_call_expression(counter, expression):
298 for argument in expression.argument_list:
299 counter, argument_prestatements, normalized_argument = normalize_expression(counter, argument)
301 for s in argument_prestatements:
302 prestatements.append(s)
304 variable = '${}'.format(counter)
305 prestatements.append(
306 NormalVariableInitializationStatement(
308 expression=normalized_argument,
311 prestatements.append(
313 expression=NormalVariableExpression(
320 counter, function_prestatements, function_expression = normalize_expression(
325 for ps in function_prestatements:
326 prestatements.append(ps)
328 if not isinstance(function_expression, NormalVariableExpression):
329 function_variable = '${}'.format(counter)
331 prestatements.append(
332 NormalVariableInitializationStatement(
333 variable=function_variable,
334 expression=function_expression,
338 function_expression = NormalVariableExpression(variable=function_variable)
341 result_variable = '${}'.format(counter)
343 prestatements.append(
344 NormalVariableInitializationStatement(
345 variable=result_variable,
346 expression=NormalFunctionCallExpression(
347 metadata=expression.metadata,
348 function_expression=function_expression,
349 argument_count=len(expression.argument_list),
356 tuple(prestatements),
357 NormalVariableExpression(variable=result_variable),
360 def normalize_if_expression(counter, expression):
361 counter, condition_prestatements, condition_expression = normalize_expression(
363 expression.condition_expression,
366 result_variable = '${}'.format(counter)
369 counter, if_statement_list = normalize_statement_list(
371 expression.if_statement_list,
372 assign_result_to=result_variable,
374 counter, else_statement_list = normalize_statement_list(
376 expression.else_statement_list,
377 assign_result_to=result_variable,
382 condition_prestatements + (
383 NormalVariableInitializationStatement(
384 variable=result_variable,
385 expression=NormalVariableExpression(variable='builtin$nil'),
387 NormalIfElseStatement(
388 condition_expression=condition_expression,
389 if_statement_list=if_statement_list,
390 else_statement_list=else_statement_list,
393 NormalVariableExpression(variable=result_variable),
396 def normalize_expression(counter, expression):
398 desugaring.DesugaredFunctionCallExpression: normalize_function_call_expression,
399 desugaring.DesugaredIfExpression: normalize_if_expression,
400 desugaring.DesugaredIntegerLiteralExpression: normalize_integer_literal_expression,
401 desugaring.DesugaredLambdaExpression: normalize_lambda_expression,
402 desugaring.DesugaredListLiteralExpression: normalize_list_literal_expression,
403 desugaring.DesugaredStringLiteralExpression: normalize_string_literal_expression,
404 desugaring.DesugaredStructureLiteralExpression: normalize_structure_literal_expression,
405 desugaring.DesugaredSymbolExpression: normalize_symbol_expression,
406 }[type(expression)](counter, expression)
408 def normalize_expression_statement(counter, statement):
409 # TODO Normalized will be a NormalVariableExpression, which will go unused
410 # for expression statements in every case except when it's a return
411 # statement. This cases warnings on C compilation. We should only generate
412 # this variable when it will be used on return.
413 counter, prestatements, normalized = normalize_expression(counter, statement.expression)
418 NormalExpressionStatement(expression=normalized),
421 def normalize_assignment_statement(counter, statement):
422 counter, prestatements, normalized_expression = normalize_expression(counter, statement.expression)
426 NormalAssignmentStatement(
427 target=statement.target,
428 expression=normalized_expression,
432 def normalize_statement(counter, statement):
434 desugaring.DesugaredAssignmentStatement: normalize_assignment_statement,
435 desugaring.DesugaredExpressionStatement: normalize_expression_statement,
436 }[type(statement)](counter, statement)
438 @util.force_generator(tuple)
439 def normalize_statement_list(counter, statement_list, **kwargs):
440 assign_result_to = kwargs.pop('assign_result_to', None)
442 assert len(kwargs) == 0
444 result_statement_list = []
446 for statement in statement_list:
447 counter, prestatements, normalized = normalize_statement(counter, statement)
448 for s in prestatements:
449 result_statement_list.append(s)
450 result_statement_list.append(normalized)
452 # TODO The way we fix the last statement is really confusing
453 last_statement = result_statement_list[-1]
455 if isinstance(last_statement, NormalExpressionStatement) and isinstance(last_statement.expression, NormalVariableExpression):
456 if assign_result_to is not None:
457 result_expression = result_statement_list.pop().expression
458 result_statement_list.append(
459 NormalVariableReassignmentStatement(
460 variable=assign_result_to,
461 expression=result_expression,
467 result_statement_list,
470 def normalize(program):
471 _, statement_list = normalize_statement_list(0, program.statement_list)
473 return NormalProgram(
474 statement_list=statement_list,