From eb05c2dd956b7e991f52eb5c7f03a0f11b7f1f33 Mon Sep 17 00:00:00 2001 From: GeonoTRON2000 Date: Tue, 29 Apr 2014 07:13:20 -0700 Subject: Pushed existing work --- .../elements/expressions/Expression.java | 10 ++++++ .../shenanigans/elements/expressions/Variable.java | 29 +++++++++++++++++ .../elements/expressions/comparators/BoolAnd.java | 25 ++++++++++++++ .../expressions/comparators/BoolEqual.java | 22 +++++++++++++ .../expressions/comparators/BoolGreater.java | 26 +++++++++++++++ .../elements/expressions/comparators/BoolLess.java | 26 +++++++++++++++ .../elements/expressions/comparators/BoolNot.java | 23 +++++++++++++ .../elements/expressions/comparators/BoolOr.java | 25 ++++++++++++++ .../elements/expressions/comparators/BoolXOr.java | 25 ++++++++++++++ .../elements/expressions/comparators/Count.java | 27 +++++++++++++++ .../elements/expressions/operations/Addition.java | 25 ++++++++++++++ .../elements/expressions/operations/BitAnd.java | 25 ++++++++++++++ .../elements/expressions/operations/BitOr.java | 25 ++++++++++++++ .../elements/expressions/operations/BitXOr.java | 25 ++++++++++++++ .../elements/expressions/operations/Division.java | 24 ++++++++++++++ .../elements/expressions/operations/Modulo.java | 25 ++++++++++++++ .../expressions/operations/Multiplication.java | 24 ++++++++++++++ .../elements/expressions/operations/ShiftLeft.java | 25 ++++++++++++++ .../expressions/operations/ShiftRight.java | 25 ++++++++++++++ .../expressions/operations/Subtraction.java | 25 ++++++++++++++ .../expressions/statements/ArrayAssignment.java | 37 +++++++++++++++++++++ .../expressions/statements/ArrayVariable.java | 35 ++++++++++++++++++++ .../expressions/statements/Assignment.java | 32 ++++++++++++++++++ .../statements/ConditionalStatement.java | 24 ++++++++++++++ .../elements/expressions/statements/ForLoop.java | 28 ++++++++++++++++ .../expressions/statements/FunctionCall.java | 38 ++++++++++++++++++++++ .../elements/expressions/statements/Group.java | 27 +++++++++++++++ .../elements/expressions/statements/If.java | 25 ++++++++++++++ .../elements/expressions/statements/IfElse.java | 26 +++++++++++++++ .../elements/expressions/statements/Print.java | 31 ++++++++++++++++++ .../elements/expressions/statements/WhileLoop.java | 24 ++++++++++++++ 31 files changed, 813 insertions(+) create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/Expression.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/Variable.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolAnd.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolEqual.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolGreater.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolLess.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolNot.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolOr.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/BoolXOr.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/comparators/Count.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Addition.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/BitAnd.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/BitOr.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/BitXOr.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Division.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Modulo.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Multiplication.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/ShiftLeft.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/ShiftRight.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/operations/Subtraction.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayAssignment.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayVariable.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Assignment.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ConditionalStatement.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ForLoop.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/FunctionCall.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Group.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/If.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/IfElse.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Print.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/WhileLoop.java (limited to 'Shenanigans/src/org/archphantom/shenanigans/elements/expressions') 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 arguments; + + public FunctionCall (String identifier, ArrayList 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 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 items; + + public Group (ArrayList 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 list = new ArrayList(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; + } + +} -- cgit v1.2.3