(2)检查变量是否定义
不断根据层次表中的层次关系从下往上得到bodysymbol
根据bodysymbol的last得到最后一个变量的位置,依次找到该范围的所有变量进
行查找
如果查到了,看是否是函数调用,检查参数个数和类别是否一致;看是否是goto
语句,并且要得到相应标签的中间代码标记。
如果没有查到,看是否是goto语句类型的标签,如果是,则不用输出错误信息。
(因为可能会有标签变量在后面定义的情况)
printError(sb.kind+" "+ sb.name + "
has been declarated.",2);
return false;
}
j++;
id = temp_sb.link;
}
return true;
}
34
35
36
37
38
39
40
41
boolean checkIn(Symbol sb) {
//sb.print();
Symbol sb_res = new Symbol();
Stack<Integer> temp_s = new Stack<>();
BodySymbol btable_res = new BodySymbol();
boolean res = true;
boolean f = false;
int ksize = displaySymbols.disTab.size();
for (int i = 0; i < ksize; i++) {
int btable_num = displaySymbols.disTab.pop();
//System.out.println(btable_num);
temp_s.push(btable_num);
int j = 0;
int id = bodySymbols.get(btable_num).last;
while (j < bodySymbols.get(btable_num).vSize) {
Symbol sb_ed = SymbolTables.get(id);
//sb_ed.print();
//如果变量名相等
if (sb.name.equals(sb_ed.name)) {
f = true;
sb_res = sb_ed;
break;
}
id = sb_ed.link;
j++;
}
if (f) {
btable_res = bodySymbols.get(btable_num);
break;
}
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