10 #include "adt/error.h"
12 struct obstack ast_obstack;
15 void print_const(FILE *out, const const_t *cnst)
17 fprintf(out, "%d", cnst->value);
21 void print_string_literal(FILE *out, const string_literal_t *string_literal)
23 /* TODO escape " and non-printable chars */
24 fprintf(out, "\"%s\"", string_literal->value);
28 void print_call_expression(FILE *out, const call_expression_t *call)
30 print_expression(out, call->method);
32 call_argument_t *argument = call->arguments;
34 while(argument != NULL) {
40 print_expression(out, argument->expression);
42 argument = argument->next;
48 void print_binary_expression(FILE *out, const binary_expression_t *binexpr)
51 print_expression(out, binexpr->left);
53 switch(binexpr->type) {
55 fprintf(out, "INVOP");
66 case BINEXPR_NOTEQUAL:
75 case BINEXPR_LESSEQUAL:
81 case BINEXPR_GREATEREQUAL:
85 /* TODO: add missing ops */
86 fprintf(out, "op%d", binexpr->type);
90 print_expression(out, binexpr->right);
94 void print_expression(FILE *out, const expression_t *expression)
96 switch(expression->type) {
98 fprintf(out, "*invalid expression*");
101 print_const(out, (const const_t*) expression);
103 case EXPR_STRING_LITERAL:
104 print_string_literal(out, (const string_literal_t*) expression);
107 print_call_expression(out, (const call_expression_t*) expression);
110 print_binary_expression(out, (const binary_expression_t*) expression);
115 case EXPR_ARRAY_ACCESS:
118 fprintf(out, "some expression of type %d", expression->type);
124 void print_block_statement(FILE *out, int indent,
125 const block_statement_t *block)
127 statement_t *statement = block->first_statement;
128 while(statement != NULL) {
129 print_statement(out, indent + 1, statement);
131 statement = statement->next;
136 void print_return_statement(FILE *out, const return_statement_t *statement)
138 fprintf(out, "return ");
139 if(statement->return_value != NULL)
140 print_expression(out, statement->return_value);
144 void print_expression_statement(FILE *out,
145 const expression_statement_t *statement)
147 print_expression(out, statement->expression);
151 void print_goto_statement(FILE *out, const goto_statement_t *statement)
153 fprintf(out, "goto ");
154 if(statement->label != NULL) {
155 fprintf(out, "%s", statement->label->symbol->string);
157 fprintf(out, "?%s", statement->label_symbol->string);
162 void print_label_statement(FILE *out, const label_statement_t *statement)
164 fprintf(out, ":%s", statement->symbol->string);
168 void print_if_statement(FILE *out, int indent, const if_statement_t *statement)
171 print_expression(out, statement->condition);
173 if(statement->true_statement != NULL) {
174 print_statement(out, indent, statement->true_statement);
177 if(statement->false_statement != NULL) {
178 fprintf(out, "else:\n");
179 print_statement(out, indent, statement->false_statement);
184 void print_variable_declaration_statement(FILE *out,
185 const variable_declaration_statement_t *statement)
188 if(statement->type != NULL) {
190 print_type(out, statement->type);
193 fprintf(out, " %s", statement->symbol->string);
196 void print_statement(FILE *out, int indent, const statement_t *statement)
198 for(int i = 0; i < indent; ++i)
201 switch(statement->type) {
202 case STATEMENT_BLOCK:
203 print_block_statement(out, indent,
204 (const block_statement_t*) statement);
206 case STATEMENT_RETURN:
207 print_return_statement(out, (const return_statement_t*) statement);
209 case STATEMENT_EXPRESSION:
210 print_expression_statement(out,
211 (const expression_statement_t*) statement);
213 case STATEMENT_LABEL:
214 print_label_statement(out, (const label_statement_t*) statement);
217 print_goto_statement(out, (const goto_statement_t*) statement);
220 print_if_statement(out, indent, (const if_statement_t*) statement);
222 case STATEMENT_VARIABLE_DECLARATION:
223 print_variable_declaration_statement(out,
224 (const variable_declaration_statement_t*) statement);
226 case STATEMENT_INVALID:
228 fprintf(out, "*invalid statement*");
236 void print_method_parameters(FILE *out, const method_parameter_t *parameters,
237 const method_type_t *method_type)
242 const method_parameter_t *parameter = parameters;
243 const method_parameter_type_t *parameter_type
244 = method_type->parameter_types;
245 while(parameter != NULL && parameter_type != NULL) {
252 print_type(out, parameter_type->type);
253 fprintf(out, " %s", parameter->symbol->string);
255 parameter = parameter->next;
256 parameter_type = parameter_type->next;
258 assert(parameter == NULL && parameter_type == NULL);
264 void print_method(FILE *out, const method_t *method)
266 method_type_t *type = method->type;
268 fprintf(out, "func ");
269 print_type(out, type->result_type);
270 fprintf(out, " %s", method->symbol->string);
272 print_method_parameters(out, method->parameters, type);
274 if(method->statement != NULL) {
276 print_statement(out, 0, method->statement);
283 void print_namespace_entry(FILE *out, const namespace_entry_t *entry)
285 switch(entry->type) {
286 case NAMESPACE_ENTRY_METHOD:
287 print_method(out, (const method_t*) entry);
289 case NAMESPACE_ENTRY_VARIABLE:
291 fprintf(out, "some namespace entry of type %d\n\n", entry->type);
293 case NAMESPACE_ENTRY_INVALID:
295 fprintf(out, "invalid namespace entry (%d)\n", entry->type);
300 void print_ast(FILE *out, const namespace_t *namespace)
302 namespace_entry_t *entry = namespace->entries;
304 while(entry != NULL) {
305 print_namespace_entry(out, entry);
311 void init_ast_module(void)
313 obstack_init(&ast_obstack);
316 void exit_ast_module(void)
318 obstack_free(&ast_obstack, NULL);
321 void* (allocate_ast) (size_t size)
323 return _allocate_ast(size);