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
|
import java.io.*;
import visitor.*;
import parse.*;
import syntaxtree.*;
import java.util.*;
import st.*;
import misc.*;
/**
* A small method to test the basic functionality
* of the st Instance library
*/
public class stTest {
public static void FactorialTests(SymbolTable symt) {
/*
class Factorial{
....public static void main(String[] a){
........System.out.println(new Fac().ComputeFac(10));
....}
}
class Fac {
....int[] useless_var ;
....public int ComputeFac(int num){
........int num_aux ;
........if (num < 1)
............num_aux = 1 ;
........else
............num_aux = num * (this.ComputeFac(num-1)) ;
........return num_aux ;
....}
}
class Fac2 extends Fac {
}
The below is a manual practice run of the SymbolTable class.
*/
ArrayList<TypeInstance> attrs_in_factorial = new ArrayList<>();
ArrayList<MethodInstance> mtds_in_factorial = new ArrayList<>();
mtds_in_factorial.add(symt.getMethod("main"));
ArrayList<TypeInstance> attrs_in_fac = new ArrayList<>();
attrs_in_fac.add(symt.getType("useless_var"));
ArrayList<MethodInstance> mtds_in_fac = new ArrayList<>();
mtds_in_fac.add(symt.getMethod("ComputeFac"));
ArrayList<TypeInstance> attrs_in_fac2 = new ArrayList<>(); // FIXME
ArrayList<MethodInstance> mtds_in_fac2 = new ArrayList<>(); // FIXME
System.out.println("test class children");
System.out.println(symt.getClass("Factorial").getLocals().equals(attrs_in_factorial));
System.out.println(symt.getClass("Factorial").getMethods().equals(mtds_in_factorial));
System.out.println(symt.getClass("Fac").getLocals().equals(attrs_in_fac));
System.out.println(symt.getClass("Fac").getMethods().equals(mtds_in_fac));
System.out.println(symt.getClass("Fac2").getLocals().equals(attrs_in_fac2));
System.out.println(symt.getClass("Fac2").getMethods().equals(mtds_in_fac2));
ArrayList<TypeInstance> args_in_computefac = new ArrayList<>();
args_in_computefac.add(symt.getType("num"));
ArrayList<TypeInstance> locals_in_computefac = new ArrayList<>(args_in_computefac);
locals_in_computefac.add(symt.getType("num_aux"));
System.out.println("test method children");
System.out.println(symt.getMethod("ComputeFac").getArguments().equals(args_in_computefac));
System.out.println(symt.getMethod("ComputeFac").getLocals().equals(locals_in_computefac));
ClassInstance exts_factorial = null;
ClassInstance exts_fac = null;
ClassInstance exts_fac2 = symt.getClass("Fac");
System.out.println("test inheritance");
System.out.println(symt.getClass("Factorial").getExtend() == exts_factorial);
System.out.println(symt.getClass("Fac").getExtend() == exts_fac);
System.out.println(symt.getClass("Fac2").getExtend() == exts_fac2);
ArrayList<AbstractInstance> scope_main = new ArrayList<>();
scope_main.add(symt.getClass("Factorial"));
ArrayList<AbstractInstance> scope_computefac = new ArrayList<>();
scope_computefac.add(symt.getClass("Fac"));
ArrayList<AbstractInstance> scope_uselessvar = new ArrayList<>();
scope_uselessvar.add(symt.getClass("Fac"));
ArrayList<AbstractInstance> scope_num = new ArrayList<>();
scope_num.add(symt.getMethod("ComputeFac"));
ArrayList<AbstractInstance> scope_numaux = new ArrayList<>();
scope_numaux.add(symt.getMethod("ComputeFac"));
System.out.println("test scope");
System.out.println(symt.getMethod("main").getScope().equals(scope_main));
System.out.println(symt.getMethod("ComputeFac").getScope().equals(scope_computefac));
System.out.println(symt.getType("useless_var").getScope().equals(scope_uselessvar));
System.out.println(symt.getType("num").getScope().equals(scope_num));
System.out.println(symt.getType("num_aux").getScope().equals(scope_numaux));
System.out.println();
}
public static void main(String[] args) {
SymbolTable symt = new SymbolTable();
/* pass one */
symt.put("Factorial", new ClassInstance("Factorial"));
symt.put("main", new MethodInstance("main", TypeEnum.ERROR));
symt.put("Fac", new ClassInstance("Fac"));
symt.put("useless_var", new TypeInstance("useless_var", TypeEnum.intarray));
symt.put("ComputeFac", new MethodInstance("ComputeFac", TypeEnum.integer));
symt.put("num", new TypeInstance("num", TypeEnum.integer));
symt.put("num_aux", new TypeInstance("num_aux", TypeEnum.integer));
symt.put("Fac2", new ClassInstance("Fac2"));
/* pass two */
symt.setActive(TypeEnum.classname, "Factorial");
symt.setActive(TypeEnum.method, "main");
symt.addMethod("main");
symt.removeActive(TypeEnum.method);
symt.setActive(TypeEnum.classname, "Fac");
symt.addLocal("useless_var");
symt.setActive(TypeEnum.method, "ComputeFac");
symt.addMethod("ComputeFac");
symt.addParameter("num");
symt.addLocal("num_aux");
symt.removeActive(TypeEnum.method);
symt.setActive(TypeEnum.classname, "Fac2");
symt.setExtend("Fac");
System.out.println("Manual results:");
FactorialTests(symt);
/* using the visitors */
// Node root = null;
// try {
// root = new MiniJavaParser(System.in).Goal();
// symt = new SymbolTable();
// root.accept(new SymTableBottomUp<Void>(), symt);
// root.accept(new SymTableTopDown<Void>(), symt);
// System.out.println("Visitor results:");
// FactorialTests(symt);
// }
// catch (ParseException e) {
// System.out.println(e.toString());
// System.exit(1);
// }
}
}
|