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 fake_normalization(counter, thing):
43 return (counter, (), thing)
45 def normalize_function_call_expression(counter, expression):
46 assert isinstance(expression, parsing.FurFunctionCallExpression)
51 for argument in expression.arguments:
52 counter, argument_prestatements, normalized_argument = normalize_expression(counter, argument)
54 for s in argument_prestatements:
55 prestatements.append(s)
57 variable = '${}'.format(counter)
58 prestatements.append(NormalVariableAssignmentStatement(
60 expression=normalized_argument,
62 arguments.append(NormalVariableExpression(
70 NormalFunctionCallExpression(
71 expression.function, # TODO Normalize the function
72 arguments=tuple(arguments),
76 def normalize_expression(counter, expression):
78 parsing.FurFunctionCallExpression: normalize_function_call_expression,
79 parsing.FurInfixExpression: fake_normalization, # TODO This should not be faked
80 parsing.FurIntegerLiteralExpression: fake_normalization,
81 parsing.FurNegationExpression: fake_normalization,
82 parsing.FurStringLiteralExpression: fake_normalization,
83 parsing.FurSymbolExpression: fake_normalization,
84 }[type(expression)](counter, expression)
86 def normalize_expression_statement(counter, statement):
87 counter, prestatements, normalized = {
88 parsing.FurFunctionCallExpression: normalize_function_call_expression,
89 }[type(statement.expression)](counter, statement.expression)
94 NormalExpressionStatement(expression=normalized),
97 def normalize_statement(counter, statement):
99 parsing.FurExpressionStatement: normalize_expression_statement,
100 parsing.FurAssignmentStatement: fake_normalization,
101 }[type(statement)](counter, statement)
103 def normalize(program):
107 for statement in program.statement_list:
108 counter, prestatements, normalized = normalize_statement(counter, statement)
109 for s in prestatements:
110 statement_list.append(s)
111 statement_list.append(normalized)
113 return NormalProgram(
114 statement_list=statement_list,