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',
38 DesugaredListLiteralExpression = collections.namedtuple(
39 'DesugaredListLiteralExpression',
41 'item_expression_list',
45 DesugaredStringLiteralExpression = collections.namedtuple(
46 'DesugaredStringLiteralExpression',
52 DesugaredSymbolExpressionPair = collections.namedtuple(
53 'DesugaredSymbolExpressionPair',
60 DesugaredStructureLiteralExpression = collections.namedtuple(
61 'DesugaredStructureLiteralExpression',
67 DesugaredSymbolExpression = collections.namedtuple(
68 'DesugaredSymbolExpression',
75 DesugaredAssignmentStatement = collections.namedtuple(
76 'DesugaredAssignmentStatement',
83 DesugaredExpressionStatement = collections.namedtuple(
84 'DesugaredExpressionStatement',
90 DesugaredFunctionDefinitionStatement = collections.namedtuple(
91 'DesugaredFunctionDefinitionStatement',
99 DesugaredProgram = collections.namedtuple(
106 def desugar_function_call_expression(expression):
107 return DesugaredFunctionCallExpression(
108 metadata=expression.metadata,
109 function=desugar_expression(expression.function),
110 argument_list=tuple(desugar_expression(e) for e in expression.arguments),
113 def desugar_if_expression(expression):
114 return DesugaredIfExpression(
115 condition_expression=desugar_expression(expression.condition_expression),
116 if_statement_list=tuple(desugar_statement(s) for s in expression.if_statement_list),
117 else_statement_list=tuple(desugar_statement(s) for s in expression.else_statement_list),
120 def desugar_infix_expression(expression):
121 if expression.operator == 'and':
122 return DesugaredIfExpression(
123 condition_expression=desugar_expression(expression.left),
125 DesugaredExpressionStatement(expression=desugar_expression(expression.right)),
127 else_statement_list=(
128 DesugaredExpressionStatement(
129 expression=DesugaredSymbolExpression(
130 metadata=expression.metadata,
137 if expression.operator == 'or':
138 return DesugaredIfExpression(
139 condition_expression=desugar_expression(expression.left),
141 DesugaredExpressionStatement(
142 expression=DesugaredSymbolExpression(
143 metadata=expression.metadata,
148 else_statement_list=(
149 DesugaredExpressionStatement(expression=desugar_expression(expression.right)),
153 if expression.operator == '.':
154 return DesugaredFunctionCallExpression(
155 metadata=expression.metadata,
156 function=DesugaredSymbolExpression(
157 metadata=expression.metadata,
161 desugar_expression(expression.left),
162 DesugaredStringLiteralExpression(string=expression.right.symbol),
171 '//': '__integer_divide__',
172 '%': '__modular_divide__',
179 }[expression.operator]
181 return DesugaredFunctionCallExpression(
182 metadata=expression.metadata,
183 function=DesugaredSymbolExpression(
184 metadata=expression.metadata,
188 desugar_expression(expression.left),
189 desugar_expression(expression.right),
193 def desugar_integer_literal_expression(expression):
194 return DesugaredIntegerLiteralExpression(
195 integer=expression.integer,
198 def desugar_lambda_expression(expression):
199 return DesugaredLambdaExpression(
200 argument_name_list=expression.argument_name_list,
201 statement_list=tuple(desugar_statement(s) for s in expression.statement_list),
204 def desugar_list_item_expression(expression):
205 return DesugaredFunctionCallExpression(
206 metadata=expression.metadata,
207 function=DesugaredSymbolExpression(
208 metadata=expression.metadata,
212 desugar_expression(expression.list_expression),
213 desugar_expression(expression.index_expression),
217 def desugar_list_literal_expression(expression):
218 return DesugaredListLiteralExpression(
219 item_expression_list=tuple(desugar_expression(i) for i in expression.item_expression_list),
222 def desugar_negation_expression(expression):
223 return DesugaredFunctionCallExpression(
224 metadata=expression.metadata,
225 function=DesugaredSymbolExpression(
226 metadata=expression.metadata,
230 desugar_expression(expression.value),
234 def desugar_string_literal_expression(expression):
235 return DesugaredStringLiteralExpression(
236 string=expression.string,
239 def desugar_structure_literal_expression(expression):
240 return DesugaredStructureLiteralExpression(
242 DesugaredSymbolExpressionPair(
244 expression=desugar_expression(p.expression),
245 ) for p in expression.fields
249 def desugar_symbol_expression(expression):
250 return DesugaredSymbolExpression(
251 metadata=expression.metadata,
252 symbol=expression.symbol,
255 def desugar_expression(expression):
257 parsing.FurFunctionCallExpression: desugar_function_call_expression,
258 parsing.FurIfExpression: desugar_if_expression,
259 parsing.FurInfixExpression: desugar_infix_expression,
260 parsing.FurIntegerLiteralExpression: desugar_integer_literal_expression,
261 parsing.FurLambdaExpression: desugar_lambda_expression,
262 parsing.FurListItemExpression: desugar_list_item_expression,
263 parsing.FurListLiteralExpression: desugar_list_literal_expression,
264 parsing.FurNegationExpression: desugar_negation_expression,
265 parsing.FurStringLiteralExpression: desugar_string_literal_expression,
266 parsing.FurStructureLiteralExpression: desugar_structure_literal_expression,
267 parsing.FurSymbolExpression: desugar_symbol_expression,
268 }[type(expression)](expression)
270 def desugar_assignment_statement(statement):
271 return DesugaredAssignmentStatement(
272 target=statement.target,
273 expression=desugar_expression(statement.expression),
276 def desugar_expression_statement(statement):
277 return DesugaredExpressionStatement(
278 expression=desugar_expression(statement.expression),
281 def desugar_function_definition_statement(statement):
282 return DesugaredFunctionDefinitionStatement(
284 argument_name_list=statement.argument_name_list,
285 statement_list=tuple(desugar_statement(s) for s in statement.statement_list),
288 def desugar_statement(statement):
290 parsing.FurAssignmentStatement: desugar_assignment_statement,
291 parsing.FurExpressionStatement: desugar_expression_statement,
292 parsing.FurFunctionDefinitionStatement: desugar_function_definition_statement,
293 }[type(statement)](statement)
295 def desugar(program):
296 return DesugaredProgram(
297 statement_list=[desugar_statement(s) for s in program.statement_list],