5 NormalVariableExpression = collections.namedtuple(
6 'NormalVariableExpression',
12 NormalVariableAssignmentStatement = collections.namedtuple(
13 'NormalVariableAssignmentStatement',
20 NormalFunctionCallExpression = collections.namedtuple(
21 'NormalFunctionCallExpression',
28 NormalExpressionStatement = collections.namedtuple(
29 'NormalExpressionStatement',
35 NormalProgram = collections.namedtuple(
42 def normalize_function_call_expression(counter, expression):
46 for argument in expression.arguments:
47 variable = '${}'.format(counter)
48 prestatements.append(NormalVariableAssignmentStatement(
50 expression=argument, # TODO Normalize each argument
52 arguments.append(NormalVariableExpression(
60 NormalFunctionCallExpression(
61 expression.function, # TODO Normalize the function
62 arguments=tuple(arguments),
66 def normalize_statement(counter, statement):
67 if isinstance(statement, parsing.FurExpressionStatement):
68 counter, prestatements, normalized = {
69 parsing.FurFunctionCallExpression: normalize_function_call_expression,
70 }[type(statement.expression)](counter, statement.expression)
75 NormalExpressionStatement(expression=normalized),
78 return (counter, (), statement)
80 def normalize(program):
84 for statement in program.statement_list:
85 counter, prestatements, normalized = normalize_statement(counter, statement)
86 for s in prestatements:
87 statement_list.append(s)
88 statement_list.append(normalized)
91 statement_list=statement_list,