-
Notifications
You must be signed in to change notification settings - Fork 0
/
ast.c
230 lines (192 loc) · 6.12 KB
/
ast.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
#include <stdlib.h>
#include "ast.h"
A_Programa A_programa(String _id, A_Bloco _bloco){
A_Programa programa = malloc(sizeof(*programa));
programa->id = _id;
programa->bloco = _bloco;
return programa;
}
A_Bloco A_bloco(A_LstDecVar _secDecVar, A_LstDecSub _secDecSub, A_Cmd _cmdComp){
A_Bloco bloco = malloc(sizeof(*bloco));
bloco->secDecVar = _secDecVar;
bloco->secDecSub = _secDecSub;
bloco->cmdComp = _cmdComp;
return bloco;
}
A_ListaId A_listaId(String _id, A_ListaId _listaId){
A_ListaId no = malloc(sizeof(*no));
no->id = _id;
no->prox = _listaId;
return no;
}
A_DecVar A_decVar(String _id, String _tipo){
A_DecVar decVar = malloc(sizeof(*decVar));
decVar->id = _id;
decVar->tipo = _tipo;
return decVar;
}
A_LstDecVar A_lstDecVar(A_DecVar _decVar, A_LstDecVar _lstDecVar){
A_LstDecVar no = malloc(sizeof(*no));
no->decVar = _decVar;
no->prox = _lstDecVar;
return no;
}
A_LstDecVar concatLstDecVar(A_LstDecVar _lst1, A_LstDecVar _lst2){
A_LstDecVar lstConcat = _lst1;
if(_lst1 != NULL){
while(_lst1->prox != NULL){
_lst1 = _lst1->prox;
}
_lst1->prox = _lst2;
}
return lstConcat;
}
A_Exp A_exp_fator_chamada_funcao(A_ChamFunc _chamadaFuncao){
A_Exp no = malloc(sizeof(*no));
no->tipo = TE_Fator;
no->fator.tipo = TF_ChamFunc;
no->fator.chamadaFuncao = _chamadaFuncao;
return no;
}
A_Exp A_exp_fator_variavel(A_Var _variavel){
A_Exp no = malloc(sizeof(*no));
no->tipo = TE_Fator;
no->fator.tipo = TF_Var;
no->fator.variavel = _variavel;
return no;
}
A_Exp A_exp_fator_int(int _num){
A_Exp no = malloc(sizeof(*no));
no->tipo = TE_Fator;
no->fator.tipo = TF_Num;
no->fator.num = _num;
return no;
}
A_Exp A_exp_fator_logico(int _logico){
A_Exp no = malloc(sizeof(*no));
no->tipo = TE_Fator;
no->fator.tipo = TF_Logico;
no->fator.logico = _logico;
return no;
}
A_Exp A_exp_fator_expressao(A_Exp _expressao){
A_Exp no = malloc(sizeof(*no));
no->tipo = TE_Fator;
no->fator.tipo = TF_Exp;
no->fator.expressao = _expressao;
return no;
}
A_Exp A_exp_binaria(A_Exp _exp_esquerda, int _relacao, A_Exp _exp_direita){
A_Exp no = malloc(sizeof(*no));
no->tipo = TE_Exp_Binaria;
no->binaria.exp_esquerda = _exp_esquerda;
no->binaria.relacao = _relacao;
no->binaria.exp_direita = _exp_direita;
return no;
}
A_ListExp A_listExp(A_Exp _expressao, A_ListExp _lista_expressoes){
A_ListExp no = malloc(sizeof(*no));
no->expressao = _expressao;
no->prox = _lista_expressoes;
return no;
}
A_BlocoSub A_blocoSub(A_LstDecVar _secDecVar, A_Cmd _cmdComp){
A_BlocoSub blocoSub = malloc(sizeof(*blocoSub));
blocoSub->secDecVar = _secDecVar;
blocoSub->cmdComp = _cmdComp;
return blocoSub;
}
A_DecParam A_decParam(A_ListaId _lista_identificadores, String _tipo){
A_DecParam decParam = malloc(sizeof(*decParam));
decParam->lista_identificadores = _lista_identificadores;
decParam->tipo = _tipo;
return decParam;
}
A_DecParamList A_decParamList(A_DecParam _declaracao_parametros, A_DecParamList _lista_dec_parametros){
A_DecParamList no = malloc(sizeof(*no));
no->declaracao_parametros = _declaracao_parametros;
no->prox = _lista_dec_parametros;
return no;
}
A_DecProc A_decProc_proc(String _id, A_DecParamList _parametros_formais, A_BlocoSub _bloco){
A_DecProc decProc = malloc(sizeof(*decProc));
decProc->tipo = TD_PROC;
decProc->_decProc_proc.id = _id;
decProc->_decProc_proc.parametros_formais = _parametros_formais;
decProc->_decProc_proc.bloco = _bloco;
return decProc;
}
A_DecProc A_decProc_func(String _id, A_DecParamList _parametros_formais, A_BlocoSub _bloco, String _tipo){
A_DecProc decProc = malloc(sizeof(*decProc));
decProc->tipo = TD_FUNC;
decProc->_decProc_func.id = _id;
decProc->_decProc_func.parametros_formais = _parametros_formais;
decProc->_decProc_func.bloco = _bloco;
decProc->_decProc_func.tipo = _tipo;
return decProc;
}
A_Cmd A_cmd_atrib(A_Exp _expressao, String _id){
A_Cmd atrib = malloc(sizeof(*atrib));
atrib->tipo = TC_ATRIB;
atrib->A_atrib.expressao = _expressao;
atrib->A_atrib.id = _id;
return atrib;
}
A_Cmd A_cmd_chamProc(String _identificador, A_ListExp _lista_expressoes){
A_Cmd chamProc = malloc(sizeof(*chamProc));
chamProc->tipo = TC_CHAMPROC;
chamProc->A_chamProc.identificador = _identificador;
chamProc->A_chamProc.lista_expressoes = _lista_expressoes;
return chamProc;
}
A_Cmd A_cmd_cond(A_Exp _expressao, A_Cmd _comando_1, A_Cmd _comando_2){
A_Cmd cond = malloc(sizeof(*cond));
cond->tipo = TC_COND;
cond->A_cond.expressao = _expressao;
cond->A_cond.comando_1 = _comando_1;
cond->A_cond.comando_2 = _comando_2;
return cond;
}
A_Cmd A_cmd_loop(A_Exp _expressao, A_Cmd _comando){
A_Cmd loop = malloc(sizeof(*loop));
loop->tipo = TC_LOOP;
loop->A_loop.expressao = _expressao;
loop->A_loop.comando = _comando;
return loop;
}
A_Cmd A_cmd_read(A_ListaId _lista_identificadores){
A_Cmd io = malloc(sizeof(*io));
io->tipo = TC_LEITURA;
io->A_io_read._lista_identificadores = _lista_identificadores;
return io;
}
A_Cmd A_cmd_write(A_ListExp _lista_expressoes){
A_Cmd io = malloc(sizeof(*io));
io->tipo = TC_ESCRITA;
io->A_io_write.lista_expressoes = _lista_expressoes;
return io;
}
A_Cmd A_cmdComp(A_Cmd _comando, A_Cmd _lista_comandos){
A_Cmd no = malloc(sizeof(*no));
no->tipo = TC_CMDCOMP;
no->A_cmdComp.comando = _comando;
no->A_cmdComp.prox = _lista_comandos;
return no;
}
A_ChamFunc A_chamFunc(String _id, A_ListExp _lista_expressoes){
A_ChamFunc chamFunc = malloc(sizeof(*chamFunc));
chamFunc->id = _id;
chamFunc->lista_expressoes = _lista_expressoes;
return chamFunc;
}
A_Var A_var(String _id){
A_Var var = malloc(sizeof(*var));
var->id = _id;
return var;
}
A_LstDecSub A_lstDecSub(A_DecProc _decProc, A_LstDecSub _lstDecSub){
A_LstDecSub lstDecSub = malloc(sizeof(*lstDecSub));
lstDecSub->decProc = _decProc;
lstDecSub->prox = _lstDecSub;
return lstDecSub;
}