-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtrees.c
298 lines (257 loc) · 5.75 KB
/
trees.c
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
#include "trees.h"
#include "util.h"
/**
*
*
*/
A_program program(int lineno, A_func_dec_list func_decs)
{
A_program retval = malloc_checked(sizeof(struct A_program_t));
retval->lineno = lineno;
retval->function_decs = func_decs;
return (retval);
}
/**
*
*
*/
A_var_dec variable_dec(int lineno, char *type, char *name, int array)
{
A_var_dec retval = malloc_checked(sizeof(struct A_var_dec_t));
retval->lineno = lineno;
retval->type = type;
retval->name = name;
retval->array = array;
return (retval);
}
/**
*
*
*/
A_var_dec_list variable_dec_list(int lineno, A_var_dec first, A_var_dec_list next)
{
A_var_dec_list retval = malloc_checked(sizeof(struct A_var_dec_list_t));
retval->lineno = lineno;
retval->first = first;
retval->next = next;
return (retval);
}
/**
*
*
*/
A_func_dec function_def(int lineno, char *return_type, char *name, A_param_list params, A_statement_list body)
{
A_func_dec retval = malloc_checked(sizeof(struct A_func_dec_t));
retval->lineno = lineno;
retval->type = Function;
retval->self.function_def.return_type = return_type;
retval->self.function_def.name = name;
retval->self.function_def.params = params;
retval->self.function_def.body = body;
return (retval);
}
/**
*
*
*/
A_func_dec prototype(int lineno, char *return_type, char *name, A_param_list params)
{
A_func_dec retval = malloc_checked(sizeof(struct A_func_dec_t));
retval->lineno = lineno;
retval->type = Prototype;
retval->self.prototype.return_type = return_type;
retval->self.prototype.name = name;
retval->self.prototype.params = params;
return (retval);
}
/**
*
*
*/
A_func_dec_list function_dec_list(int lineno, A_func_dec first, A_func_dec_list next)
{
A_func_dec_list retval = malloc_checked(sizeof(struct A_func_dec_list_t));
retval->lineno = lineno;
retval->first = first;
retval->next = next;
return (retval);
}
/**
*
*
*/
A_param parameter(int lineno, char *type, char *name, int array)
{
A_param retval = malloc_checked(sizeof(struct A_param_t));
retval->lineno = lineno;
retval->type = type;
retval->name = name;
retval->array = array;
return (retval);
}
/**
*
*
*/
A_param_list parameter_list(int lineno, A_param first, A_param_list next)
{
A_param_list retval = malloc_checked(sizeof(struct A_param_list_t));
retval->lineno = lineno;
retval->first = first;
retval->next = next;
return (retval);
}
/**
*
*
*/
A_statement assign_statement(int lineno, A_variable lval, A_expression rval)
{
A_statement retval = malloc_checked(sizeof(struct A_statement_t));
retval->lineno = lineno;
retval->type = Assign;
retval->self.assign_stm.lval = lval;
retval->self.assign_stm.rval = rval;
return (retval);
}
/**
*
*
*/
A_statement var_dec_statement(int lineno, char *type, char *name, int array, A_expression init)
{
A_statement retval = malloc_checked(sizeof(struct A_statement_t));
retval->lineno = lineno;
retval->type = VarDec;
retval->self.var_dec_stm.type = type;
retval->self.var_dec_stm.name = name;
retval->self.var_dec_stm.array = array;
retval->self.var_dec_stm.init = init;
return (retval);
}
/**
*
*
*/
A_statement block_statement(int lineno, A_statement_list statements)
{
A_statement retval = malloc_checked(sizeof(struct A_statement_t));
retval->lineno = lineno;
retval->type = Block;
retval->self.block_stm.statements = statements;
return (retval);
}
/**
*
*
*/
A_statement call_statement(int lineno, char *name, A_expression_list actuals)
{
A_statement retval = malloc_checked(sizeof(struct A_statement_t));
retval->lineno = lineno;
retval->type = Call;
retval->self.call_stm.name = name;
retval->self.call_stm.actuals = actuals;
return (retval);
}
/**
*
*
*/
A_statement return_statement(int lineno, A_expression retvalue)
{
A_statement retval = malloc_checked(sizeof(struct A_statement_t));
retval->lineno = lineno;
retval->type = Return;
retval->self.return_stm.retval = retvalue;
return (retval);
}
/**
*
*
*/
A_statement empty_statement(int lineno)
{
A_statement retval = malloc_checked(sizeof(struct A_statement_t));
retval->lineno = lineno;
retval->type = Empty;
return (retval);
}
/**
*
*
*/
A_statement_list statement_list(int lineno, A_statement first, A_statement_list next)
{
A_statement_list retval = malloc_checked(sizeof(struct A_statement_list_t));
retval->lineno = lineno;
retval->first = first;
retval->next = next;
return (retval);
}
/**
*
*
*/
A_expression int_expression(int lineno, int value)
{
A_expression retval = malloc_checked(sizeof(struct A_expression_t));
retval->lineno = lineno;
retval->type = IntExp;
retval->self.int_exp.value = value;
return (retval);
}
/**
*
*
*/
A_expression op_expression(int lineno, A_operator op, A_expression lval, A_expression rval)
{
A_expression retval = malloc_checked(sizeof(struct A_expression_t));
retval->lineno = lineno;
retval->type = OpExp;
retval->self.op_exp.op = op;
retval->self.op_exp.lval = lval;
retval->self.op_exp.rval = rval;
return (retval);
}
/**
*
*
*/
A_expression var_expression(int lineno, A_variable var)
{
A_expression retval = malloc_checked(sizeof(struct A_expression_t));
retval->lineno = lineno;
retval->type = VarExp;
retval->self.var_exp.var = var;
return (retval);
}
/**
*
*
*/
A_expression call_expression(int lineno, char *name, A_expression_list actuals)
{
A_expression retval = malloc_checked(sizeof(struct A_expression_t));
retval->lineno = lineno;
retval->type = CallExp;
retval->self.call_exp.name = name;
retval->self.call_exp.actuals = actuals;
return (retval);
}
/**
*
*
*
*/
A_expression_list expression_list(int lineno, A_expression first, A_expression_list next)
{
A_expression_list retval = malloc_checked(sizeof(struct A_expression_list_t));
retval->lineno = lineno;
retval->first = first;
retval->next = next;
return (retval);
}
A_program A_root;