-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.c
158 lines (128 loc) · 3.84 KB
/
main.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
#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "scaner.h"
#include "zasobnik.h"
#include "str.h"
#include "parser.h"
#include "bvs.h"
#include "interpret.h"
/*
* Autor: Pavel Slabý, xslaby00
* a další
* Datum odevzdání: 11.12.2011
*/
UkTToken token;
FILE *soubor;
int chyba;
TZasobnikInt zas_int;
TZasobnikUk zas_uk;
UkTBSUzel tab_sym;
UkTBSUzel pom_tab_sym;
UkTBSUzel nazvy_funkci; // kam odkazuje navesti
UkTBSPolozka obsah;
UkTSezInstr seznam_instrukci;
unsigned int klic_cislo=0;
//TPrvek prvek_pomocny;
int typ_instrukce;
UkTBSPolozka op1;
UkTBSPolozka op2;
UkTBSPolozka op3;
// ---- nove pridano
UkTBSFunkce strom_funkci;
UkTBSFunkPol uzel_aktualni_funkce;
char *pom_token_data;
char * gen_klic;
// --- konec novyho
UkTBSUzel pole_stromu;
int delka_pole_stromu;
UkTZasAdr zas_navr_adres;
UkTSezPar zas_zpracovani;
UkTBSPolozka *uk_na_zasobnik;
void odalokuj_vse(){
Sez_zrus(seznam_instrukci);
Sez_zrus_funkce(uzel_aktualni_funkce->zasobnik);
//BVSZrus (&uzel_aktualni_funkce->koren);
token_uvolni(token);
zasobnik_free(&zas_uk, &zas_int);
fclose(soubor);
BVSZrus (&pom_tab_sym);
BVSFunkceZrus(&strom_funkci);
zas_adres_zrus(zas_navr_adres);
Sez_zrus_funkce(zas_zpracovani);
free(zas_navr_adres);
free(seznam_instrukci);
free(zas_zpracovani);
free(gen_klic);
if((obsah)->typ == TDRETEZEC){
free((obsah)->data.dataRet);
}
free(obsah);
}
/************************************
* FUNKCE MAIN CELEHO INTERPRETU ****
***********************************/
int main(){
chyba = ERR_OK;
if ((soubor = fopen("kod", "r")) == NULL) {
printf("main: otevreni souboru\n");
return ERR_INTERNI;
}
chyba = zasobnik_init(&zas_uk, &zas_int);
if (chyba!=ERR_OK){
fclose(soubor);
return chyba;
}
seznam_instrukci = malloc(sizeof(struct seznamInstr));
Sez_init(seznam_instrukci);
//strom_funkci = malloc(sizeof(struct bsfunkce));
BVSFunkceInit(&strom_funkci);
BVSInit(&pom_tab_sym);
delka_pole_stromu=1;
zas_navr_adres = malloc(sizeof(struct zasAdr));
zas_adres_in(zas_navr_adres);
zas_zpracovani = malloc(sizeof(struct sezPar));
Sez_init_funkce(zas_zpracovani);
gen_klic = malloc(1);
if ((obsah = malloc(sizeof (TBSPolozka)))==NULL){
return ERR_INTERNI;
}
obsah->typ = TDNIL;
printf("main: druha kontrola\n");
chyba = syntakticky_analyzator();
if (chyba != ERR_OK){
printf(" ----- VSTUP NEPRIJAT s kodem: %d ------\n",chyba);
odalokuj_vse();
return chyba;
}else{
printf(" ----- VSTUP PRIJAT ----- \n");
}
//Interpret(seznam_instrukci);
chyba = Interpret(seznam_instrukci);
printf("*************Vypis zasobniku****klokan******\n");
set_first(zas_zpracovani);
while(zas_zpracovani->aktivni != NULL){
switch (zas_zpracovani->aktivni->parametr.data->typ){
case TDCISLO: printf("-> ->Klic: %s, dataCis: %f, typ: %d\n", zas_zpracovani->aktivni->parametr.klic, zas_zpracovani->aktivni->parametr.data->data.dataCis, zas_zpracovani->aktivni->parametr.data->typ);
break;
case TDRETEZEC: printf("-> ->Klic: %s, dataRet: %s, typ: %d\n", zas_zpracovani->aktivni->parametr.klic, zas_zpracovani->aktivni->parametr.data->data.dataRet, zas_zpracovani->aktivni->parametr.data->typ);
break;
case TDBOOL: printf("-> ->Klic: %s, dataBool: %d, typ: %d\n", zas_zpracovani->aktivni->parametr.klic, zas_zpracovani->aktivni->parametr.data->data.dataBool, zas_zpracovani->aktivni->parametr.data->typ);
break;
case TDNIL: printf("-> ->Klic: %s, nil, typ: %d\n", zas_zpracovani->aktivni->parametr.klic, zas_zpracovani->aktivni->parametr.data->typ);
}
set_nasl(zas_zpracovani);
}
printf("**************************************\n");
//BVSVypisStrom(&pom_tab_sym);
odalokuj_vse();
if (chyba != ERR_OK){
printf(" ----- VSTUP NEPRIJAT s kodem: %d ------\n",chyba);
return chyba;
}else{
printf(" ----- VSTUP PRIJAT ----- \n");
return ERR_OK;
}
}