summaryrefslogtreecommitdiff
path: root/Shenanigans/src/org/archphantom/shenanigans/elements/expressions
diff options
context:
space:
mode:
Diffstat (limited to 'Shenanigans/src/org/archphantom/shenanigans/elements/expressions')
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/Expression.java10
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/Variable.java29
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolAnd.java25
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolEqual.java22
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolGreater.java26
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolLess.java26
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolNot.java23
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolOr.java25
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolXOr.java25
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/Count.java27
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Addition.java25
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/BitAnd.java25
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/BitOr.java25
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/BitXOr.java25
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Division.java24
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Modulo.java25
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Multiplication.java24
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/ShiftLeft.java25
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/ShiftRight.java25
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Subtraction.java25
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayAssignment.java37
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayVariable.java35
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Assignment.java32
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ConditionalStatement.java24
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ForLoop.java28
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/FunctionCall.java38
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Group.java27
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/If.java25
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/IfElse.java26
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Print.java31
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/WhileLoop.java24
31 files changed, 813 insertions, 0 deletions
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/Expression.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/Expression.java
new file mode 100644
index 0000000..a4358ec
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/Expression.java
@@ -0,0 +1,10 @@
+package org.archphantom.shenanigans.elements.expressions;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public abstract class Expression {
+
+ public abstract Value evaluate(VarTable vars, Program program);
+
+} \ No newline at end of file
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/Variable.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/Variable.java
new file mode 100644
index 0000000..c857c29
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/Variable.java
@@ -0,0 +1,29 @@
+package org.archphantom.shenanigans.elements.expressions;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.values.Namespace;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class Variable extends Expression {
+ private String identifier;
+
+ public Variable (String identifier) {
+ this.identifier = identifier;
+ }
+
+ public Value evaluate (VarTable vars, Program program) {
+ if (identifier.contains(".")) {
+ String nspacecall = identifier.substring(0, identifier.indexOf('.'));
+ String varname = identifier.substring(identifier.indexOf('.')+1);
+ Namespace ns;
+ if ((ns = program.getNamespace(nspacecall)) != null) {
+ return ns.getVar(varname, vars, program).evaluate(vars, program);
+ } else {
+ return null;
+ }
+ } else {
+ return vars.get(identifier).evaluate(vars, program);
+ }
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolAnd.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolAnd.java
new file mode 100644
index 0000000..e5ed6c8
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolAnd.java
@@ -0,0 +1,25 @@
+package org.archphantom.shenanigans.elements.expressions.comparators;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.BoolValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class BoolAnd extends Expression {
+ private Expression a, b;
+
+ public BoolAnd (Expression a, Expression b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public BoolValue evaluate (VarTable vars, Program program) {
+ Value aval = a.evaluate(vars, program);
+ Value bval = b.evaluate(vars, program);
+ if (!(aval instanceof BoolValue) || !(bval instanceof BoolValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ return new BoolValue ((((BoolValue) aval).getValue(vars, program)).booleanValue() && ((BoolValue) bval).getValue(vars, program).booleanValue());
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolEqual.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolEqual.java
new file mode 100644
index 0000000..6bd55fc
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolEqual.java
@@ -0,0 +1,22 @@
+package org.archphantom.shenanigans.elements.expressions.comparators;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.BoolValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class BoolEqual extends Expression {
+ private Expression a, b;
+
+ public BoolEqual (Expression a, Expression b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public BoolValue evaluate (VarTable vars, Program program) {
+ Value aval = a.evaluate(vars, program);
+ Value bval = b.evaluate(vars, program);
+ return new BoolValue(aval.getValue(vars, program).equals(bval.getValue(vars, program)));
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolGreater.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolGreater.java
new file mode 100644
index 0000000..6794376
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolGreater.java
@@ -0,0 +1,26 @@
+package org.archphantom.shenanigans.elements.expressions.comparators;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.BoolValue;
+import org.archphantom.shenanigans.elements.values.DecimalValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class BoolGreater extends Expression {
+ private Expression a, b;
+
+ public BoolGreater (Expression a, Expression b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public BoolValue evaluate (VarTable vars, Program program) {
+ Value aval = a.evaluate(vars, program);
+ Value bval = b.evaluate(vars, program);
+ if (!(aval instanceof DecimalValue) || !(bval instanceof DecimalValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ return new BoolValue(((DecimalValue) aval).getValue(vars, program).compareTo(((DecimalValue) bval).getValue(vars, program)) > 0);
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolLess.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolLess.java
new file mode 100644
index 0000000..a2191a5
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolLess.java
@@ -0,0 +1,26 @@
+package org.archphantom.shenanigans.elements.expressions.comparators;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.BoolValue;
+import org.archphantom.shenanigans.elements.values.DecimalValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class BoolLess extends Expression {
+ private Expression a, b;
+
+ public BoolLess (Expression a, Expression b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public BoolValue evaluate (VarTable vars, Program program) {
+ Value aval = a.evaluate(vars, program);
+ Value bval = b.evaluate(vars, program);
+ if (!(aval instanceof DecimalValue) || !(bval instanceof DecimalValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ return new BoolValue(((DecimalValue) aval).getValue(vars, program).compareTo(((DecimalValue) bval).getValue(vars, program)) < 0);
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolNot.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolNot.java
new file mode 100644
index 0000000..355b065
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolNot.java
@@ -0,0 +1,23 @@
+package org.archphantom.shenanigans.elements.expressions.comparators;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.BoolValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class BoolNot extends Expression {
+ private BoolValue val;
+
+ public BoolNot (BoolValue val) {
+ this.val = val;
+ }
+
+ public BoolValue evaluate(VarTable vars, Program program) {
+ Value aval = val.evaluate(vars, program);
+ if (!(aval instanceof BoolValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ return new BoolValue(!((BoolValue) aval).getValue(vars, program).booleanValue());
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolOr.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolOr.java
new file mode 100644
index 0000000..3f2463c
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolOr.java
@@ -0,0 +1,25 @@
+package org.archphantom.shenanigans.elements.expressions.comparators;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.BoolValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class BoolOr extends Expression {
+ private Expression a, b;
+
+ public BoolOr (Expression a, Expression b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public BoolValue evaluate (VarTable vars, Program program) {
+ Value aval = a.evaluate(vars, program);
+ Value bval = b.evaluate(vars, program);
+ if (!(aval instanceof BoolValue) || !(bval instanceof BoolValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ return new BoolValue ((((BoolValue) aval).getValue(vars, program)).booleanValue() || ((BoolValue) bval).getValue(vars, program).booleanValue());
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolXOr.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolXOr.java
new file mode 100644
index 0000000..f59fe5c
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolXOr.java
@@ -0,0 +1,25 @@
+package org.archphantom.shenanigans.elements.expressions.comparators;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.BoolValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class BoolXOr extends Expression {
+ private Expression a, b;
+
+ public BoolXOr (Expression a, Expression b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public BoolValue evaluate (VarTable vars, Program program) {
+ Value aval = a.evaluate(vars, program);
+ Value bval = b.evaluate(vars, program);
+ if (!(aval instanceof BoolValue) || !(bval instanceof BoolValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ return new BoolValue ((((BoolValue) aval).getValue(vars, program)).booleanValue() ^ ((BoolValue) bval).getValue(vars, program).booleanValue());
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/Count.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/Count.java
new file mode 100644
index 0000000..b7f86ac
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/Count.java
@@ -0,0 +1,27 @@
+package org.archphantom.shenanigans.elements.expressions.comparators;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.Array;
+import org.archphantom.shenanigans.elements.values.IntValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class Count extends Expression {
+ private Expression val;
+
+ public Count (Expression val) {
+ this.val = val;
+ }
+
+ public IntValue evaluate(VarTable vars, Program program) {
+ Value aval = val.evaluate(vars, program);
+ if (aval == null) {
+ return new IntValue("0");
+ } else if (!(aval instanceof Array)) {
+ return new IntValue("1");
+ }
+ Array array = (Array) aval;
+ return new IntValue(array.size());
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Addition.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Addition.java
new file mode 100644
index 0000000..3060883
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Addition.java
@@ -0,0 +1,25 @@
+package org.archphantom.shenanigans.elements.expressions.operations;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.DecimalValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class Addition extends Expression {
+ private Expression a, b;
+
+ public Addition (Expression a, Expression b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public DecimalValue evaluate (VarTable vars, Program program) {
+ Value aval = a.evaluate(vars, program);
+ Value bval = b.evaluate(vars, program);
+ if (!(aval instanceof DecimalValue) || !(bval instanceof DecimalValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ return new DecimalValue ((((DecimalValue) aval).getValue(vars, program)).add(((DecimalValue) bval).getValue(vars, program)));
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/BitAnd.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/BitAnd.java
new file mode 100644
index 0000000..e52571f
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/BitAnd.java
@@ -0,0 +1,25 @@
+package org.archphantom.shenanigans.elements.expressions.operations;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.IntValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class BitAnd extends Expression {
+ private Expression a, b;
+
+ public BitAnd (Expression a, Expression b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public IntValue evaluate (VarTable vars, Program program) {
+ Value aval = a.evaluate(vars, program);
+ Value bval = b.evaluate(vars, program);
+ if (!(aval instanceof IntValue) || !(bval instanceof IntValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ return new IntValue ((((IntValue) aval).intValue(vars, program)).add(((IntValue) bval).intValue(vars, program)));
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/BitOr.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/BitOr.java
new file mode 100644
index 0000000..6ec203c
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/BitOr.java
@@ -0,0 +1,25 @@
+package org.archphantom.shenanigans.elements.expressions.operations;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.IntValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class BitOr extends Expression {
+ private Expression a, b;
+
+ public BitOr (Expression a, Expression b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public IntValue evaluate (VarTable vars, Program program) {
+ Value aval = a.evaluate(vars, program);
+ Value bval = b.evaluate(vars, program);
+ if (!(aval instanceof IntValue) || !(bval instanceof IntValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ return new IntValue ((((IntValue) aval).intValue(vars, program)).or(((IntValue) bval).intValue(vars, program)));
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/BitXOr.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/BitXOr.java
new file mode 100644
index 0000000..d761b23
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/BitXOr.java
@@ -0,0 +1,25 @@
+package org.archphantom.shenanigans.elements.expressions.operations;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.IntValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class BitXOr extends Expression {
+ private Expression a, b;
+
+ public BitXOr (Expression a, Expression b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public IntValue evaluate (VarTable vars, Program program) {
+ Value aval = a.evaluate(vars, program);
+ Value bval = b.evaluate(vars, program);
+ if (!(aval instanceof IntValue) || !(bval instanceof IntValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ return new IntValue ((((IntValue) aval).intValue(vars, program)).xor(((IntValue) bval).intValue(vars, program)));
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Division.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Division.java
new file mode 100644
index 0000000..7c92bd9
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Division.java
@@ -0,0 +1,24 @@
+package org.archphantom.shenanigans.elements.expressions.operations;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.DecimalValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class Division extends Expression {
+ private Expression a, b;
+
+ public Division (Expression a, Expression b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public DecimalValue evaluate (VarTable vars, Program program) {
+ Value aval = a.evaluate(vars, program);
+ Value bval = b.evaluate(vars, program);
+ if (!(aval instanceof DecimalValue) || !(bval instanceof DecimalValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ return new DecimalValue ((((DecimalValue) aval).getValue(vars, program)).divide(((DecimalValue) bval).getValue(vars, program)));
+ }
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Modulo.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Modulo.java
new file mode 100644
index 0000000..641e7a4
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Modulo.java
@@ -0,0 +1,25 @@
+package org.archphantom.shenanigans.elements.expressions.operations;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.IntValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class Modulo extends Expression {
+ private Expression a, b;
+
+ public Modulo (Expression a, Expression b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public IntValue evaluate (VarTable vars, Program program) {
+ Value aval = a.evaluate(vars, program);
+ Value bval = b.evaluate(vars, program);
+ if (!(aval instanceof IntValue) || !(bval instanceof IntValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ return new IntValue ((((IntValue) aval).intValue(vars, program)).mod(((IntValue) bval).intValue(vars, program)));
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Multiplication.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Multiplication.java
new file mode 100644
index 0000000..05d3287
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Multiplication.java
@@ -0,0 +1,24 @@
+package org.archphantom.shenanigans.elements.expressions.operations;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.DecimalValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class Multiplication extends Expression {
+ private Expression a, b;
+
+ public Multiplication (Expression a, Expression b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public DecimalValue evaluate (VarTable vars, Program program) {
+ Value aval = a.evaluate(vars, program);
+ Value bval = b.evaluate(vars, program);
+ if (!(aval instanceof DecimalValue) || !(bval instanceof DecimalValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ return new DecimalValue ((((DecimalValue) aval).getValue(vars, program)).multiply(((DecimalValue) bval).getValue(vars, program)));
+ }
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/ShiftLeft.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/ShiftLeft.java
new file mode 100644
index 0000000..e544189
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/ShiftLeft.java
@@ -0,0 +1,25 @@
+package org.archphantom.shenanigans.elements.expressions.operations;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.IntValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class ShiftLeft extends Expression {
+ private Expression a, b;
+
+ public ShiftLeft (Expression a, Expression b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public IntValue evaluate (VarTable vars, Program program) {
+ Value aval = a.evaluate(vars, program);
+ Value bval = b.evaluate(vars, program);
+ if (!(aval instanceof IntValue) || !(bval instanceof IntValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ return new IntValue ((((IntValue) aval).intValue(vars, program)).shiftLeft(((IntValue) bval).intValue(vars, program).intValue()));
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/ShiftRight.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/ShiftRight.java
new file mode 100644
index 0000000..688dc91
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/ShiftRight.java
@@ -0,0 +1,25 @@
+package org.archphantom.shenanigans.elements.expressions.operations;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.IntValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class ShiftRight extends Expression {
+ private Expression a, b;
+
+ public ShiftRight (Expression a, Expression b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public IntValue evaluate (VarTable vars, Program program) {
+ Value aval = a.evaluate(vars, program);
+ Value bval = b.evaluate(vars, program);
+ if (!(aval instanceof IntValue) || !(bval instanceof IntValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ return new IntValue ((((IntValue) aval).intValue(vars, program)).shiftRight(((IntValue) bval).intValue(vars, program).intValue()));
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Subtraction.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Subtraction.java
new file mode 100644
index 0000000..2d2d694
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Subtraction.java
@@ -0,0 +1,25 @@
+package org.archphantom.shenanigans.elements.expressions.operations;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.DecimalValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class Subtraction extends Expression {
+ private Expression a, b;
+
+ public Subtraction (Expression a, Expression b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public DecimalValue evaluate (VarTable vars, Program program) {
+ Value aval = a.evaluate(vars, program);
+ Value bval = b.evaluate(vars, program);
+ if (!(aval instanceof DecimalValue) || !(bval instanceof DecimalValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ return new DecimalValue ((((DecimalValue) aval).getValue(vars, program)).subtract(((DecimalValue) bval).getValue(vars, program)));
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayAssignment.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayAssignment.java
new file mode 100644
index 0000000..c10c159
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayAssignment.java
@@ -0,0 +1,37 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.expressions.Variable;
+import org.archphantom.shenanigans.elements.values.Array;
+import org.archphantom.shenanigans.elements.values.DecimalValue;
+import org.archphantom.shenanigans.elements.values.IntValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class ArrayAssignment extends Expression {
+ private String identifier;
+ private Expression index;
+ private Expression value;
+
+ public ArrayAssignment (String identifier, Expression index, Expression value) {
+ this.identifier = identifier;
+ this.index = index;
+ this.value = value;
+ }
+
+ public Value evaluate (VarTable vars, Program program) {
+ Value vindex = index.evaluate(vars, program);
+ if (!(vindex instanceof DecimalValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ IntValue iindex = new IntValue(((DecimalValue) vindex).getValue(vars, program).toBigInteger());
+ Value varr = new Variable(identifier).evaluate(vars, program);
+ if (varr instanceof Array) {
+ Array array = (Array) varr;
+ return array.setElement(iindex, value, vars, program).evaluate(vars, program);
+ } else {
+ throw new RuntimeException("Not Implemented");
+ }
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayVariable.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayVariable.java
new file mode 100644
index 0000000..b637383
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayVariable.java
@@ -0,0 +1,35 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.expressions.Variable;
+import org.archphantom.shenanigans.elements.values.Array;
+import org.archphantom.shenanigans.elements.values.DecimalValue;
+import org.archphantom.shenanigans.elements.values.IntValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class ArrayVariable extends Expression {
+ private String identifier;
+ private Expression index;
+
+ public ArrayVariable (String identifier, Expression index) {
+ this.identifier = identifier;
+ this.index = index;
+ }
+
+ public Value evaluate (VarTable vars, Program program) {
+ Value vindex = index.evaluate(vars, program);
+ if (!(vindex instanceof DecimalValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ IntValue iindex = new IntValue(((DecimalValue) vindex).getValue(vars, program).toBigInteger());
+ Value varr = new Variable(identifier).evaluate(vars, program);
+ if (varr instanceof Array) {
+ Array array = (Array) varr;
+ return array.getElement(iindex, vars, program).evaluate(vars, program);
+ } else {
+ throw new RuntimeException("Not Implemented");
+ }
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Assignment.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Assignment.java
new file mode 100644
index 0000000..34b7812
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Assignment.java
@@ -0,0 +1,32 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.Namespace;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class Assignment extends Expression {
+ private String identifier;
+ private Expression value;
+
+ public Assignment (String identifier, Expression value) {
+ this.identifier = identifier;
+ this.value = value;
+ }
+
+ public Value evaluate(VarTable vars, Program program) {
+ if (identifier.contains(".")) {
+ String nspacecall = identifier.substring(0, identifier.indexOf('.'));
+ String varname = identifier.substring(identifier.indexOf('.')+1);
+ Namespace ns;
+ if ((ns = program.getNamespace(nspacecall)) != null) {
+ return ns.setVar(varname, value, vars, program);
+ } else {
+ return null;
+ }
+ } else {
+ return vars.set(identifier, value.evaluate(vars, program)).evaluate(vars, program);
+ }
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ConditionalStatement.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ConditionalStatement.java
new file mode 100644
index 0000000..9f8b1a2
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ConditionalStatement.java
@@ -0,0 +1,24 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.BoolValue;
+import org.archphantom.shenanigans.elements.values.DecimalValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public abstract class ConditionalStatement extends Expression {
+
+ boolean boolify (Expression expr, VarTable vars, Program program) {
+ Value val = expr.evaluate(vars, program);
+ if (val instanceof BoolValue) {
+ return ((BoolValue)val).getValue(vars, program);
+ } else {
+ if (val instanceof DecimalValue) {
+ return ((DecimalValue)val).getValue(vars, program).intValue() > 0;
+ } else {
+ return true;
+ }
+ }
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ForLoop.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ForLoop.java
new file mode 100644
index 0000000..c18c630
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ForLoop.java
@@ -0,0 +1,28 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class ForLoop extends ConditionalStatement {
+ private Expression initializer;
+ private Expression condition;
+ private Expression iterator;
+ private Expression evaluate;
+
+ public ForLoop (Expression initializer, Expression condition, Expression iterator, Expression evaluate) {
+ this.initializer = initializer;
+ this.condition = condition;
+ this.iterator = iterator;
+ this.evaluate = evaluate;
+ }
+
+ public Value evaluate (VarTable vars, Program program) {
+ Value retval = null;
+ for (initializer.evaluate(vars, program); boolify(condition, vars, program); iterator.evaluate(vars, program)) {
+ retval = evaluate.evaluate(vars, program);
+ }
+ return retval;
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/FunctionCall.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/FunctionCall.java
new file mode 100644
index 0000000..e3ba9f8
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/FunctionCall.java
@@ -0,0 +1,38 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import java.util.ArrayList;
+
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.expressions.Variable;
+import org.archphantom.shenanigans.elements.values.Function;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class FunctionCall extends Expression {
+ private String identifier;
+ private ArrayList<Expression> arguments;
+
+ public FunctionCall (String identifier, ArrayList<Expression> arguments) {
+ this.identifier = identifier;
+ this.arguments = arguments;
+ }
+
+ public Value evaluate (VarTable vars, Program program) {
+ Value vfn = new Variable(identifier).evaluate(vars, program);
+ if (vfn instanceof Function) {
+ Function function = (Function) vfn;
+ ArrayList<String> argNames = function.getArgNames();
+ int argnum = Math.min(argNames.size(), arguments.size());
+ VarTable localVars = new VarTable();
+ for (int i = 0; i < argnum; i++) {
+ localVars.set(argNames.get(i), arguments.get(i).evaluate(vars, program));
+ }
+ Value retval = function.getValue(localVars, program);
+ System.out.println("Function returned a "+retval.getClass().getSimpleName()+": "+retval.hashCode());
+ return retval;
+ } else {
+ throw new RuntimeException("No such function exists.");
+ }
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Group.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Group.java
new file mode 100644
index 0000000..8381b16
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Group.java
@@ -0,0 +1,27 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import java.util.ArrayList;
+
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class Group extends Expression {
+ private ArrayList<Expression> items;
+
+ public Group (ArrayList<Expression> items) {
+ this.items = items;
+ }
+
+ public Value evaluate(VarTable vars, Program program) {
+ Value retval = null;
+ System.out.println("Running group's body...");
+ for (Expression e : items) {
+ System.out.println("Running "+e.getClass().getSimpleName()+" in Group.");
+ retval = e.evaluate(vars, program);
+ System.out.println("Returned a "+retval.getClass().getSimpleName()+": "+retval.hashCode());
+ }
+ return retval;
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/If.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/If.java
new file mode 100644
index 0000000..2eca149
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/If.java
@@ -0,0 +1,25 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+
+public class If extends ConditionalStatement {
+ private Expression condition;
+ private Expression evaluate;
+
+ public If (Expression condition, Expression evaluate) {
+ this.condition = condition;
+ this.evaluate = evaluate;
+ }
+
+ public Value evaluate (VarTable vars, Program program) {
+ if (boolify(condition, vars, program)) {
+ return evaluate.evaluate(vars, program);
+ } else {
+ return null;
+ }
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/IfElse.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/IfElse.java
new file mode 100644
index 0000000..980ec19
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/IfElse.java
@@ -0,0 +1,26 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class IfElse extends ConditionalStatement {
+ private Expression condition;
+ private Expression evalTrue;
+ private Expression evalFalse;
+
+ public IfElse (Expression condition, Expression evalTrue, Expression evalFalse) {
+ this.condition = condition;
+ this.evalTrue = evalTrue;
+ this.evalFalse = evalFalse;
+ }
+
+ public Value evaluate (VarTable vars, Program program) {
+ if (boolify(condition, vars, program)) {
+ return evalTrue.evaluate(vars, program);
+ } else {
+ return evalFalse.evaluate(vars, program);
+ }
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Print.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Print.java
new file mode 100644
index 0000000..33f0dba
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Print.java
@@ -0,0 +1,31 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import java.math.BigInteger;
+import java.util.ArrayList;
+
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.Array;
+import org.archphantom.shenanigans.elements.values.IntValue;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class Print extends Expression {
+ private Array data;
+
+ public Print (Expression data) {
+ ArrayList<Expression> list = new ArrayList<Expression>(1);
+ list.add(data);
+ this.data = new Array(list);
+ }
+
+ public Print (Array data) {
+ this.data = data;
+ }
+
+ public Array evaluate(VarTable vars, Program program) {
+ for (int i = 0; i < data.size(); i++) {
+ System.out.print(data.getElement(new IntValue(BigInteger.valueOf(i)), vars, program).evaluate(vars, program).getValue(vars, program).toString());
+ }
+ return data;
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/WhileLoop.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/WhileLoop.java
new file mode 100644
index 0000000..956a7a4
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/WhileLoop.java
@@ -0,0 +1,24 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class WhileLoop extends ConditionalStatement {
+ private Expression condition;
+ private Expression evaluate;
+
+ public WhileLoop (Expression condition, Expression evaluate) {
+ this.condition = condition;
+ this.evaluate = evaluate;
+ }
+
+ public Value evaluate (VarTable vars, Program program) {
+ Value retval = null;
+ while (boolify(condition, vars, program)) {
+ retval = evaluate.evaluate(vars, program);
+ }
+ return retval;
+ }
+
+}