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 'multiplication_level': normalize_basic_infix_operation,
121 'addition_level': normalize_basic_infix_operation,
122 'comparison_level': fake_normalization,
123 'and_level': fake_normalization,
124 'or_level': fake_normalization,
125 }[expression.order](counter, expression)
127 def normalize_expression(counter, expression):
129 parsing.FurFunctionCallExpression: normalize_function_call_expression,
130 parsing.FurInfixExpression: normalize_infix_expression,
131 parsing.FurIntegerLiteralExpression: fake_normalization,
132 parsing.FurNegationExpression: fake_normalization, # TODO Don't fake this
133 parsing.FurParenthesizedExpression: fake_normalization, # TODO Don't fake this
134 parsing.FurStringLiteralExpression: fake_normalization,
135 parsing.FurSymbolExpression: fake_normalization,
136 }[type(expression)](counter, expression)
138 def normalize_expression_statement(counter, statement):
139 counter, prestatements, normalized = {
140 parsing.FurFunctionCallExpression: normalize_function_call_expression,
141 }[type(statement.expression)](counter, statement.expression)
146 NormalExpressionStatement(expression=normalized),
149 def normalize_statement(counter, statement):
151 parsing.FurExpressionStatement: normalize_expression_statement,
152 parsing.FurAssignmentStatement: fake_normalization,
153 }[type(statement)](counter, statement)
155 def normalize(program):
159 for statement in program.statement_list:
160 counter, prestatements, normalized = normalize_statement(counter, statement)
161 for s in prestatements:
162 statement_list.append(s)
163 statement_list.append(normalized)
165 return NormalProgram(
166 statement_list=statement_list,