5 NormalVariableExpression = collections.namedtuple(
6 'NormalVariableExpression',
12 NormalInfixExpression = collections.namedtuple(
13 'NormalInfixExpression',
22 NormalFunctionCallExpression = collections.namedtuple(
23 'NormalFunctionCallExpression',
30 NormalVariableAssignmentStatement = collections.namedtuple(
31 'NormalVariableAssignmentStatement',
38 NormalExpressionStatement = collections.namedtuple(
39 'NormalExpressionStatement',
45 NormalProgram = collections.namedtuple(
52 def fake_normalization(counter, thing):
53 return (counter, (), thing)
55 def normalize_function_call_expression(counter, expression):
56 assert isinstance(expression, parsing.FurFunctionCallExpression)
61 for argument in expression.arguments:
62 counter, argument_prestatements, normalized_argument = normalize_expression(counter, argument)
64 for s in argument_prestatements:
65 prestatements.append(s)
67 variable = '${}'.format(counter)
68 prestatements.append(NormalVariableAssignmentStatement(
70 expression=normalized_argument,
72 arguments.append(NormalVariableExpression(
80 NormalFunctionCallExpression(
81 expression.function, # TODO Normalize the function
82 arguments=tuple(arguments),
86 def normalize_basic_infix_operation(counter, expression):
87 counter, left_prestatements, left_expression = normalize_expression(counter, expression.left)
88 counter, right_prestatements, right_expression = normalize_expression(counter, expression.right)
90 left_variable = '${}'.format(counter)
92 right_variable = '${}'.format(counter)
95 root_prestatements = (
96 NormalVariableAssignmentStatement(
97 variable=left_variable,
98 expression=left_expression,
100 NormalVariableAssignmentStatement(
101 variable=right_variable,
102 expression=right_expression,
108 left_prestatements + right_prestatements + root_prestatements,
109 NormalInfixExpression(
110 order=expression.order, # TODO Do we need this?
111 operator=expression.operator,
112 left=NormalVariableExpression(variable=left_variable),
113 right=NormalVariableExpression(variable=right_variable),
117 def normalize_comparison_expression(counter, expression):
119 return fake_normalization(counter, expression)
121 def normalize_boolean_expression(counter, expression):
123 return fake_normalization(counter, expression)
125 def normalize_infix_expression(counter, expression):
127 'multiplication_level': normalize_basic_infix_operation,
128 'addition_level': normalize_basic_infix_operation,
129 'comparison_level': normalize_comparison_expression,
130 'and_level': normalize_boolean_expression,
131 'or_level': normalize_boolean_expression,
132 }[expression.order](counter, expression)
134 def normalize_expression(counter, expression):
136 parsing.FurFunctionCallExpression: normalize_function_call_expression,
137 parsing.FurInfixExpression: normalize_infix_expression,
138 parsing.FurIntegerLiteralExpression: fake_normalization,
139 parsing.FurNegationExpression: fake_normalization, # TODO Don't fake this
140 parsing.FurParenthesizedExpression: fake_normalization, # TODO Don't fake this
141 parsing.FurStringLiteralExpression: fake_normalization,
142 parsing.FurSymbolExpression: fake_normalization,
143 }[type(expression)](counter, expression)
145 def normalize_expression_statement(counter, statement):
146 counter, prestatements, normalized = {
147 parsing.FurFunctionCallExpression: normalize_function_call_expression,
148 }[type(statement.expression)](counter, statement.expression)
153 NormalExpressionStatement(expression=normalized),
156 def normalize_statement(counter, statement):
158 parsing.FurExpressionStatement: normalize_expression_statement,
159 parsing.FurAssignmentStatement: fake_normalization,
160 }[type(statement)](counter, statement)
162 def normalize(program):
166 for statement in program.statement_list:
167 counter, prestatements, normalized = normalize_statement(counter, statement)
168 for s in prestatements:
169 statement_list.append(s)
170 statement_list.append(normalized)
172 return NormalProgram(
173 statement_list=statement_list,