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/ProgramStack.java            |  23 +++--
 .../sableCCCalculator/Translation.java             | 114 +++++++--------------
 .../sableCCCalculator/types/Decimal.java           |  57 +++++++++++
 .../sableCCCalculator/types/Int.java               |  60 +++++++++++
 .../sableCCCalculator/types/Type.java              |  22 ++++
 5 files changed, 186 insertions(+), 90 deletions(-)
 create mode 100644 code/simpleSableCCCalulator/sableCCCalculator/types/Decimal.java
 create mode 100644 code/simpleSableCCCalulator/sableCCCalculator/types/Int.java
 create mode 100644 code/simpleSableCCCalulator/sableCCCalculator/types/Type.java

(limited to 'code/simpleSableCCCalulator/sableCCCalculator')

diff --git a/code/simpleSableCCCalulator/sableCCCalculator/ProgramStack.java b/code/simpleSableCCCalulator/sableCCCalculator/ProgramStack.java
index 1875e57..c1046ee 100644
--- a/code/simpleSableCCCalulator/sableCCCalculator/ProgramStack.java
+++ b/code/simpleSableCCCalulator/sableCCCalculator/ProgramStack.java
@@ -1,26 +1,27 @@
 package sableCCCalculator;
-import sableCCCalculator.node.*;
+import sableCCCalculator.types.*;
 import java.util.Stack;
 
-public class ProgramStack<T extends Token> extends Stack<T> {
+public class ProgramStack<T extends Type> extends Stack<T> {
     
     public String toString() {
         String out = "Stack is now: [";
         for (int i = 0; i < this.size(); i++) {
-            String theStr = this.elementAt(i).toString();
-            out += String.format("%s, ", theStr.substring(0, theStr.length() - 1));
+            // String theStr = this.elementAt(i).toString();
+            // out += String.format("%s, ", theStr.substring(0, theStr.length() - 1));
+            out += String.format("%s, ", this.elementAt(i).toString());
         }
         return out.substring(0, out.length() - 2) + "]";
     }
 
     public static void main(String[] args) {
-        ProgramStack<Token> myStack = new ProgramStack<>();
-        myStack.add(new TNumber("2"));
-        myStack.add(new TNumber("4"));
-        myStack.add(new TNumber("6"));
-        myStack.add(new TNumber("0"));
-        myStack.add(new TNumber("1"));
-        myStack.add(new TDouble("24601.10642"));
+        ProgramStack<Type> myStack = new ProgramStack<>();
+        myStack.add(new Int(2));
+        myStack.add(new Int(4));
+        myStack.add(new Int(6));
+        myStack.add(new Int(0));
+        myStack.add(new Int(1));
+        myStack.add(new Decimal(24601.10642));
 
         System.out.println(myStack.pop().getText());
         System.out.println(myStack);
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);
     }
 }
diff --git a/code/simpleSableCCCalulator/sableCCCalculator/types/Decimal.java b/code/simpleSableCCCalulator/sableCCCalculator/types/Decimal.java
new file mode 100644
index 0000000..5836ff1
--- /dev/null
+++ b/code/simpleSableCCCalulator/sableCCCalculator/types/Decimal.java
@@ -0,0 +1,57 @@
+package sableCCCalculator.types;
+
+public class Decimal extends Type {
+
+    public Decimal(Double toDecimal) {
+        javaObject = (Double)toDecimal;
+    }
+
+    public Decimal(String toDecimal) {
+        javaObject = (Double)Double.parseDouble(toDecimal);
+    }  
+
+    public Decimal add(Type toAdd) {
+        if (toAdd.getClass().getSimpleName().equals("Decimal")) {
+            return new Decimal((Double)this.javaObject + (double)toAdd.javaObject);
+        } else {
+            return new Decimal((Double)this.javaObject + Double.parseDouble(String.format("%d", (int)toAdd.javaObject)));
+        }
+    }
+    
+    public Decimal sub(Type toAdd) {
+        if (toAdd.getClass().getSimpleName().equals("Decimal")) {
+            return new Decimal((Double)this.javaObject - (double)toAdd.javaObject);
+        } else {
+            return new Decimal((Double)this.javaObject - Double.parseDouble(String.format("%d", (int)toAdd.javaObject)));
+        }
+    }
+
+    public Decimal mult(Type toAdd) {
+        if (toAdd.getClass().getSimpleName().equals("Decimal")) {
+            return new Decimal((Double)this.javaObject * (double)toAdd.javaObject);
+        } else {
+            return new Decimal((Double)this.javaObject * Double.parseDouble(String.format("%d", (int)toAdd.javaObject)));
+        }
+    }
+
+    public Decimal div(Type toAdd) {
+        if (toAdd.getClass().getSimpleName().equals("Decimal")) {
+            return new Decimal((Double)this.javaObject / (double)toAdd.javaObject);
+        } else {
+            return new Decimal((Double)this.javaObject / Double.parseDouble(String.format("%d", (int)toAdd.javaObject)));
+        }
+    }
+
+    public Decimal mod(Type toAdd) {
+        if (toAdd.getClass().getSimpleName().equals("Decimal")) {
+            return new Decimal((Double)this.javaObject % (double)toAdd.javaObject);
+        } else {
+            return new Decimal((Double)this.javaObject % Double.parseDouble(String.format("%d", (int)toAdd.javaObject)));
+        }
+    }
+
+    public static void main(String[] args) {
+        Decimal aDec = new Decimal(3.1);
+        System.out.println(aDec.sub(new Int(2)));
+    }
+}
diff --git a/code/simpleSableCCCalulator/sableCCCalculator/types/Int.java b/code/simpleSableCCCalulator/sableCCCalculator/types/Int.java
new file mode 100644
index 0000000..1ccd20e
--- /dev/null
+++ b/code/simpleSableCCCalulator/sableCCCalculator/types/Int.java
@@ -0,0 +1,60 @@
+package sableCCCalculator.types;
+
+public class Int extends Type {
+    
+    public Int(int toInt) {
+        javaObject = (Integer)toInt;
+    }
+
+    public Int(String toInt) {
+        javaObject = (Integer)Integer.parseInt(toInt);
+    }
+
+    public Type add(Type toAdd) {
+        if (toAdd.getClass().getSimpleName().equals("Int")) {
+            return new Int((int)this.javaObject + (int)toAdd.javaObject);
+        } else {
+            return new Decimal(Double.parseDouble(String.format("%d", (int)this.javaObject)) + (Double)toAdd.javaObject);
+        }
+    }
+
+    public Type sub(Type toAdd) {
+        if (toAdd.getClass().getSimpleName().equals("Int")) {
+            return new Int((int)this.javaObject - (int)toAdd.javaObject);
+        } else {
+            return new Decimal(Double.parseDouble(String.format("%d", (int)this.javaObject)) - (Double)toAdd.javaObject);
+        }
+    }
+
+    public Type mult(Type toAdd) {
+        if (toAdd.getClass().getSimpleName().equals("Int")) {
+            return new Int((int)this.javaObject * (int)toAdd.javaObject);
+        } else {
+            return new Decimal(Double.parseDouble(String.format("%d", (int)this.javaObject)) * (Double)toAdd.javaObject);
+        }
+    }
+
+    public Type div(Type toAdd) {
+        if (toAdd.getClass().getSimpleName().equals("Int")) {
+            return new Int((int)this.javaObject / (int)toAdd.javaObject);
+        } else {
+            return new Decimal(Double.parseDouble(String.format("%d", (int)this.javaObject)) / (Double)toAdd.javaObject);
+        }
+    }
+
+    public Type mod(Type toAdd) {
+        if (toAdd.getClass().getSimpleName().equals("Int")) {
+            return new Int((int)this.javaObject % (int)toAdd.javaObject);
+        } else {
+            return new Decimal(Double.parseDouble(String.format("%d", (int)this.javaObject)) % (Double)toAdd.javaObject);
+        }
+    }
+
+    public static void main(String[] args) {
+        Int int1 = new Int(3);
+        System.out.println(int1.add(new Int(4)));
+
+        Int int2 = new Int(3);
+        System.out.println(int2.mult(new Decimal(2.2)));
+    }
+}
diff --git a/code/simpleSableCCCalulator/sableCCCalculator/types/Type.java b/code/simpleSableCCCalulator/sableCCCalculator/types/Type.java
new file mode 100644
index 0000000..359f2b8
--- /dev/null
+++ b/code/simpleSableCCCalulator/sableCCCalculator/types/Type.java
@@ -0,0 +1,22 @@
+package sableCCCalculator.types;
+
+// not happy with the amount of polymorphism
+// using generics would be better but idk how that'd work in this context...
+public abstract class Type {
+
+    protected Object javaObject;
+
+    public abstract Type add(Type toAdd);
+    public abstract Type sub(Type toSub);
+    public abstract Type mult(Type toMult);
+    public abstract Type div(Type toDiv);
+    public abstract Type mod(Type toMod);
+    
+    public String toString() {
+        return javaObject.toString();
+    }
+
+    public String getText() {
+        return this.toString();
+    }
+}
\ No newline at end of file
-- 
cgit v1.2.3