From 8f50e4d189bad9dbd180fd945881950769c3a989 Mon Sep 17 00:00:00 2001
From: jwansek <eddie.atten.ea29@gmail.com>
Date: Sun, 24 Oct 2021 14:07:29 +0100
Subject: added the start of a type system

---
 .../sableCCCalculator/Translation.java             | 114 +++++++--------------
 1 file changed, 35 insertions(+), 79 deletions(-)

(limited to 'code/simpleSableCCCalulator/sableCCCalculator/Translation.java')

diff --git a/code/simpleSableCCCalulator/sableCCCalculator/Translation.java b/code/simpleSableCCCalulator/sableCCCalculator/Translation.java
index d8fd74d..a673edb 100644
--- a/code/simpleSableCCCalulator/sableCCCalculator/Translation.java
+++ b/code/simpleSableCCCalulator/sableCCCalculator/Translation.java
@@ -1,22 +1,23 @@
 package sableCCCalculator;
 import sableCCCalculator.analysis.*;
+import sableCCCalculator.types.*;
 import sableCCCalculator.node.*;
 
 class Translation extends DepthFirstAdapter
 {
-    private ProgramStack<Token> programStack = new ProgramStack<>();
+    private ProgramStack<Type> programStack = new ProgramStack<>();
 
     public void caseTNumber(TNumber node)
     {
         System.out.println("Pushing " + Integer.parseInt(node.getText()) + " to stack");
-        programStack.push(node);
+        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(node);
+        programStack.push(new Decimal(node.getText()));
         System.out.println(programStack);
     }
 
@@ -25,108 +26,63 @@ class Translation extends DepthFirstAdapter
         Double num = Double.parseDouble(programStack.pop().getText());
         System.out.println("Popped " + num);
         Double out = Math.sin(Math.toRadians(num));
-        programStack.push(new TDouble(String.format("%f", out)));
+        programStack.push(new Decimal(out));
         System.out.println("Pushed sin(" + num + ") = " + out + " to stack");
         System.out.println(programStack);
     }
 
     public void outAPlusExpr(APlusExpr node)
     {
-        Double num2 = Double.parseDouble(programStack.pop().getText());
-        Double num1 = Double.parseDouble(programStack.pop().getText());
-        System.out.println("Popped " + num1 + " and " + num2 + " from stack");
-        Double out = num1 + num2;
-        if ((out % 1) == 0) 
-        {
-            // the output is an integer, change types to save memory
-            programStack.push(new TNumber(String.format("%d", out.intValue())));
-        }
-        else
-        {
-            programStack.push(new TDouble(String.format("%f", out)));
-        }
-        
-        System.out.println("Pushed " + num1 + "+" + num2 + "=" + out + " to stack");
+        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)
     {
-        Double num2 = Double.parseDouble(programStack.pop().getText());
-        Double num1 = Double.parseDouble(programStack.pop().getText());
-        System.out.println("Popped " + num1 + " and " + num2 + " from stack");
-        Double out = num1 - num2;
-        if ((out % 1) == 0) 
-        {
-            // the output is an integer, change types to save memory
-            programStack.push(new TNumber(String.format("%d", out.intValue())));
-        }
-        else
-        {
-            programStack.push(new TDouble(String.format("%f", out)));
-        }
-        
-        System.out.println("Pushed " + num1 + "-" + num2 + "=" + out + " to stack");
+        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)
     {
-        Double num2 = Double.parseDouble(programStack.pop().getText());
-        Double num1 = Double.parseDouble(programStack.pop().getText());
-        System.out.println("Popped " + num1 + " and " + num2 + " from stack");
-        Double out = num1 * num2;
-        if ((out % 1) == 0) 
-        {
-            // the output is an integer, change types to save memory
-            programStack.push(new TNumber(String.format("%d", out.intValue())));
-        }
-        else
-        {
-            programStack.push(new TDouble(String.format("%f", out)));
-        }
-        
-        System.out.println("Pushed " + num1 + "*" + num2 + "=" + out + " to stack");
+        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)
     {
-        Double num2 = Double.parseDouble(programStack.pop().getText());
-        Double num1 = Double.parseDouble(programStack.pop().getText());
-        System.out.println("Popped " + num1 + " and " + num2 + " from stack");
-        Double out = num1 / num2;
-        if ((out % 1) == 0) 
-        {
-            // the output is an integer, change types to save memory
-            programStack.push(new TNumber(String.format("%d", out.intValue())));
-        }
-        else
-        {
-            programStack.push(new TDouble(String.format("%f", out)));
-        }
-        
-        System.out.println("Pushed " + num1 + "/" + num2 + "=" + out + " to stack");
+        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)
     {
-        Double num2 = Double.parseDouble(programStack.pop().getText());
-        Double num1 = Double.parseDouble(programStack.pop().getText());
-        System.out.println("Popped " + num1 + " and " + num2 + " from stack");
-        Double out = num1 % num2;
-        if ((out % 1) == 0) 
-        {
-            // the output is an integer, change types to save memory
-            programStack.push(new TNumber(String.format("%d", out.intValue())));
-        }
-        else
-        {
-            programStack.push(new TDouble(String.format("%f", out)));
-        }
-        
-        System.out.println("Pushed " + num1 + "%" + num2 + "=" + out + " to stack");
+        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);
     }
 }
-- 
cgit v1.2.3