5 #include "typecheck_visitor.h"
8 ast_node_new(const char* name
, int kind
, int type
,
9 int linenum
, Symbol
*symbol
)
14 node
= (struct AstNode
*) malloc (sizeof(struct AstNode
));
17 node
->name
= strdup(name
);
23 node
->linenum
= linenum
;
24 node
->child_counter
= 0;
25 node
->symbol
= symbol
;
27 node
->children
= NULL
;
34 ast_node_destroy(struct AstNode
*self
)
37 ast_node_destroy(self
->children
);
38 ast_node_destroy(self
->sibling
);
44 ast_node_get_value(struct AstNode
*self
)
46 if (self
->kind
== IDENTIFIER
)
47 return self
->symbol
->value
;
53 ast_node_get_value_as_int(struct AstNode
*self
)
55 if (self
->kind
== IDENTIFIER
)
56 return self
->symbol
->value
.integer
;
58 return self
->value
.integer
;
62 ast_node_get_child_counter(struct AstNode
*self
)
64 return self
->child_counter
++;
68 ast_node_check_errors(struct AstNode
*self
)
70 struct AstNode
*child
;
72 if (self
== NULL
|| self
->type
== ERROR
)
75 for (child
= self
->children
; child
!= NULL
; child
= child
->sibling
) {
76 if (ast_node_check_errors(child
) == TRUE
)
84 ast_node_add_child(struct AstNode
*self
, struct AstNode
*child
)
91 if (self
->children
== NULL
) {
93 self
->children
= child
;
95 ast_node_add_sibling(self
->children
, child
);
97 for (temp
= child
; temp
!= NULL
; temp
= temp
->sibling
)
102 ast_node_add_sibling(struct AstNode
*self
, struct AstNode
*sibling
)
104 struct AstNode
*temp
;
109 if (self
->sibling
== NULL
) {
110 self
->sibling
= sibling
;
112 for (temp
= self
->sibling
; temp
->sibling
!= NULL
; temp
= temp
->sibling
)
114 temp
->sibling
= sibling
;
119 ast_node_accept(struct AstNode
*self
, Visitor
*visitor
)
126 self
->child_counter
= 1;
128 switch (self
->kind
) {
130 visit
= visitor
->visit_program
;
133 visit
= visitor
->visit_programdecl
;
136 visit
= visitor
->visit_vardecl_list
;
139 visit
= visitor
->visit_vardecl
;
142 visit
= visitor
->visit_identifier_list
;
145 visit
= visitor
->visit_procfunc_list
;
148 visit
= visitor
->visit_procedure
;
151 visit
= visitor
->visit_function
;
154 visit
= visitor
->visit_param_list
;
157 visit
= visitor
->visit_parameter
;
160 visit
= visitor
->visit_statement_list
;
163 visit
= visitor
->visit_printint_stmt
;
166 visit
= visitor
->visit_printchar_stmt
;
169 visit
= visitor
->visit_printbool_stmt
;
172 visit
= visitor
->visit_printline_stmt
;
174 case ASSIGNMENT_STMT
:
175 visit
= visitor
->visit_assignment_stmt
;
178 visit
= visitor
->visit_if_stmt
;
181 visit
= visitor
->visit_while_stmt
;
184 visit
= visitor
->visit_for_stmt
;
187 visit
= visitor
->visit_rel_expr
;
190 visit
= visitor
->visit_add_expr
;
193 visit
= visitor
->visit_mul_expr
;
196 visit
= visitor
->visit_notfactor
;
199 visit
= visitor
->visit_call
;
202 visit
= visitor
->visit_callparam_list
;
205 visit
= visitor
->visit_callparam
;
208 visit
= visitor
->visit_identifier
;
213 visit
= visitor
->visit_literal
;
218 visit
= visitor
->visit_add_op
;
223 visit
= visitor
->visit_mul_op
;
231 visit
= visitor
->visit_rel_op
;
234 visit
= visitor
->visit_not_op
;
241 visit(visitor
, self
);
245 ast_node_accept_children(struct AstNode
*self
, Visitor
*visitor
)
247 struct AstNode
*temp
;
248 for (temp
= self
; temp
!= NULL
; temp
= temp
->sibling
)
249 ast_node_accept(temp
, visitor
);