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(expression):
40 return generate_expression(expression.function_expression) + (
43 argument=expression.argument_count,
47 def generate_integer_literal_expression(expression):
48 return (CIRInstruction(
49 instruction='push_value',
50 argument=generate_integer_literal(expression.integer),
53 def generate_string_literal_expression(expression):
54 return (CIRInstruction(
55 instruction='push_value',
56 argument=generate_string_literal(expression.string),
59 def generate_symbol_expression(expression):
60 return (CIRInstruction(
62 argument=generate_symbol_literal(expression.symbol),
65 def generate_variable_expression(expression):
66 return (CIRInstruction(
68 argument=generate_symbol_literal(expression.variable),
71 def generate_expression(expression):
73 conversion.CPSFunctionCallExpression: generate_function_call_expression,
74 conversion.CPSIntegerLiteralExpression: generate_integer_literal_expression,
75 conversion.CPSStringLiteralExpression: generate_string_literal_expression,
76 conversion.CPSSymbolExpression: generate_symbol_expression,
77 conversion.CPSVariableExpression: generate_variable_expression,
78 }[type(expression)](expression)
80 def generate_expression_statement(counters, statement):
83 generate_expression(statement.expression) + (
91 def generate_if_else_statement(counters, statement):
92 if_counter = counters['if']
95 referenced_entry_list_list = []
97 if_instruction_list_list = []
98 for if_statement in statement.if_statement_list:
99 referenced_entry_list, instruction_list = generate_statement(counters, if_statement)
100 referenced_entry_list_list.append(referenced_entry_list)
101 if_instruction_list_list.append(instruction_list)
103 else_instruction_list_list = []
105 for else_statement in statement.else_statement_list:
106 referenced_entry_list, instruction_list = generate_statement(counters, else_statement)
107 referenced_entry_list_list.append(referenced_entry_list)
108 else_instruction_list_list.append(instruction_list)
110 if_label = '__if${}__'.format(if_counter)
111 else_label = '__else${}__'.format(if_counter)
112 endif_label = '__endif${}__'.format(if_counter)
115 referenced_entry_list_list,
116 generate_expression(statement.condition_expression) + (
118 instruction='jump_if_false',
121 CIRLabel(label=if_label),
122 ) + flatten(if_instruction_list_list) + (
125 argument=endif_label,
127 CIRLabel(label=else_label),
128 ) + flatten(else_instruction_list_list) + (
129 CIRLabel(label=endif_label),
133 def generate_assignment_statement(counters, statement):
136 generate_expression(statement.expression) + (
139 argument=generate_symbol_literal(statement.target),
144 def generate_push_statement(counters, statement):
147 generate_expression(statement.expression),
150 def generate_variable_initialization_statement(counters, statement):
153 generate_expression(statement.expression) + (
156 argument=generate_symbol_literal(statement.variable),
161 def generate_variable_reassignment_statement(counter, statement):
164 generate_expression(statement.expression) + (
167 argument=generate_symbol_literal(statement.variable),
172 def generate_statement(counters, statement):
174 conversion.CPSAssignmentStatement: generate_assignment_statement,
175 conversion.CPSExpressionStatement: generate_expression_statement,
176 conversion.CPSIfElseStatement: generate_if_else_statement,
177 conversion.CPSPushStatement: generate_push_statement,
178 conversion.CPSVariableInitializationStatement: generate_variable_initialization_statement,
179 conversion.CPSVariableReassignmentStatement: generate_variable_reassignment_statement,
180 }[type(statement)](counters, statement)
182 def generate(converted):
183 referenced_entry_list_list = []
184 instruction_list_list = []
189 for statement in converted.statement_list:
190 referenced_entry_list, instruction_list = generate_statement(counters, statement)
191 referenced_entry_list_list.append(referenced_entry_list)
192 instruction_list_list.append(instruction_list)
196 CIRLabel(label='__main__'),
199 for referenced_entry_list in referenced_entry_list_list
200 for referenced_entry in referenced_entry_list
203 for instruction_list in instruction_list_list
204 for instruction in instruction_list
211 for entry in program.entry_list:
212 if isinstance(entry, CIRInstruction):
213 lines.append(' {} {}'.format(entry.instruction, entry.argument))
215 if isinstance(entry, CIRLabel):
216 lines.append('\n{}:'.format(entry.label))
218 return '\n'.join(lines).lstrip()