5 CIRProgram = collections.namedtuple(
12 CIREntry = collections.namedtuple(
20 CIRInstruction = collections.namedtuple(
28 def generate_integer_literal(integer):
31 def generate_string_literal(string):
32 return '"{}"'.format(string)
34 def generate_symbol_literal(symbol):
35 return 'sym({})'.format(symbol)
37 def generate_function_call_expression(expression):
38 return generate_expression(expression.function_expression) + (
41 argument=expression.argument_count,
45 def generate_integer_literal_expression(expression):
46 return (CIRInstruction(
47 instruction='push_value',
48 argument=generate_integer_literal(expression.integer),
51 def generate_string_literal_expression(expression):
52 return (CIRInstruction(
53 instruction='push_value',
54 argument=generate_string_literal(expression.string),
57 def generate_symbol_expression(expression):
58 return (CIRInstruction(
60 argument=generate_symbol_literal(expression.symbol),
63 def generate_variable_expression(expression):
64 return (CIRInstruction(
66 argument=generate_symbol_literal(expression.variable),
69 def generate_expression(expression):
71 conversion.CPSFunctionCallExpression: generate_function_call_expression,
72 conversion.CPSIntegerLiteralExpression: generate_integer_literal_expression,
73 conversion.CPSStringLiteralExpression: generate_string_literal_expression,
74 conversion.CPSSymbolExpression: generate_symbol_expression,
75 conversion.CPSVariableExpression: generate_variable_expression,
76 }[type(expression)](expression)
78 def generate_expression_statement(statement):
81 generate_expression(statement.expression) + (
89 def generate_if_else_statement(statement):
90 import ipdb; ipdb.set_trace()
92 def generate_assignment_statement(statement):
95 generate_expression(statement.expression) + (
98 argument=generate_symbol_literal(statement.target),
103 def generate_push_statement(statement):
106 generate_expression(statement.expression),
109 def generate_variable_initialization_statement(statement):
112 generate_expression(statement.expression) + (
115 argument=generate_symbol_literal(statement.variable),
120 def generate_statement(statement):
122 conversion.CPSAssignmentStatement: generate_assignment_statement,
123 conversion.CPSExpressionStatement: generate_expression_statement,
124 conversion.CPSIfElseStatement: generate_if_else_statement,
125 conversion.CPSPushStatement: generate_push_statement,
126 conversion.CPSVariableInitializationStatement: generate_variable_initialization_statement,
127 }[type(statement)](statement)
129 def generate(converted):
130 referenced_entry_list_list = []
131 instruction_list_list = []
133 for statement in converted.statement_list:
134 referenced_entry_list, instruction_list = generate_statement(statement)
135 referenced_entry_list_list.append(referenced_entry_list)
136 instruction_list_list.append(instruction_list)
141 for referenced_entry_list in referenced_entry_list_list
142 for entry in referenced_entry_list
145 instruction_list=tuple(
147 for instruction_list in instruction_list_list
148 for instruction in instruction_list
156 for entry in program.entry_list:
157 statement_outputs = []
159 for instruction in entry.instruction_list:
160 statement_outputs.append(' {} {}'.format(
161 instruction.instruction,
162 instruction.argument,
165 entry_outputs.append('{}:\n{}'.format(
167 '\n'.join(statement_outputs),
170 return '\n\n'.join(entry_outputs)