4 #include "c_codegen_visitor.h"
7 static int tmp_var
= 0;
9 static void _tab(struct AstNode
*node
);
10 static char *_get_type_string(Type type
);
11 static char *_create_temporary();
12 static void _print_op_symbol(struct AstNode
*node
);
17 Visitor
*visitor
= (Visitor
*) malloc (sizeof(Visitor
));
19 visitor
->visit_program
= &c_codegen_visit_program
;
20 visitor
->visit_programdecl
= &c_codegen_visit_programdecl
;
21 visitor
->visit_vardecl_list
= &c_codegen_visit_vardecl_list
;
22 visitor
->visit_vardecl
= &c_codegen_visit_vardecl
;
23 visitor
->visit_identifier_list
= &c_codegen_visit_identifier_list
;
24 visitor
->visit_procfunc_list
= &c_codegen_visit_procfunc_list
;
25 visitor
->visit_procedure
= &c_codegen_visit_procedure
;
26 visitor
->visit_function
= &c_codegen_visit_function
;
27 visitor
->visit_param_list
= &c_codegen_visit_param_list
;
28 visitor
->visit_parameter
= &c_codegen_visit_parameter
;
29 visitor
->visit_statement_list
= &c_codegen_visit_statement_list
;
30 visitor
->visit_printint_stmt
= &c_codegen_visit_printint_stmt
;
31 visitor
->visit_printchar_stmt
= &c_codegen_visit_printchar_stmt
;
32 visitor
->visit_printbool_stmt
= &c_codegen_visit_printbool_stmt
;
33 visitor
->visit_printline_stmt
= &c_codegen_visit_printline_stmt
;
34 visitor
->visit_assignment_stmt
= &c_codegen_visit_assignment_stmt
;
35 visitor
->visit_if_stmt
= &c_codegen_visit_if_stmt
;
36 visitor
->visit_while_stmt
= &c_codegen_visit_while_stmt
;
37 visitor
->visit_for_stmt
= &c_codegen_visit_for_stmt
;
38 visitor
->visit_rel_expr
= &c_codegen_visit_binary_expr
;
39 visitor
->visit_add_expr
= &c_codegen_visit_binary_expr
;
40 visitor
->visit_mul_expr
= &c_codegen_visit_binary_expr
;
41 visitor
->visit_notfactor
= &c_codegen_visit_notfactor
;
42 visitor
->visit_call
= &c_codegen_visit_call
;
43 visitor
->visit_callparam_list
= &c_codegen_visit_callparam_list
;
44 visitor
->visit_identifier
= &c_codegen_visit_identifier
;
45 visitor
->visit_literal
= &c_codegen_visit_literal
;
46 visitor
->visit_add_op
= &c_codegen_visit_binary_op
;
47 visitor
->visit_mul_op
= &c_codegen_visit_binary_op
;
48 visitor
->visit_rel_op
= &c_codegen_visit_binary_op
;
49 visitor
->visit_not_op
= &c_codegen_visit_not_op
;
55 c_codegen_visit_program(struct _Visitor
*visitor
, struct AstNode
*node
)
57 struct AstNode
*child
;
59 printf("/* Generated with toypasc */\n");
60 for (child
= node
->children
;
61 child
!= NULL
&& child
->kind
!= STATEMENT_LIST
;
62 child
= child
->sibling
) {
63 ast_node_accept(child
, visitor
);
68 printf("int\nmain(int argc, char **argv)\n{\n");
69 ast_node_accept(child
, visitor
);
70 printf("\n"TAB
"return 0;\n}\n\n");
75 c_codegen_visit_programdecl(struct _Visitor
*visitor
, struct AstNode
*node
)
77 printf("/* program ");
78 ast_node_accept(node
->children
, visitor
);
80 printf("#include <stdio.h>\n");
81 printf("#ifndef FALSE\n#define FALSE\t0\n#endif\n");
82 printf("#ifndef TRUE\n#define TRUE\t1\n#endif\n");
86 c_codegen_visit_vardecl_list (struct _Visitor
*visitor
, struct AstNode
*node
)
88 ast_node_accept_children(node
->children
, visitor
);
93 c_codegen_visit_identifier_list (struct _Visitor
*visitor
, struct AstNode
*node
)
95 struct AstNode
*child
;
97 for (child
= node
->children
; child
!= NULL
; child
= child
->sibling
) {
98 ast_node_accept(child
, visitor
);
99 if (child
->sibling
!= NULL
)
105 c_codegen_visit_procfunc_list (struct _Visitor
*visitor
, struct AstNode
*node
)
107 ast_node_accept_children(node
->children
, visitor
);
111 c_codegen_visit_procedure (struct _Visitor
*visitor
, struct AstNode
*node
)
113 printf("void\n%s ()\n{\n", node
->children
->symbol
->name
);
114 printf(TAB
"/* declaracoes */\n\n");
116 ast_node_accept(node
->children
, visitor
);
122 c_codegen_visit_function (struct _Visitor
*visitor
, struct AstNode
*node
)
125 struct AstNode
*child
;
127 type
= _get_type_string(node
->type
);
128 pf_name
= _create_temporary();
130 printf("%s\n", type
);
132 child
= node
->children
; // Identifier
133 ast_node_accept(child
, visitor
);
137 child
= child
->sibling
;
138 if (child
->kind
== PARAM_LIST
) {
139 ast_node_accept(child
, visitor
);
140 child
= child
->sibling
;
145 printf(TAB
"%s %s;\n", type
, pf_name
);
147 if (child
->kind
== VARDECL_LIST
) {
148 ast_node_accept(child
, visitor
);
149 child
= child
->sibling
;
154 ast_node_accept(child
, visitor
);
156 printf("\n"TAB
"return %s;\n}\n\n", pf_name
);
161 c_codegen_visit_param_list (struct _Visitor
*visitor
, struct AstNode
*node
)
163 struct AstNode
*child
;
165 for (child
= node
->children
; child
!= NULL
; child
= child
->sibling
) {
166 printf("%s ", _get_type_string(child
->type
));
167 ast_node_accept(child
, visitor
);
168 if (child
->sibling
!= NULL
)
174 c_codegen_visit_statement_list (struct _Visitor
*visitor
, struct AstNode
*node
)
176 struct AstNode
*child
;
178 for (child
= node
->children
; child
!= NULL
; child
= child
->sibling
) {
180 ast_node_accept(child
, visitor
);
186 c_codegen_visit_binary_expr (struct _Visitor
*visitor
, struct AstNode
*node
)
188 ast_node_accept_children(node
->children
, visitor
);
192 c_codegen_visit_callparam_list (struct _Visitor
*visitor
, struct AstNode
*node
)
194 ast_node_accept(node
->children
, visitor
);
198 c_codegen_visit_identifier (struct _Visitor
*visitor
, struct AstNode
*node
)
200 printf("%s", node
->symbol
->name
);
204 c_codegen_visit_literal (struct _Visitor
*visitor
, struct AstNode
*node
)
206 if (node
->type
== BOOLEAN
) {
207 printf("%s", node
->value
.boolean
? "TRUE" : "FALSE");
209 value_print(&node
->value
, node
->type
);
213 c_codegen_visit_vardecl (struct _Visitor
*visitor
, struct AstNode
*node
)
215 const char *type
= _get_type_string(node
->type
);
217 printf(TAB
"%s ", type
);
218 ast_node_accept(node
->children
, visitor
);
223 c_codegen_visit_parameter (struct _Visitor
*visitor
, struct AstNode
*node
)
225 ast_node_accept(node
->children
, visitor
);
229 c_codegen_visit_printint_stmt (struct _Visitor
*visitor
, struct AstNode
*node
)
231 printf("printf(\"%%d\", ");
232 ast_node_accept(node
->children
, visitor
);
237 c_codegen_visit_printchar_stmt (struct _Visitor
*visitor
, struct AstNode
*node
)
239 printf("printf(\"%%c\", ");
240 ast_node_accept(node
->children
, visitor
);
245 c_codegen_visit_printbool_stmt (struct _Visitor
*visitor
, struct AstNode
*node
)
247 printf("printf(\"%%s\", ");
248 ast_node_accept(node
->children
, visitor
);
253 c_codegen_visit_printline_stmt (struct _Visitor
*visitor
, struct AstNode
*node
)
255 printf("printf(\"\\n\");");
256 ast_node_accept(node
->children
, visitor
);
260 c_codegen_visit_assignment_stmt (struct _Visitor
*visitor
, struct AstNode
*node
)
262 ast_node_accept(node
->children
, visitor
);
264 ast_node_accept(node
->children
->sibling
, visitor
);
269 c_codegen_visit_if_stmt (struct _Visitor
*visitor
, struct AstNode
*node
)
271 struct AstNode
*child
;
275 child
= node
->children
; // Expression
276 ast_node_accept(child
, visitor
);
279 child
= child
->sibling
; // If Statements
280 ast_node_accept(child
, visitor
);
286 child
= child
->sibling
; // Else Statements
290 ast_node_accept(child
, visitor
);
299 c_codegen_visit_while_stmt (struct _Visitor
*visitor
, struct AstNode
*node
)
301 struct AstNode
*child
;
305 child
= node
->children
; // Expression
306 ast_node_accept(child
, visitor
);
309 child
= child
->sibling
; // Statements
310 ast_node_accept(child
, visitor
);
317 c_codegen_visit_for_stmt (struct _Visitor
*visitor
, struct AstNode
*node
)
319 struct AstNode
*child
;
323 child
= node
->children
; // Assignment
324 ast_node_accept(child
, visitor
);
326 var
= child
->children
->symbol
->name
;
327 printf(" %s < ", var
);
329 child
= child
->sibling
; // Stop condition
330 ast_node_accept(child
, visitor
);
332 printf("; %s++) {\n", var
);
334 child
= child
->sibling
; // Statements
335 ast_node_accept_children(child
, visitor
);
342 c_codegen_visit_notfactor (struct _Visitor
*visitor
, struct AstNode
*node
)
344 ast_node_accept_children(node
->children
, visitor
);
348 c_codegen_visit_call (struct _Visitor
*visitor
, struct AstNode
*node
)
350 printf("%s ();\n", node
->symbol
->name
);
351 ast_node_accept(node
->children
, visitor
);
355 c_codegen_visit_simplenode (struct _Visitor
*visitor
, struct AstNode
*node
)
357 ast_node_accept_children(node
->children
, visitor
);
361 c_codegen_visit_binary_op (struct _Visitor
*visitor
, struct AstNode
*node
)
363 _print_op_symbol(node
);
367 c_codegen_visit_not_op (struct _Visitor
*visitor
, struct AstNode
*node
)
369 printf(" !", node
->name
);
373 _tab(struct AstNode
*node
) {
374 struct AstNode
*parent
;
375 for (parent
= node
->parent
; parent
->parent
!= NULL
; parent
= parent
->parent
)
380 *_get_type_string(Type type
)
398 if (asprintf (&temp
, "tmp%.5d", tmp_var
) < 0)
406 _print_op_symbol(struct AstNode
*node
)
408 switch (node
->kind
) {
437 printf(" %s ", node
->name
);