Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
epidemian
GitHub Repository: epidemian/gravity
Path: blob/master/src/compiler/gravity_visitor.c
1214 views
1
//
2
// gravity_visitor.c
3
// gravity
4
//
5
// Created by Marco Bambini on 08/09/14.
6
// Copyright (c) 2014 CreoLabs. All rights reserved.
7
//
8
9
#include "gravity_visitor.h"
10
11
// Visit a node invoking the associated callback.
12
13
#define VISIT(type) if (!self->visit_##type) return; \
14
self->visit_##type(self, (gnode_##type##_t *) node); \
15
break;
16
17
static void default_action (gnode_t *node) {
18
printf("Visitor unhandled case: %d\n", node->tag);
19
assert(0);
20
}
21
22
void gvisit(gvisitor_t *self, gnode_t *node) {
23
// this line added after implemented getter and setter,
24
// because they are functions inside a COMPOUND_STATEMENT and can be NULL
25
if (!node) return;
26
27
switch (node->tag) {
28
29
// statements (7)
30
case NODE_LIST_STAT: VISIT(list_stmt);
31
case NODE_COMPOUND_STAT: VISIT(compound_stmt);
32
case NODE_LABEL_STAT: VISIT(label_stmt);
33
case NODE_FLOW_STAT: VISIT(flow_stmt);
34
case NODE_JUMP_STAT: VISIT(jump_stmt);
35
case NODE_LOOP_STAT: VISIT(loop_stmt);
36
case NODE_EMPTY_STAT: VISIT(empty_stmt);
37
38
// declarations (5)
39
case NODE_ENUM_DECL: VISIT(enum_decl);
40
case NODE_FUNCTION_DECL: VISIT(function_decl);
41
case NODE_VARIABLE_DECL: VISIT(variable_decl);
42
case NODE_CLASS_DECL: VISIT(class_decl);
43
case NODE_MODULE_DECL: VISIT(module_decl);
44
// NODE_VARIABLE is handled by NODE_VARIABLE_DECL
45
46
// expressions (8)
47
case NODE_BINARY_EXPR: VISIT(binary_expr);
48
case NODE_UNARY_EXPR: VISIT(unary_expr);
49
case NODE_FILE_EXPR: VISIT(file_expr);
50
case NODE_LIST_EXPR: VISIT(list_expr);
51
case NODE_LITERAL_EXPR: VISIT(literal_expr);
52
case NODE_IDENTIFIER_EXPR: VISIT(identifier_expr);
53
case NODE_KEYWORD_EXPR: VISIT(keyword_expr);
54
case NODE_POSTFIX_EXPR: VISIT(postfix_expr);
55
56
// default assert
57
default: default_action(node);
58
}
59
}
60
61