/
SymbolTable.java
executable file
·146 lines (116 loc) · 3.02 KB
/
SymbolTable.java
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
import java.util.ArrayList;
/*
Akshat Singhal, Chris Fry
SymbolTable.java
symbol table for the semantic analyzer
of the Akshat and Chris Compiler (ACC)
*/
// need to put symbol numbers in here too
public class SymbolTable{
ArrayList symbolTable;
int stackpointer;
ArrayList savedContexts;
public ArrayList calls;
public SymbolTable(){
symbolTable = new ArrayList();
savedContexts = new ArrayList();
stackpointer = 0;
}
public void removeTopContext(){
if (symbolTable.size()>1){
savedContexts.add(symbolTable.remove(symbolTable.size()-1));
stackpointer--;
}
else
System.out.println("compiler error: error in checking compound statement scopes ");
}
public void addContext(Context frame){
symbolTable.add(frame);
stackpointer++;
}
public void clearContexts(){
while (symbolTable.size()>1){
savedContexts.add(symbolTable.remove(symbolTable.size()-1));
stackpointer--;
}
}
/*
// returns the type of identifier, if it's in the symbolTable, "" otherwise
public String getSymbolType(String identifier){
int i = stackpointer-1;
String temp;
while(i>=0){
if ((temp = ((Context)symbolTable.get(i)).getType(identifier)) != "")
return temp;
else
i--;
}
return "";
}
*/
public Symbol getCurrentFunctionSymbol(){
Context mainContext = ((Context)symbolTable.get(0));
for (int i=mainContext.symbols.size()-1;i>=0;i--)
if (mainContext.symbols.get(i) instanceof FunSymbol)
return ((Symbol)mainContext.symbols.get(i));
return new ErrorSymbol();
}
public Symbol getSymbol(String identifier){
int i = stackpointer-1;
Context currentContext;
Symbol temp;
while(i>=0){
currentContext = (Context)symbolTable.get(i);
temp = currentContext.getVar(identifier);
if (temp instanceof ErrorSymbol)
temp = currentContext.getFunbyIdent(identifier);
if (!(temp instanceof ErrorSymbol))
return temp;
else
i--;
}
return new ErrorSymbol();
}
public Symbol getFunbySig(String signature){
int i = stackpointer-1;
Context currentContext;
Symbol temp;
while(i>=0){
currentContext = (Context)symbolTable.get(i);
temp = currentContext.getFunbySig(signature);
if (!(temp instanceof ErrorSymbol))
return temp;
else
i--;
}
return new ErrorSymbol();
}
public Symbol getFunbyIdent(String identifier){
int i = stackpointer-1;
Context currentContext;
Symbol temp;
while(i>=0){
currentContext = (Context)symbolTable.get(i);
temp = currentContext.getFunbyIdent(identifier);
if (!(temp instanceof ErrorSymbol))
return temp;
else
i--;
}
return new ErrorSymbol();
}
public Symbol getVar(String identifier){
int i = stackpointer-1;
Context currentContext;
Symbol temp;
while(i>=0){
currentContext = (Context)symbolTable.get(i);
temp = currentContext.getVar(identifier);
if (!(temp instanceof ErrorSymbol))
return temp;
else
i--;
}
return new ErrorSymbol();
}
}