summaryrefslogtreecommitdiff
path: root/Playground.java
blob: 8e9cbc04db1083542b06641e936bb9fa56c7d667 (plain)
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
import java.util.*;
import st.*;

/**
 * A small method to test the basic functionality
 * of the st Instance library
 */
public class Playground {

    public static String HashMapToString(Map<String, AbstractInstance> map) {
        StringBuilder mapAsString = new StringBuilder("{");
        for (String key : map.keySet()) {
            mapAsString.append(key + "=" + map.get(key) + ", ");
        }
        mapAsString.delete(mapAsString.length()-2, mapAsString.length()).append("}");
        return mapAsString.toString();
    }

    public static void main(String[] args) {

        /*
          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.
        */

        SymbolTable ssymt = new SymbolTable();

        /* pass one */
        ssymt.put("Factorial", new ClassInstance("Factorial"));
        ssymt.put("main", new MethodInstance("main", TypeEnum.ERROR));
        ssymt.put("Fac", new ClassInstance("Fac"));
        ssymt.put("useless_var", new TypeInstance("useless_var", TypeEnum.intarray));
        ssymt.put("ComputeFac", new MethodInstance("ComputeFac", TypeEnum.integer));
        ssymt.put("num", new TypeInstance("num", TypeEnum.integer));
        ssymt.put("num_aux", new TypeInstance("num_aux", TypeEnum.integer));
        ssymt.put("Fac2", new ClassInstance("Fac2"));

        System.out.println("Post pass one: " + ssymt.toString());

        /* pass two */
        ssymt.setActive("Factorial", TypeEnum.classname);
        ssymt.setActive("main", TypeEnum.method);
        ssymt.addMethod("main");
        ssymt.setActive("Fac", TypeEnum.classname);
        ssymt.addAttribute("useless_var");
        ssymt.setActive("ComputeFac", TypeEnum.method);
        ssymt.addMethod("ComputeFac");
        ssymt.addParameter("num");
        ssymt.addLocal("num_aux");
        ssymt.setActive("Fac2", TypeEnum.classname);
        ssymt.setExtend("Fac");

        ArrayList<TypeInstance> attrs_in_factorial = new ArrayList<>();
        ArrayList<MethodInstance> mtds_in_factorial = new ArrayList<>();
        mtds_in_factorial.add(ssymt.getMethod("main"));
        ArrayList<TypeInstance> attrs_in_fac = new ArrayList<>();
        attrs_in_fac.add(ssymt.getType("useless_var"));
        ArrayList<MethodInstance> mtds_in_fac = new ArrayList<>();
        mtds_in_fac.add(ssymt.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(ssymt.getClass("Factorial").getAttributes().equals(attrs_in_factorial));
        System.out.println(ssymt.getClass("Factorial").getMethods().equals(mtds_in_factorial));
        System.out.println(ssymt.getClass("Fac").getAttributes().equals(attrs_in_fac));
        System.out.println(ssymt.getClass("Fac").getMethods().equals(mtds_in_fac));
        System.out.println(ssymt.getClass("Fac2").getAttributes().equals(attrs_in_fac2));
        System.out.println(ssymt.getClass("Fac2").getMethods().equals(mtds_in_fac2));

        ArrayList<TypeInstance> args_in_computefac = new ArrayList<>();
        args_in_computefac.add(ssymt.getType("num"));
        ArrayList<TypeInstance> locals_in_computefac = new ArrayList<>(args_in_computefac);
        locals_in_computefac.add(ssymt.getType("num_aux"));

        System.out.println("test method children");
        System.out.println(ssymt.getMethod("ComputeFac").getArguments().equals(args_in_computefac));
        System.out.println(ssymt.getMethod("ComputeFac").getLocals().equals(locals_in_computefac));

        ClassInstance exts_factorial = null;
        ClassInstance exts_fac = null;
        ClassInstance exts_fac2 = ssymt.getClass("Fac");

        System.out.println("test inheritance");
        System.out.println(ssymt.getClass("Factorial").getExtend() == exts_factorial);
        System.out.println(ssymt.getClass("Fac").getExtend() == exts_fac);
        System.out.println(ssymt.getClass("Fac2").getExtend() == exts_fac2);

        AbstractInstance scope_main = ssymt.getClass("Factorial");
        AbstractInstance scope_computefac = ssymt.getClass("Fac");
        AbstractInstance scope_uselessvar = ssymt.getClass("Fac");
        AbstractInstance scope_num = ssymt.getMethod("ComputeFac");
        AbstractInstance scope_numaux = ssymt.getMethod("ComputeFac");

        System.out.println("test scope");
        System.out.println(ssymt.getMethod("main").getScope() == scope_main);
        System.out.println(ssymt.getMethod("ComputeFac").getScope() == scope_computefac);
        System.out.println(ssymt.getType("useless_var").getScope() == scope_uselessvar);
        System.out.println(ssymt.getType("num").getScope() == scope_num);
        System.out.println(ssymt.getType("num_aux").getScope() == scope_numaux);
    }
}