6 return tuple(x for xs in xses for x in xs)
8 CIRProgram = collections.namedtuple(
15 CIRLabel = collections.namedtuple(
22 CIRInstruction = collections.namedtuple(
30 def generate_integer_literal(integer):
33 def generate_string_literal(string):
34 return '"{}"'.format(string)
36 def generate_symbol_literal(symbol):
37 return 'sym({})'.format(symbol)
39 def generate_function_call_expression(counters, expression):
40 referenced_entry_list, instruction_list = generate_expression(
42 expression.function_expression,
48 argument=expression.argument_count,
52 return referenced_entry_list, instruction_list
54 def generate_integer_literal_expression(counters, expression):
55 referenced_entry_list = ()
56 instruction_list = (CIRInstruction(
57 instruction='push_value',
58 argument=generate_integer_literal(expression.integer),
61 return referenced_entry_list, instruction_list
63 def generate_lambda_expression(counters, expression):
64 if expression.name is None or 'lambda' in expression.name.lower():
65 import ipdb; ipdb.set_trace()
67 name_counter = counters.get(expression.name, 0)
68 counters[expression.name] = name_counter + 1
69 label = '{}${}'.format(expression.name, name_counter)
71 for argument_name in expression.argument_name_list:
72 import ipdb; ipdb.set_trace()
74 referenced_entry_list_list = []
75 instruction_list_list = []
77 for statement in expression.statement_list:
78 referenced_entry_list, instruction_list = generate_statement(counters, statement)
79 referenced_entry_list_list.append(referenced_entry_list)
80 instruction_list_list.append(instruction_list)
82 referenced_entry_list_list.append(
83 (CIRLabel(label=label),) + flatten(instruction_list_list),
87 CIRInstruction(instruction='close', argument=label),
90 return flatten(referenced_entry_list_list), instruction_list
92 def generate_string_literal_expression(counters, expression):
93 referenced_entry_list = ()
94 instruction_list = (CIRInstruction(
95 instruction='push_value',
96 argument=generate_string_literal(expression.string),
99 return referenced_entry_list, instruction_list
101 def generate_symbol_expression(counters, expression):
102 referenced_entry_list = ()
103 instruction_list = (CIRInstruction(
105 argument=generate_symbol_literal(expression.symbol),
108 return referenced_entry_list, instruction_list
110 def generate_variable_expression(counters, expression):
111 referenced_entry_list = ()
112 instruction_list = (CIRInstruction(
114 argument=generate_symbol_literal(expression.variable),
117 return referenced_entry_list, instruction_list
119 def generate_expression(counters, expression):
121 conversion.CPSFunctionCallExpression: generate_function_call_expression,
122 conversion.CPSIntegerLiteralExpression: generate_integer_literal_expression,
123 conversion.CPSLambdaExpression: generate_lambda_expression,
124 conversion.CPSStringLiteralExpression: generate_string_literal_expression,
125 conversion.CPSSymbolExpression: generate_symbol_expression,
126 conversion.CPSVariableExpression: generate_variable_expression,
127 }[type(expression)](counters, expression)
129 def generate_expression_statement(counters, statement):
130 referenced_entry_list, instruction_list = generate_expression(
132 statement.expression,
135 instruction_list += (
142 return referenced_entry_list, instruction_list
144 def generate_if_else_statement(counters, statement):
145 if_counter = counters['if']
148 referenced_entry_list_list = []
150 if_instruction_list_list = []
151 for if_statement in statement.if_statement_list:
152 referenced_entry_list, instruction_list = generate_statement(counters, if_statement)
153 referenced_entry_list_list.append(referenced_entry_list)
154 if_instruction_list_list.append(instruction_list)
156 else_instruction_list_list = []
158 for else_statement in statement.else_statement_list:
159 referenced_entry_list, instruction_list = generate_statement(counters, else_statement)
160 referenced_entry_list_list.append(referenced_entry_list)
161 else_instruction_list_list.append(instruction_list)
163 if_label = '__if${}__'.format(if_counter)
164 else_label = '__else${}__'.format(if_counter)
165 endif_label = '__endif${}__'.format(if_counter)
168 referenced_entry_list_list,
169 generate_expression(counters, statement.condition_expression) + (
171 instruction='jump_if_false',
174 CIRLabel(label=if_label),
175 ) + flatten(if_instruction_list_list) + (
178 argument=endif_label,
180 CIRLabel(label=else_label),
181 ) + flatten(else_instruction_list_list) + (
182 CIRLabel(label=endif_label),
186 return flatten(referenced_entry_list_list), instruction_list
188 def generate_assignment_statement(counters, statement):
189 referenced_entry_list, instruction_list = generate_expression(
191 statement.expression,
194 instruction_list += (
197 argument=generate_symbol_literal(statement.target),
201 return referenced_entry_list, instruction_list
203 def generate_push_statement(counters, statement):
204 return generate_expression(counters, statement.expression)
206 def generate_variable_initialization_statement(counters, statement):
207 referenced_entry_list, instruction_list = generate_expression(
209 statement.expression,
212 instruction_list += (
215 argument=generate_symbol_literal(statement.variable),
219 return referenced_entry_list, instruction_list
221 def generate_variable_reassignment_statement(counters, statement):
222 referenced_entry_list, instruction_list = generate_expression(
224 statement.expression,
227 instruction_list += (
230 argument=generate_symbol_literal(statement.variable),
234 return referenced_entry_list, instruction_list
236 def generate_statement(counters, statement):
238 conversion.CPSAssignmentStatement: generate_assignment_statement,
239 conversion.CPSExpressionStatement: generate_expression_statement,
240 conversion.CPSIfElseStatement: generate_if_else_statement,
241 conversion.CPSPushStatement: generate_push_statement,
242 conversion.CPSVariableInitializationStatement: generate_variable_initialization_statement,
243 conversion.CPSVariableReassignmentStatement: generate_variable_reassignment_statement,
244 }[type(statement)](counters, statement)
246 def generate(converted):
247 referenced_entry_list_list = []
248 instruction_list_list = []
253 for statement in converted.statement_list:
254 referenced_entry_list, instruction_list = generate_statement(counters, statement)
255 referenced_entry_list_list.append(referenced_entry_list)
256 instruction_list_list.append(instruction_list)
260 CIRLabel(label='__main__'),
261 ) + flatten(referenced_entry_list_list) + flatten(instruction_list_list),
267 for entry in program.entry_list:
268 if isinstance(entry, CIRInstruction):
269 lines.append(' {} {}'.format(entry.instruction, entry.argument))
271 if isinstance(entry, CIRLabel):
272 lines.append('\n{}:'.format(entry.label))
274 return '\n'.join(lines).lstrip()