-
Notifications
You must be signed in to change notification settings - Fork 0
/
tree.h
153 lines (133 loc) · 3.56 KB
/
tree.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#ifndef TREE_H
#define TREE_H
// Tipo di dato
enum TYPE {
BOOL_T,
INT_T,
FLOAT_T,
DOUBLE_T,
VOID_T,
STRING_T,
ERROR_T
};
// Tipo di nodo
enum NODE_TYPE {
EXPR_T,
IF_T,
VAL_T,
VAR_T,
DECL_T,
RETURN_T,
FCALL_T,
FDEF_T,
FOR_T,
ERROR_NODE_T
};
// Tipo di espressione
enum EXPRESSION_TYPE {
ASS_T,
ADD_T,
SUB_T,
DIV_T,
MUL_T,
NOT_T,
AND_T,
OR_T,
G_T,
GE_T,
L_T,
LE_T,
EQ_T,
NE_T,
NEG_T,
PAR_T
};
// Struttura del nodo espressione e assignment
struct expression {
enum EXPRESSION_TYPE expr_type;
struct AstNode *l;
struct AstNode *r;
/* dato che hanno stessa struttura li abbiamo uniti
struct assignment {
struct AstNode *var;
struct AstNode *r;
}; */
};
// Struttura del nodo if
struct ifNode {
struct AstNode *cond;
struct AstNode *body;
struct AstNode *else_body;
};
// Struttura del nodo for
struct forNode {
struct AstNode *init;
struct AstNode *cond;
struct AstNode *update;
struct AstNode *stmt;
};
// Struttura del nodo valore
struct value {
enum TYPE val_type;
char *string_val;
};
// Struttura del nodo variabile
struct variable {
char *name;
int by_reference; // indica se è stato usato l'operatore di referenziazione &
struct AstNode *array_dim; // indica sia la dimensione che l'indice di un array
};
// Struttura del nodo dichiarazione
struct declaration {
enum TYPE type;
struct AstNode *var;
};
// Struttura del nodo return
struct returnNode {
struct AstNode *expr;
};
// Struttura del nodo chiamata a funzione
struct funcCall {
char *name;
struct AstNode *args;
};
// Struttura del nodo definizione di funzione
struct funcDef {
enum TYPE ret_type;
char *name;
struct AstNode *params;
struct AstNode *code;
};
// Struttura del nodo generico Ast
struct AstNode {
enum NODE_TYPE nodetype;
union node{
struct variable *var;
struct value *val;
struct expression *expr;
struct ifNode *ifn;
struct forNode *forn;
struct declaration *decl;
struct returnNode *ret;
struct funcCall *fcall;
struct funcDef *fdef;
}node;
struct AstNode *next;
};
/* Funzioni per creare i nodi */
struct AstNode* new_value(enum NODE_TYPE nodetype, enum TYPE val_type, char *string_val);
struct AstNode* new_return(enum NODE_TYPE nodetype, struct AstNode *expr);
struct AstNode* new_variable(enum NODE_TYPE nodetype, char* name, struct AstNode *array_dim);
struct AstNode* new_expression(enum NODE_TYPE nodetype, enum EXPRESSION_TYPE expr_type, struct AstNode* l, struct AstNode* r);
struct AstNode* new_declaration(enum NODE_TYPE nodetype, enum TYPE type, struct AstNode *var);
struct AstNode* new_func_call(enum NODE_TYPE nodetype, char *name, struct AstNode* args);
struct AstNode* new_func_def(enum NODE_TYPE nodetype, enum TYPE ret_type, char *name, struct AstNode* params, struct AstNode* code);
struct AstNode* new_for(enum NODE_TYPE nodetype, struct AstNode *init, struct AstNode* cond, struct AstNode* update, struct AstNode* stmt);
struct AstNode* new_if(enum NODE_TYPE nodetype, struct AstNode *cond, struct AstNode *body, struct AstNode *else_body);
struct AstNode* new_error(enum NODE_TYPE nodetype);
/* Funzione per modificare gli attributi dei nodi */
void by_reference(struct AstNode *node);
/* Funzioni per linkare due nodi */
struct AstNode* link_AstNode(struct AstNode *node, struct AstNode *next);
struct AstNode* append_AstNode(struct AstNode *node, struct AstNode *next);
#endif