From eb05c2dd956b7e991f52eb5c7f03a0f11b7f1f33 Mon Sep 17 00:00:00 2001 From: GeonoTRON2000 Date: Tue, 29 Apr 2014 07:13:20 -0700 Subject: Pushed existing work --- .../archphantom/shenanigans/elements/Program.java | 26 +++++++++ .../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 ++++++++ .../shenanigans/elements/values/Array.java | 37 ++++++++++++ .../shenanigans/elements/values/BoolValue.java | 16 ++++++ .../shenanigans/elements/values/CharValue.java | 15 +++++ .../shenanigans/elements/values/DecimalValue.java | 26 +++++++++ .../shenanigans/elements/values/Function.java | 25 ++++++++ .../shenanigans/elements/values/IntValue.java | 26 +++++++++ .../shenanigans/elements/values/Namespace.java | 66 ++++++++++++++++++++++ .../shenanigans/elements/values/Value.java | 13 +++++ .../shenanigans/elements/variables/VarTable.java | 21 +++++++ 41 files changed, 1084 insertions(+) create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/Program.java 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 create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/values/Array.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/values/BoolValue.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/values/CharValue.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/values/DecimalValue.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/values/Function.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/values/IntValue.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/values/Namespace.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/values/Value.java create mode 100644 Shenanigans/src/org/archphantom/shenanigans/elements/variables/VarTable.java (limited to 'Shenanigans/src/org/archphantom/shenanigans/elements') diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/Program.java b/Shenanigans/src/org/archphantom/shenanigans/elements/Program.java new file mode 100644 index 0000000..665cc9a --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/Program.java @@ -0,0 +1,26 @@ +package org.archphantom.shenanigans.elements; +import java.util.Hashtable; +import org.archphantom.shenanigans.elements.values.Namespace; +import org.archphantom.shenanigans.elements.variables.VarTable; + +public class Program implements Runnable { + private VarTable globalVars; + private Hashtable namespaces; + + public Program (Hashtable namespaces) { + this.globalVars = new VarTable(); + this.namespaces = namespaces; + } + + public Namespace getNamespace (String name) { + return namespaces.get(name.toLowerCase()); + } + + public void run () { + Namespace ns; + if ((ns = namespaces.get("main")) != null) { + ns.getValue(globalVars, this); + } + } + +} 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; + } + +} diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/values/Array.java b/Shenanigans/src/org/archphantom/shenanigans/elements/values/Array.java new file mode 100644 index 0000000..c03b66f --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/values/Array.java @@ -0,0 +1,37 @@ +package org.archphantom.shenanigans.elements.values; +import java.util.ArrayList; +import org.archphantom.shenanigans.elements.Program; +import org.archphantom.shenanigans.elements.expressions.Expression; +import org.archphantom.shenanigans.elements.variables.VarTable; + +public class Array extends Value { + private ArrayList vals; + + public Array (ArrayList values) { + this.vals = values; + } + + public Array (String string) { + this.vals = new ArrayList(string.length()); + for (int i = 0; i < string.length(); i++) { + this.vals.add(new CharValue(string.charAt(i))); + } + } + + public Expression getElement (IntValue index, VarTable vars, Program program) { + return vals.get(index.intValue(vars, program).intValue()); + } + + public Expression setElement (IntValue index, Expression value, VarTable vars, Program program) { + return vals.set(index.intValue(vars, program).intValue(), value); + } + + public int size () { + return vals.size(); + } + + public ArrayList getValue(VarTable vars, Program program) { + return vals; + } + +} diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/values/BoolValue.java b/Shenanigans/src/org/archphantom/shenanigans/elements/values/BoolValue.java new file mode 100644 index 0000000..23b968a --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/values/BoolValue.java @@ -0,0 +1,16 @@ +package org.archphantom.shenanigans.elements.values; +import org.archphantom.shenanigans.elements.Program; +import org.archphantom.shenanigans.elements.variables.VarTable; + +public class BoolValue extends Value { + private boolean val; + + public BoolValue (boolean val) { + this.val = val; + } + + public Boolean getValue (VarTable vars, Program program) { + return val; + } + +} diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/values/CharValue.java b/Shenanigans/src/org/archphantom/shenanigans/elements/values/CharValue.java new file mode 100644 index 0000000..fbae3c5 --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/values/CharValue.java @@ -0,0 +1,15 @@ +package org.archphantom.shenanigans.elements.values; +import org.archphantom.shenanigans.elements.Program; +import org.archphantom.shenanigans.elements.variables.VarTable; + +public class CharValue extends Value { + private char val; + + public CharValue (char val) { + this.val = val; + } + + public Character getValue (VarTable vars, Program program) { + return val; + } +} diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/values/DecimalValue.java b/Shenanigans/src/org/archphantom/shenanigans/elements/values/DecimalValue.java new file mode 100644 index 0000000..a2a2a58 --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/values/DecimalValue.java @@ -0,0 +1,26 @@ +package org.archphantom.shenanigans.elements.values; +import java.math.BigDecimal; + +import org.archphantom.shenanigans.elements.Program; +import org.archphantom.shenanigans.elements.variables.VarTable; + +public class DecimalValue extends Value { + private BigDecimal val; + + public DecimalValue (double val) { + this.val = new BigDecimal(val); + } + + public DecimalValue (String val) { + this.val = new BigDecimal(val); + } + + public DecimalValue (BigDecimal val) { + this.val = val; + } + + public BigDecimal getValue (VarTable vars, Program program) { + return val; + } + +} diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/values/Function.java b/Shenanigans/src/org/archphantom/shenanigans/elements/values/Function.java new file mode 100644 index 0000000..2ceb15e --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/values/Function.java @@ -0,0 +1,25 @@ +package org.archphantom.shenanigans.elements.values; +import java.util.ArrayList; + +import org.archphantom.shenanigans.elements.Program; +import org.archphantom.shenanigans.elements.expressions.Expression; +import org.archphantom.shenanigans.elements.variables.VarTable; + +public class Function extends Value { + private ArrayList arguments; + private Expression body; + + public Function (ArrayList arguments, Expression body) { + this.arguments = arguments; + this.body = body; + } + + public ArrayList getArgNames () { + return arguments; + } + + public Value getValue (VarTable vars, Program program) { + return body.evaluate(vars, program); + } + +} diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/values/IntValue.java b/Shenanigans/src/org/archphantom/shenanigans/elements/values/IntValue.java new file mode 100644 index 0000000..a1969fe --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/values/IntValue.java @@ -0,0 +1,26 @@ +package org.archphantom.shenanigans.elements.values; +import java.math.BigDecimal; +import java.math.BigInteger; + +import org.archphantom.shenanigans.elements.Program; +import org.archphantom.shenanigans.elements.variables.VarTable; + +public class IntValue extends DecimalValue { + + public IntValue (int val) { + super(new BigDecimal(val)); + } + + public IntValue (String val) { + super(new BigDecimal(val)); + } + + public IntValue(BigInteger val) { + super(new BigDecimal(val)); + } + + public BigInteger intValue (VarTable vars, Program program) { + return super.getValue(vars, program).toBigInteger(); + } + +} diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/values/Namespace.java b/Shenanigans/src/org/archphantom/shenanigans/elements/values/Namespace.java new file mode 100644 index 0000000..5b33bf2 --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/values/Namespace.java @@ -0,0 +1,66 @@ +package org.archphantom.shenanigans.elements.values; +import org.archphantom.shenanigans.elements.Program; +import org.archphantom.shenanigans.elements.expressions.Expression; +import org.archphantom.shenanigans.elements.variables.VarTable; + +public class Namespace extends Value { + private String name; + private Expression body; + private VarTable myvars; + + public Namespace (String name, Expression body, VarTable myvars) { + this.name = name; + this.body = body; + this.myvars = myvars; + } + + public String getName () { + return name; + } + + public Expression getVar (String identifier, VarTable vars, Program program) { + if (identifier.contains(".")) { + String nspacecall = identifier.substring(0, identifier.indexOf('.')); + String varname = identifier.substring(identifier.indexOf('.')+1); + Value vns; + if ((vns = myvars.get(nspacecall).evaluate(vars, program)) != null) { + if (vns instanceof Namespace) { + Namespace ns = (Namespace) vns; + return ns.getVar(varname, vars, program); + } else { + return null; + } + } else { + return null; + } + } else { + return myvars.get(identifier); + } + } + + public Value setVar (String identifier, Expression value, VarTable vars, Program program) { + if (identifier.contains(".")) { + String nspacecall = identifier.substring(0, identifier.indexOf('.')); + String varname = identifier.substring(identifier.indexOf('.')+1); + Value vns; + if ((vns = myvars.get(nspacecall).evaluate(vars, program)) != null) { + if (vns instanceof Namespace) { + Namespace ns = (Namespace) vns; + return ns.setVar(varname, value, vars, program); + } else { + return null; + } + } else { + return null; + } + } else { + return vars.get(identifier).evaluate(vars, program); + } + } + + public Value getValue (VarTable vars, Program program) { + System.out.println("Running namespace's body..."); + return body.evaluate(myvars, program); + } + +} diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/values/Value.java b/Shenanigans/src/org/archphantom/shenanigans/elements/values/Value.java new file mode 100644 index 0000000..d329c2c --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/values/Value.java @@ -0,0 +1,13 @@ +package org.archphantom.shenanigans.elements.values; +import org.archphantom.shenanigans.elements.Program; +import org.archphantom.shenanigans.elements.expressions.Expression; +import org.archphantom.shenanigans.elements.variables.VarTable; + +public abstract class Value extends Expression { + public abstract Object getValue(VarTable vars, Program program); + + public Value evaluate (VarTable vars, Program program) { + return this; + } + +} diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/variables/VarTable.java b/Shenanigans/src/org/archphantom/shenanigans/elements/variables/VarTable.java new file mode 100644 index 0000000..0811c56 --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/variables/VarTable.java @@ -0,0 +1,21 @@ +package org.archphantom.shenanigans.elements.variables; +import java.util.Hashtable; +import org.archphantom.shenanigans.elements.expressions.Expression; + +public class VarTable { + private Hashtable vars; + + public VarTable () { + vars = new Hashtable(); + } + + public Expression set (String identifier, Expression value) { + vars.put(identifier, value); + return value; + } + + public Expression get (String identifier) { + return vars.get(identifier); + } + +} -- cgit v1.2.3