-
Notifications
You must be signed in to change notification settings - Fork 0
/
global_interface.c
141 lines (120 loc) · 3.43 KB
/
global_interface.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
/**
* @file global_interface.h
* @project Compiler of language IFJ18. School project from subjects IFJ and IAL.
* @brief Global interface of symtables used for parser and generator.
* @date November 2018
* @author Juraj Holub <[email protected]>
*/
#include "stack.h"
#include "global_interface.h"
#include <stdio.h>
#include <stdlib.h>
/***************************** GLOBAL SYMBOL TABLES **************************/
table_item_t* glob_main_st = NULL; // sym tab for main body of program
table_item_t* glob_fun_st = NULL; // sym tab for all functions declarations and calls
// stack of sym tabs for local frames (function body), top of stack is last function
stack_t glob_local_st;
data_t *expr_type = NULL; // ptr to result of expression saved in some sym tab
table_item_t* get_main_st()
{
if (glob_main_st == NULL)
{
glob_main_st = get_hash_table();
}
return glob_main_st;
}
table_item_t* get_fun_st()
{
if (glob_fun_st == NULL)
{
glob_fun_st = get_hash_table();
data_t inputs;
inputs.type = DEF_FUN;
inputs.id = string_create("inputs");
inputs.value = STRING;
inputs.param_cnt = 0;
insert(glob_fun_st, &inputs);
string_free(inputs.id);
data_t inputi;
inputi.type = DEF_FUN;
inputi.id = string_create("inputi");
inputi.value = INTEGER;
inputi.param_cnt = 0;
insert(glob_fun_st, &inputi);
string_free(inputi.id);
data_t inputf;
inputf.type = DEF_FUN;
inputf.id = string_create("inputf");
inputf.value = FLOAT;
inputf.param_cnt = 0;
insert(glob_fun_st, &inputf);
string_free(inputf.id);
data_t print;
print.type = DEF_FUN;
print.id = string_create("print");
print.value = NIL;
insert(glob_fun_st, &print);
string_free(print.id);
data_t length;
length.type = DEF_FUN;
length.id = string_create("length");
length.value = INTEGER;
length.param_cnt = 1;
insert(glob_fun_st, &length);
string_free(length.id);
data_t substr;
substr.type = DEF_FUN;
substr.id = string_create("substr");
substr.value = STRING;
substr.param_cnt = 3;
insert(glob_fun_st, &substr);
string_free(substr.id);
data_t ord;
ord.type = DEF_FUN;
ord.id = string_create("ord");
ord.value = INTEGER;
ord.param_cnt = 2;
insert(glob_fun_st, &ord);
string_free(ord.id);
data_t chr;
chr.type = DEF_FUN;
chr.id = string_create("chr");
chr.value = STRING;
chr.param_cnt = 1;
insert(glob_fun_st, &chr);
string_free(chr.id);
}
return glob_fun_st;
}
table_item_t* get_local_st()
{
table_item_t* local_st = stack_top(&glob_local_st);
return local_st;
}
void set_local_st()
{
table_item_t *local = get_hash_table();
stack_push(&glob_local_st, local);
}
data_t *get_expr_type()
{
return expr_type;
}
void set_expr_type(data_t *expr)
{
expr_type = expr;
}
void remove_all_st()
{
if (glob_main_st != NULL)
destroy_hash_table(glob_main_st);
if (glob_fun_st != NULL)
destroy_hash_table(glob_fun_st);
table_item_t* del;
while (!stack_empty(&glob_local_st))
{
del = stack_top(&glob_local_st);
stack_pop(&glob_local_st);
destroy_hash_table(del);
}
}