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_infix_expression(counter, expression):
118 # TODO Unfake this normalization
120 '+': normalize_basic_infix_operation,
121 '-': normalize_basic_infix_operation,
122 '*': normalize_basic_infix_operation,
123 '//': normalize_basic_infix_operation,
124 '%': normalize_basic_infix_operation,
125 '==': fake_normalization,
126 '<=': fake_normalization,
127 '>=': fake_normalization,
128 '!=': fake_normalization,
129 '<': fake_normalization,
130 '>': fake_normalization,
131 'and': fake_normalization,
132 'or': fake_normalization,
133 }[expression.operator](counter, expression)
135 def normalize_expression(counter, expression):
137 parsing.FurFunctionCallExpression: normalize_function_call_expression,
138 parsing.FurInfixExpression: normalize_infix_expression,
139 parsing.FurIntegerLiteralExpression: fake_normalization,
140 parsing.FurNegationExpression: fake_normalization, # TODO Don't fake this
141 parsing.FurParenthesizedExpression: fake_normalization, # TODO Don't fake this
142 parsing.FurStringLiteralExpression: fake_normalization,
143 parsing.FurSymbolExpression: fake_normalization,
144 }[type(expression)](counter, expression)
146 def normalize_expression_statement(counter, statement):
147 counter, prestatements, normalized = {
148 parsing.FurFunctionCallExpression: normalize_function_call_expression,
149 }[type(statement.expression)](counter, statement.expression)
154 NormalExpressionStatement(expression=normalized),
157 def normalize_statement(counter, statement):
159 parsing.FurExpressionStatement: normalize_expression_statement,
160 parsing.FurAssignmentStatement: fake_normalization,
161 }[type(statement)](counter, statement)
163 def normalize(program):
167 for statement in program.statement_list:
168 counter, prestatements, normalized = normalize_statement(counter, statement)
169 for s in prestatements:
170 statement_list.append(s)
171 statement_list.append(normalized)
173 return NormalProgram(
174 statement_list=statement_list,