Adicionado suporte a opcoes da linha de comando com getopt.
[toypasc.git] / llvm_codegen_visitor.c
bloba514873efefc5e4f20966cb6e0e8a222bc91a283
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include "llvm_codegen_visitor.h"
6 static bool is_symboldecl = FALSE;
7 static void _print_symbol_table(struct AstNode *node);
8 static void _print_symbols(Symbol *symbol);
10 Visitor *
11 llvm_codegen_new()
13 Visitor *visitor = (Visitor *) malloc (sizeof(Visitor));
15 visitor->visit_program = &llvm_codegen_visit_program;
16 visitor->visit_programdecl = &llvm_codegen_visit_programdecl;
17 visitor->visit_vardecl_list = &llvm_codegen_visit_vardecl_list;
18 visitor->visit_vardecl = &llvm_codegen_visit_simplenode;
19 visitor->visit_identifier_list = &llvm_codegen_visit_identifier_list;
20 visitor->visit_procfunc_list = &llvm_codegen_visit_procfunc_list;
21 visitor->visit_procedure = &llvm_codegen_visit_procfunc;
22 visitor->visit_function = &llvm_codegen_visit_procfunc;
23 visitor->visit_param_list = &llvm_codegen_visit_param_list;
24 visitor->visit_parameter = &llvm_codegen_visit_simplenode;
25 visitor->visit_statement_list = &llvm_codegen_visit_statement_list;
26 visitor->visit_printint_stmt = &llvm_codegen_visit_simplenode;
27 visitor->visit_printchar_stmt = &llvm_codegen_visit_simplenode;
28 visitor->visit_printbool_stmt = &llvm_codegen_visit_simplenode;
29 visitor->visit_printline_stmt = &llvm_codegen_visit_simplenode;
30 visitor->visit_assignment_stmt = &llvm_codegen_visit_simplenode;
31 visitor->visit_if_stmt = &llvm_codegen_visit_simplenode;
32 visitor->visit_while_stmt = &llvm_codegen_visit_simplenode;
33 visitor->visit_for_stmt = &llvm_codegen_visit_simplenode;
34 visitor->visit_rel_expr = &llvm_codegen_visit_binary_expr;
35 visitor->visit_add_expr = &llvm_codegen_visit_binary_expr;
36 visitor->visit_mul_expr = &llvm_codegen_visit_binary_expr;
37 visitor->visit_notfactor = &llvm_codegen_visit_simplenode;
38 visitor->visit_call = &llvm_codegen_visit_simplenode;
39 visitor->visit_callparam_list = &llvm_codegen_visit_callparam_list;
40 visitor->visit_identifier = &llvm_codegen_visit_identifier;
41 visitor->visit_literal = &llvm_codegen_visit_literal;
42 visitor->visit_add_op = NULL;
43 visitor->visit_mul_op = NULL;
44 visitor->visit_rel_op = NULL;
45 visitor->visit_not_op = NULL;
47 return visitor;
50 void
51 llvm_codegen_visit_program(struct AstNode *node)
53 struct AstNode *temp;
55 printf("/* toypasc AST graph. */\n");
56 printf("digraph {\n");
58 printf("\tremincross=true;\n");
59 printf("\tordering=out;\n");
60 printf("\tcompound=true;\n");
61 printf("\tranksep=1.0;\n");
62 printf("\tnode [fontsize=11,fontname=Courier];\n");
63 printf("\tedge [color=\"#22DDAA\"];\n\n");
65 printf("\tnode_%x [label=\"%s\",style=", node, node->name);
66 printf("filled,color=orange,fillcolor=\"#FFEEEE\"];\n");
68 _print_symbol_table(node);
71 void
72 llvm_codegen_visit_simplenode (struct AstNode *node)
74 printf("\tnode_%x -> node_%x;\n", node->parent, node);
75 printf("\tnode_%x [label=\"%s\",style=", node, node->name);
76 printf("filled,fillcolor=\"#EEFFEE\",color=\"#%s\"];\n",
77 (node->type == ERROR) ? "FF0000" : "EEFFEE");
80 void
81 llvm_codegen_visit_programdecl(struct AstNode *node)
83 is_symboldecl = TRUE;
84 printf("\tnode_%x -> node_%x;\n", node->parent, node);
85 printf("\tnode_%x [label=\"%s\",style=", node, node->name);
86 printf("filled,color=\"#22DDAA\",fillcolor=\"#EEFFEE\"];\n");
89 void
90 llvm_codegen_visit_vardecl_list (struct AstNode *node)
92 is_symboldecl = TRUE;
93 printf("\tnode_%x -> node_%x;\n", node->parent, node);
94 printf("\tnode_%x [label=\"%s\",style=", node, node->name);
95 printf("filled,color=\"#22DDAA\",fillcolor=\"#EEFFEE\"];\n");
96 printf("subgraph cluster_%x {\n\tstyle=dotted;\n", node);
99 void
100 llvm_codegen_visit_identifier_list (struct AstNode *node)
102 printf("\tnode_%x -> node_%x;\n", node->parent, node);
103 printf("\tnode_%x [label=\"%s\",style=", node, node->name);
104 printf("filled,color=\"#22DDAA\",fillcolor=\"#EEFFEE\"];\n");
105 printf("subgraph cluster_%x {\n\tstyle=dotted;\n", node);
108 void
109 llvm_codegen_visit_procfunc_list (struct AstNode *node)
111 printf("\tnode_%x -> node_%x;\n", node->parent, node);
112 printf("\tnode_%x [label=\"%s\",style=", node, node->name);
113 printf("filled,color=\"#22DDAA\",fillcolor=\"#EEFFEE\"];\n");
116 void
117 llvm_codegen_visit_procfunc (struct AstNode *node)
119 is_symboldecl = TRUE;
120 printf("\tnode_%x -> node_%x;\n", node->parent, node);
121 printf("\tnode_%x [label=\"%s\\n'%s'\",style=",
122 node, node->name, node->children->symbol->name);
123 printf("filled,color=blue,fillcolor=\"#EEEEFF\"];\n");
124 printf("subgraph cluster_%x {\n\tstyle=dotted;\n", node);
125 _print_symbol_table(node);
128 void
129 llvm_codegen_visit_param_list (struct AstNode *node)
131 is_symboldecl = TRUE;
132 printf("\tnode_%x -> node_%x;\n", node->parent, node);
133 printf("\tnode_%x [label=\"%s\",style=", node, node->name);
134 printf("filled,color=\"#22DDAA\",fillcolor=\"#EEFFEE\"];\n");
135 printf("subgraph cluster_%x {\n\tstyle=dotted;\n", node);
138 void
139 llvm_codegen_visit_statement_list (struct AstNode *node)
141 is_symboldecl = FALSE;
142 printf("\tnode_%x -> node_%x;\n", node->parent, node);
143 printf("\tnode_%x [label=\"%s\",style=", node, node->name);
144 printf("filled,color=\"#22DDAA\",fillcolor=\"#EEFFEE\"];\n");
145 printf("subgraph cluster_%x {\n\tstyle=dotted;\n", node);
148 void
149 llvm_codegen_visit_binary_expr (struct AstNode *node)
151 printf("\tnode_%x -> node_%x;\n", node->parent, node);
152 printf("\tnode_%x [label=\"%s\\n(%s)\",style=",
153 node, node->name, node->children->sibling->name);
154 printf("filled,fillcolor=\"#EEFFEE\",color=\"#%s\"];\n",
155 (node->type == ERROR) ? "FF0000" : "EEFFEE");
158 void
159 llvm_codegen_visit_callparam_list (struct AstNode *node)
161 printf("\tnode_%x -> node_%x;\n", node->parent, node);
162 printf("\tnode_%x [label=\"%s\",style=", node, node->name);
163 printf("filled,color=\"#22DDAA\",fillcolor=\"#EEFFEE\"];\n");
164 printf("subgraph cluster_%x {\n\tstyle=dotted;\n", node);
167 void
168 llvm_codegen_visit_identifier (struct AstNode *node)
170 printf("\tnode_%x -> node_%x;\n", node->parent, node);
171 printf("\tnode_%x [label=\"%s\",style=", node, node->name);
172 printf("filled,color=\"#EEFFEE\"];\n");
174 if (node->symbol->decl_linenum == 0) {
175 printf("\tsymbol_%x [label=\"'%s'\\nundeclared\",",
176 node->symbol, node->symbol->name);
177 printf("color=red,fillcolor=\"#FFEEEE\",style=filled];\n");
180 printf("\tnode_%x -> symbol_%x", node, node->symbol);
182 if (is_symboldecl)
183 printf(" [color=\"#00FF00\"]");
185 printf(";\n");
188 void
189 llvm_codegen_visit_literal (struct AstNode *node)
191 printf("\tnode_%x -> literal_%x;\n", node->parent, node);
192 printf("\tliteral_%x [label=\"", node);
193 value_print(&node->value, node->type);
194 printf("\",style=filled,color=\"#FFFFCC\"];\n");
197 void
198 llvm_codegen_close_group ()
200 printf("}\n");
203 static void
204 _print_graph(struct AstNode *self)
206 int i;
207 bool is_program;
208 bool is_cluster;
209 bool is_funcproc;
210 struct AstNode *temp;
212 if (self == NULL)
213 return;
215 is_program = self->kind == PROGRAM;
216 is_funcproc = self->kind == PROCEDURE || self->kind == FUNCTION;
217 is_cluster = is_program || is_funcproc ||
218 self->kind == PROGDECL ||
219 strstr(self->name, "List");
221 printf("\tnode_%x [label=\"%s\",style=", self, self->name);
223 if (is_cluster) {
224 if (is_program)
225 printf("filled,color=orange,fillcolor=\"#FFEEEE\"];\n");
226 else if (is_funcproc)
227 printf("filled,color=blue,fillcolor=\"#EEEEFF\"];\n");
228 else
229 printf("filled,color=\"#22DDAA\",fillcolor=\"#EEFFEE\"];\n");
230 printf("subgraph cluster_%x {\n\tstyle=dotted;\n", self, self->name);
231 } else
232 printf("filled,color=\"#EEFFEE\"];\n");
234 if (is_funcproc) {
235 printf("\tsubgraph cluster_symtab_0x%x {\tstyle=filled;\n", self->symbol);
236 printf("\tcolor=\"#EFEFEF\";\n\tfontname=Courier;\n");
237 printf("\tnode [style=filled,color=white,fillcolor=\"#CCFF99\"];\n");
238 //_ast_node_print_graph_symbol_table(self->symbol);
239 printf("\t}\n");
242 if (self->children != NULL) {
243 temp = self->children;
244 while (temp != NULL) {
245 printf("\tnode_%x -> node_%x;\n", self, temp);
246 temp = temp->sibling;
248 } else {
249 if (self->symbol != NULL) {
250 printf("\tnode_%x -> symbol_%x [color=lightgray,headport=n];\n",
251 self, self->symbol);
252 } else if (strstr(self->name, "Literal")) {
253 printf("\tliteral_%x [label=\"", self);
254 value_print(&self->value, self->type);
255 printf("\",style=filled,color=\"#FFFFCC\"];\n");
256 printf("\tnode_%x -> literal_%x;\n", self, self);
261 _print_graph(self->children);
263 if (is_cluster)
264 printf("}\n");
266 _print_graph(self->sibling);
269 static void
270 _print_symbol_table(struct AstNode *node)
272 if (node->symbol->next == NULL)
273 return;
275 printf("\tnode_%x -> symbol_%x [lhead=cluster_symtab_%x,color=",
276 node, node->symbol->next, node);
277 if (node->parent == NULL)
278 printf("orange];\n");
279 else
280 printf("blue];\n");
282 printf("\tsubgraph cluster_symtab_%x {\n\tstyle=filled;\n", node);
284 if (node->parent == NULL)
285 printf("\tcolor=orange;\n");
286 else
287 printf("\tcolor=blue;\n");
289 printf("\tstyle=filled;\n\tfillcolor=\"#EFEFEF\";\n\tfontname=Courier;\n");
290 printf("\tnode [style=filled,color=white,fillcolor=\"#CCFF99\"];\n");
292 _print_symbols(node->symbol->next);
294 printf("\t}\n");
297 static void
298 _print_symbols(Symbol *symbol)
300 if (symbol == NULL)
301 return;
303 if (symbol->name != NULL) {
304 printf("\t\tsymbol_%x [shape=record,label=\"{", symbol);
305 printf("Symbol|Address: 0x%x\\l|lexeme: %s\\l|", symbol, symbol->name);
306 printf("type: %s\\l}\"", type_get_lexeme(symbol->type));
307 printf(",style=filled,color=white,fillcolor=\"#CCFF99\"];\n");
310 _print_symbols(symbol->next);