5 DesugaredFunctionCallExpression = collections.namedtuple(
6 'DesugaredFunctionCallExpression',
14 DesugaredIfExpression = collections.namedtuple(
15 'DesugaredIfExpression',
17 'condition_expression',
19 'else_statement_list',
23 DesugaredIntegerLiteralExpression = collections.namedtuple(
24 'DesugaredIntegerLiteralExpression',
30 _DesugaredLambdaExpression = collections.namedtuple(
31 'DesugaredLambdaExpression',
39 class DesugaredLambdaExpression(_DesugaredLambdaExpression):
40 def __new__(cls, *args, **kwargs):
41 if 'name' not in kwargs:
44 return super(DesugaredLambdaExpression, cls).__new__(cls, *args, **kwargs)
46 DesugaredListLiteralExpression = collections.namedtuple(
47 'DesugaredListLiteralExpression',
49 'item_expression_list',
53 DesugaredStringLiteralExpression = collections.namedtuple(
54 'DesugaredStringLiteralExpression',
60 DesugaredSymbolExpressionPair = collections.namedtuple(
61 'DesugaredSymbolExpressionPair',
68 DesugaredStructureLiteralExpression = collections.namedtuple(
69 'DesugaredStructureLiteralExpression',
75 DesugaredSymbolExpression = collections.namedtuple(
76 'DesugaredSymbolExpression',
83 DesugaredAssignmentStatement = collections.namedtuple(
84 'DesugaredAssignmentStatement',
91 DesugaredExpressionStatement = collections.namedtuple(
92 'DesugaredExpressionStatement',
98 DesugaredProgram = collections.namedtuple(
105 def desugar_function_call_expression(expression):
106 return DesugaredFunctionCallExpression(
107 metadata=expression.metadata,
108 function=desugar_expression(expression.function),
109 argument_list=tuple(desugar_expression(e) for e in expression.arguments),
112 def desugar_if_expression(expression):
113 return DesugaredIfExpression(
114 condition_expression=desugar_expression(expression.condition_expression),
115 if_statement_list=tuple(desugar_statement(s) for s in expression.if_statement_list),
116 else_statement_list=tuple(desugar_statement(s) for s in expression.else_statement_list),
119 def desugar_infix_expression(expression):
120 if expression.operator == 'and':
121 return DesugaredIfExpression(
122 condition_expression=desugar_expression(expression.left),
124 DesugaredExpressionStatement(expression=desugar_expression(expression.right)),
126 else_statement_list=(
127 DesugaredExpressionStatement(
128 expression=DesugaredSymbolExpression(
129 metadata=expression.metadata,
136 if expression.operator == 'or':
137 return DesugaredIfExpression(
138 condition_expression=desugar_expression(expression.left),
140 DesugaredExpressionStatement(
141 expression=DesugaredSymbolExpression(
142 metadata=expression.metadata,
147 else_statement_list=(
148 DesugaredExpressionStatement(expression=desugar_expression(expression.right)),
152 if expression.operator == '.':
153 return DesugaredFunctionCallExpression(
154 metadata=expression.metadata,
155 function=DesugaredSymbolExpression(
156 metadata=expression.metadata,
160 desugar_expression(expression.left),
161 DesugaredStringLiteralExpression(string=expression.right.symbol),
170 '//': '__integer_divide__',
171 '%': '__modular_divide__',
178 }[expression.operator]
180 return DesugaredFunctionCallExpression(
181 metadata=expression.metadata,
182 function=DesugaredSymbolExpression(
183 metadata=expression.metadata,
187 desugar_expression(expression.left),
188 desugar_expression(expression.right),
192 def desugar_integer_literal_expression(expression):
193 return DesugaredIntegerLiteralExpression(
194 integer=expression.integer,
197 def desugar_lambda_expression(expression):
198 return DesugaredLambdaExpression(
199 argument_name_list=expression.argument_name_list,
200 statement_list=tuple(desugar_statement(s) for s in expression.statement_list),
203 def desugar_list_item_expression(expression):
204 return DesugaredFunctionCallExpression(
205 metadata=expression.metadata,
206 function=DesugaredSymbolExpression(
207 metadata=expression.metadata,
211 desugar_expression(expression.list_expression),
212 desugar_expression(expression.index_expression),
216 def desugar_list_literal_expression(expression):
217 return DesugaredListLiteralExpression(
218 item_expression_list=tuple(desugar_expression(i) for i in expression.item_expression_list),
221 def desugar_negation_expression(expression):
222 return DesugaredFunctionCallExpression(
223 metadata=expression.metadata,
224 function=DesugaredSymbolExpression(
225 metadata=expression.metadata,
229 desugar_expression(expression.value),
233 def desugar_string_literal_expression(expression):
234 return DesugaredStringLiteralExpression(
235 string=expression.string,
238 def desugar_structure_literal_expression(expression):
239 return DesugaredStructureLiteralExpression(
241 DesugaredSymbolExpressionPair(
243 expression=desugar_expression(p.expression),
244 ) for p in expression.fields
248 def desugar_symbol_expression(expression):
249 return DesugaredSymbolExpression(
250 metadata=expression.metadata,
251 symbol=expression.symbol,
254 def desugar_expression(expression):
256 parsing.FurFunctionCallExpression: desugar_function_call_expression,
257 parsing.FurIfExpression: desugar_if_expression,
258 parsing.FurInfixExpression: desugar_infix_expression,
259 parsing.FurIntegerLiteralExpression: desugar_integer_literal_expression,
260 parsing.FurLambdaExpression: desugar_lambda_expression,
261 parsing.FurListItemExpression: desugar_list_item_expression,
262 parsing.FurListLiteralExpression: desugar_list_literal_expression,
263 parsing.FurNegationExpression: desugar_negation_expression,
264 parsing.FurStringLiteralExpression: desugar_string_literal_expression,
265 parsing.FurStructureLiteralExpression: desugar_structure_literal_expression,
266 parsing.FurSymbolExpression: desugar_symbol_expression,
267 }[type(expression)](expression)
269 def desugar_assignment_statement(statement):
270 return DesugaredAssignmentStatement(
271 target=statement.target,
272 expression=desugar_expression(statement.expression),
275 def desugar_expression_statement(statement):
276 return DesugaredExpressionStatement(
277 expression=desugar_expression(statement.expression),
280 def desugar_function_definition_statement(statement):
281 return DesugaredAssignmentStatement(
282 target=statement.name,
283 expression=DesugaredLambdaExpression(
285 argument_name_list=statement.argument_name_list,
286 statement_list=tuple(desugar_statement(s) for s in statement.statement_list),
290 def desugar_statement(statement):
292 parsing.FurAssignmentStatement: desugar_assignment_statement,
293 parsing.FurExpressionStatement: desugar_expression_statement,
294 parsing.FurFunctionDefinitionStatement: desugar_function_definition_statement,
295 }[type(statement)](statement)
297 def desugar(program):
298 return DesugaredProgram(
299 statement_list=[desugar_statement(s) for s in program.statement_list],