-
Notifications
You must be signed in to change notification settings - Fork 0
/
interpret_zaloha.h
253 lines (197 loc) · 8.12 KB
/
interpret_zaloha.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
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
//interpret.h
//DEFINICE ------------------------------------------------
#define KONEC_OK 0
#define KONEC_CHYBA 1
#define TRUE 0
#define FALSE 1
#define MAX_ARR 20
//---------------- struktury pro BVS funkci ------------------
typedef struct bsfunkpol {
int pocet_param; // promenna pro ulozeni poctu parametru funkce
struct bsuzel *koren; // koren tabulky symbolu dane fce
struct sezPar *zasobnik;
struct plzkaSez *adresa; // inception
} TBSFunkPol, *UkTBSFunkPol;
typedef struct bsfunkce {
char *klic; //retezec slouzici jako klic - nazev funkce
struct bsfunkpol *data; //ukazatel na strukturu dat
struct bsfunkce *luk; //ukazatel na leveho potomka
struct bsfunkce *puk; //ukazatel na praveho potomka
} TBSFunkce, *UkTBSFunkce;
//samotna data
typedef union unidata {
double dataCis; //datovy typ number
char *dataRet; //datovy typ string
int dataBool; //datovy typ boolean
} TBSData;
//vyctovy typ datovych typu
typedef enum enTTDat {
TDCISLO, //cislo
TDRETEZEC, //retezec
TDBOOL, //boolean
TDNIL, //nil
} TTDat;
//struktura dat
typedef struct bsdata {
int typ; //typ dat
TBSData data; //union s daty
} TBSPolozka, *UkTBSPolozka;
//struktura uzlu
typedef struct bsuzel {
char *klic; //retezec slouzici jako klic
struct bsdata data; //ukazatel na strukturu dat
struct bsuzel *luk; //ukazatel na leveho potomka
struct bsuzel *puk; //ukazatel na praveho potomka
} TBSUzel, *UkTBSUzel;
//FUNKCE
void BVSInit (UkTBSUzel *Kor);
int BVSNajdi (UkTBSUzel Kor, char *K, UkTBSPolozka *obsah);
void BVSVloz (UkTBSUzel* Kor, char *K, UkTBSPolozka obsah);
void BVSNahradZaPraveho(UkTBSUzel PtrReplaced, UkTBSUzel *Kor);
void BVSVymaz (UkTBSUzel *Kor, char *K);
void BVSZrus (UkTBSUzel *Kor);
void BVSVypisStrom (UkTBSUzel *Kor);
//dalsi by Paulie
int Pole_realokuj(UkTBSUzel *ret, int delka);
void Pole_uvolni(UkTBSUzel ret);
int Pole_alokuj(UkTBSUzel *ret, int pocet);
void BVSFunkceInit (UkTBSFunkce *Kor);
int BVSFunkceNajdi (UkTBSFunkce Kor, char *K, UkTBSFunkPol *obsah);
void BVSFunkceVloz (UkTBSFunkce *Kor, char *K, UkTBSFunkPol obsah);
void BVSFunkceZrus (UkTBSFunkce *Kor);
// typy instrukci
typedef enum nazvyInstrukci {
IN_READ = 0, // read | op | / | cil 0
IN_WRITE, // write | op | / | / 1
//---------------------------------------------
IN_ADD, // + | op | op | cil 2
IN_SUB, // - | op | op | cil 3
IN_MUL, // * | op | op | cil 4
IN_DIV, // / | op | op | cil 5
IN_MOCN, // mocnina | op | op | cil 6
//---------------------------------------------
IN_MENSI, // < | op | op | cil 7
IN_MENROV, // <= | op | op | cil 8
IN_VETSI, // > | op | op | cil 9
IN_VETROV, // >= | op | op | cil 10
IN_ROVNO, // == | op | op | cil 11
IN_NEROVNO, // ~= | op | op | cil 12
IN_KONK, // .. | op | op | cil 13
//---------------------------------------------
IN_GOTO, // goto | navesti| / | / 14
IN_PGOTO, // podminene | op |nvsti| / 15
IN_NVSTI, // navesti | navesti| / | / 16
//---------------------------------------------
IN_TYPE, // type() | op | / | cil 17
IN_FIND, // find() | ret | hl | cil 18 hl - hledany podretezec
IN_SORT, // heapsort() | op | / | cil 19
IN_SUBSTR, // substr() | 20
//---------------------------------------------
IN_PRIRAD, // prirazeni | zas | kam | co 21
//---------------------------------------------
IN_POP, // POP adrr | funkce | cil | / 22
IN_PUSH, // PUSH adrr | funkce | adr | / 23
IN_HLEDEJ, // hledani | kde | co | cil 24
//---------------------------------------------
IN_KONEC, // konec | 25
} TNazInstr;
//STRUKTURY -----------------------------------------------
//struktura pro jednotlive instrukce
//ukazatel na void se pozdeji pretipuje
typedef struct {
int typInstr; // typ instrukce
UkTBSPolozka op1; // adresa 1
UkTBSPolozka op2; // adresa 2
UkTBSPolozka op3; // adresa 3
} TInstr, *UkTInstr;
//struktura pro polozky seznamu
typedef struct plzkaSez {
TInstr instrukce; //ukazatel na strukturu instrukce
struct plzkaSez *ukdalsi; //ukazatel na dalsi prvek seznamu
} TPlzkaSez, *UkTPlzkaSez;
//struktura celeho seznamu
typedef struct seznamInstr{
struct plzkaSez *prvni; // prvni polozka
struct plzkaSez *posledni; // posledni polozka
struct plzkaSez *aktivni; // aktivni polozka
} TSezInstr, *UkTSezInstr;
/* SEZNAM paramtrů fcí */
//struktura uzlu
typedef struct promennaPar {
char *klic; //retezec slouzici jako klic
struct bsdata *data; //ukazatel na strukturu dat
} TPromennaPar, *UkTPromennaPar;
//struktura pro polozky seznamu
typedef struct plzkaSezPar {
struct promennaPar parametr; //ukazatel na strukturu instrukce
struct plzkaSezPar *ukdalsi; //ukazatel na dalsi prvek seznamu
} TPlzkaSezPar, *UkTPlzkaSezPar;
//struktura celeho seznamu
typedef struct sezPar{
struct plzkaSezPar *prvni; // prvni polozka
struct plzkaSezPar *aktivni; // aktivni polozka
struct plzkaSezPar *posledni; // posledni polozka
} TSezPar, *UkTSezPar;
/* Zasobnik navratovych adres */
//struktura pro polozky seznamu
typedef struct plzkaZas {
TInstr *adresa; //ukazatel na strukturu instrukce
struct plzkaZas *ukdalsi; //ukazatel na dalsi prvek seznamu
} TPlzkaZas, *UkTPlzkaZas;
//struktura celeho seznamu
typedef struct zasAdr{
struct plzkaZas *prvni; // prvni polozka
} TZasAdr, *UkTZasAdr;
//FUNKCE --------------------------------------------------
//funkce seznamu
void Sez_init(UkTSezInstr L);
void Sez_zrus(UkTSezInstr L);
void Sez_vloz(UkTSezInstr L, UkTInstr instr);
void Sez_prvni(UkTSezInstr L);
void *Sez_hodnota_aktivniho(UkTSezInstr L);
void Sez_dalsi(UkTSezInstr L);
void Sez_nastav_aktivni(UkTSezInstr L, UkTPlzkaSez instrukce);
void *Sez_vrat_uk_posledni(UkTSezInstr L);
//funkce interpretu
int Vloz_instrukci(UkTSezInstr seznam, int typ, void *op1, void *op2, void *op3);
int Interpret(UkTSezInstr list);
// funkce na seznamem/zasobnikem parametru funkci
void Sez_init_funkce(UkTSezPar L);
void Sez_zrus_funkce(UkTSezPar L);
int insert_last(UkTSezPar L, char *ret);
void set_first(UkTSezPar L);
void set_nasl(UkTSezPar L);
void *hodnota_aktivniho(UkTSezPar L);
int zmen_data_par(UkTSezPar L, void *ret, int typ);
int najdi_prvek_lok(UkTSezPar L, char *K);
void kopiruj_parametry(UkTSezPar zas_zpracovani, UkTSezPar zasobnik);
void kopiruj_promenne(UkTSezPar zas_zpracovani, UkTBSUzel *UkKor);
int najdi_prom(UkTSezPar L, char *K, UkTBSPolozka *ukazatel);
void vymaz_promenne(UkTSezPar L);
// funkce pro praci se zasobnikem navratovych adres
void zas_adres_in(UkTZasAdr L);
void zas_adres_zrus(UkTZasAdr L);
int Push_adr(UkTZasAdr L, UkTInstr adresa);
void Pop_adr(UkTZasAdr L, UkTInstr adresa);
// --------------------------- z zasobnik.h --------------
#define REALLOC_SOUSTO 4 // TODO: zmenit na vetsi pred odevzdanim
// ZMENIT ZPATKY NA 2 - KVULI TESTOVANI ALOKACE
typedef struct stTPrvek {
int typ; // typ tokenu
//UkTBSPolozka uk_na_prvek_ts;
struct bsdata *uk_na_prvek_ts;
} TPrvek;
typedef struct stTZasobnik {
int top; //vrchol zasobniku
int velikost; //velikost alokovaneho prostoru
struct stTPrvek * array; //data zasobniku
} TZasobnik;
int zasobnik_init (TZasobnik *zas);
void zasobnik_free(TZasobnik *zas);
int zasobnik_pop (TZasobnik *zas);
int zasobnik_push (TZasobnik *zas, TPrvek prvek);
//int zasobnik_pristup (TZasobnik *zas, TPrvek * hodn, int posun);
int zasobnik_top (TZasobnik *zas, TPrvek * hodn);
void zasobnik_vynuluj (TZasobnik *zas);
int zasobnik_pristup_uk (TZasobnik *zas, UkTBSPolozka * hodn, int posun);
int zasobnik_pristup_int (TZasobnik *zas, int * hodn, int posun);