summaryrefslogtreecommitdiffstats
path: root/code/simpleSableCCCalulator/sableCCCalculator/Translation.java
blob: a673edbeb3b5791436b4ce1436dffad2fd9e09dc (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
package sableCCCalculator;
import sableCCCalculator.analysis.*;
import sableCCCalculator.types.*;
import sableCCCalculator.node.*;

class Translation extends DepthFirstAdapter
{
    private ProgramStack<Type> programStack = new ProgramStack<>();

    public void caseTNumber(TNumber node)
    {
        System.out.println("Pushing " + Integer.parseInt(node.getText()) + " to stack");
        programStack.push(new Int(node.getText()));
        System.out.println(programStack);
    }

    public void caseTDouble(TDouble node)
    {
        System.out.println("Pushing a double: " + Double.parseDouble(node.getText()));
        programStack.push(new Decimal(node.getText()));
        System.out.println(programStack);
    }

    public void outASineTerm(ASineTerm node) 
    {
        Double num = Double.parseDouble(programStack.pop().getText());
        System.out.println("Popped " + num);
        Double out = Math.sin(Math.toRadians(num));
        programStack.push(new Decimal(out));
        System.out.println("Pushed sin(" + num + ") = " + out + " to stack");
        System.out.println(programStack);
    }

    public void outAPlusExpr(APlusExpr node)
    {
        Type op2 = programStack.pop();
        Type op1 = programStack.pop();
        System.out.println("Popped " + op1 + " and " + op2 + " from stack");
        Type out = op1.add(op2);
        programStack.push(out);
        System.out.println("Pushed " + op1 + "+" + op2 + "=" + out + " to stack");
        System.out.println(programStack);
    }

    public void outAMinusExpr(AMinusExpr node)
    {
        Type op2 = programStack.pop();
        Type op1 = programStack.pop();
        System.out.println("Popped " + op1 + " and " + op2 + " from stack");
        Type out = op1.sub(op2);
        programStack.push(out);
        System.out.println("Pushed " + op1 + "-" + op2 + "=" + out + " to stack");
        System.out.println(programStack);
    }

    public void outAMultFactor(AMultFactor node)
    {
        Type op2 = programStack.pop();
        Type op1 = programStack.pop();
        System.out.println("Popped " + op1 + " and " + op2 + " from stack");
        Type out = op1.mult(op2);
        programStack.push(out);
        System.out.println("Pushed " + op1 + "*" + op2 + "=" + out + " to stack");
        System.out.println(programStack);
    }

    public void outADivFactor(ADivFactor node)
    {
        Type op2 = programStack.pop();
        Type op1 = programStack.pop();
        System.out.println("Popped " + op1 + " and " + op2 + " from stack");
        Type out = op1.div(op2);
        programStack.push(out);
        System.out.println("Pushed " + op1 + "/" + op2 + "=" + out + " to stack");
        System.out.println(programStack);
    }

    public void outAModFactor(AModFactor node)
    {
        Type op2 = programStack.pop();
        Type op1 = programStack.pop();
        System.out.println("Popped " + op1 + " and " + op2 + " from stack");
        Type out = op1.mod(op2);
        programStack.push(out);
        System.out.println("Pushed " + op1 + "%" + op2 + "=" + out + " to stack");
        System.out.println(programStack);
    }
}