summaryrefslogtreecommitdiff
path: root/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements
diff options
context:
space:
mode:
Diffstat (limited to 'Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements')
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayAssignment.java37
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayVariable.java35
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Assignment.java32
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ConditionalStatement.java24
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ForLoop.java28
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/FunctionCall.java38
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Group.java27
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/If.java25
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/IfElse.java26
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Print.java31
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/WhileLoop.java24
11 files changed, 327 insertions, 0 deletions
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayAssignment.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayAssignment.java
new file mode 100644
index 0000000..c10c159
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayAssignment.java
@@ -0,0 +1,37 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.expressions.Variable;
+import org.archphantom.shenanigans.elements.values.Array;
+import org.archphantom.shenanigans.elements.values.DecimalValue;
+import org.archphantom.shenanigans.elements.values.IntValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class ArrayAssignment extends Expression {
+ private String identifier;
+ private Expression index;
+ private Expression value;
+
+ public ArrayAssignment (String identifier, Expression index, Expression value) {
+ this.identifier = identifier;
+ this.index = index;
+ this.value = value;
+ }
+
+ public Value evaluate (VarTable vars, Program program) {
+ Value vindex = index.evaluate(vars, program);
+ if (!(vindex instanceof DecimalValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ IntValue iindex = new IntValue(((DecimalValue) vindex).getValue(vars, program).toBigInteger());
+ Value varr = new Variable(identifier).evaluate(vars, program);
+ if (varr instanceof Array) {
+ Array array = (Array) varr;
+ return array.setElement(iindex, value, vars, program).evaluate(vars, program);
+ } else {
+ throw new RuntimeException("Not Implemented");
+ }
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayVariable.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayVariable.java
new file mode 100644
index 0000000..b637383
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayVariable.java
@@ -0,0 +1,35 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.expressions.Variable;
+import org.archphantom.shenanigans.elements.values.Array;
+import org.archphantom.shenanigans.elements.values.DecimalValue;
+import org.archphantom.shenanigans.elements.values.IntValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class ArrayVariable extends Expression {
+ private String identifier;
+ private Expression index;
+
+ public ArrayVariable (String identifier, Expression index) {
+ this.identifier = identifier;
+ this.index = index;
+ }
+
+ public Value evaluate (VarTable vars, Program program) {
+ Value vindex = index.evaluate(vars, program);
+ if (!(vindex instanceof DecimalValue)) {
+ throw new RuntimeException("Not Implemented");
+ }
+ IntValue iindex = new IntValue(((DecimalValue) vindex).getValue(vars, program).toBigInteger());
+ Value varr = new Variable(identifier).evaluate(vars, program);
+ if (varr instanceof Array) {
+ Array array = (Array) varr;
+ return array.getElement(iindex, vars, program).evaluate(vars, program);
+ } else {
+ throw new RuntimeException("Not Implemented");
+ }
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Assignment.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Assignment.java
new file mode 100644
index 0000000..34b7812
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Assignment.java
@@ -0,0 +1,32 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.Namespace;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class Assignment extends Expression {
+ private String identifier;
+ private Expression value;
+
+ public Assignment (String identifier, Expression value) {
+ this.identifier = identifier;
+ this.value = value;
+ }
+
+ public Value evaluate(VarTable vars, Program program) {
+ if (identifier.contains(".")) {
+ String nspacecall = identifier.substring(0, identifier.indexOf('.'));
+ String varname = identifier.substring(identifier.indexOf('.')+1);
+ Namespace ns;
+ if ((ns = program.getNamespace(nspacecall)) != null) {
+ return ns.setVar(varname, value, vars, program);
+ } else {
+ return null;
+ }
+ } else {
+ return vars.set(identifier, value.evaluate(vars, program)).evaluate(vars, program);
+ }
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ConditionalStatement.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ConditionalStatement.java
new file mode 100644
index 0000000..9f8b1a2
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ConditionalStatement.java
@@ -0,0 +1,24 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.BoolValue;
+import org.archphantom.shenanigans.elements.values.DecimalValue;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public abstract class ConditionalStatement extends Expression {
+
+ boolean boolify (Expression expr, VarTable vars, Program program) {
+ Value val = expr.evaluate(vars, program);
+ if (val instanceof BoolValue) {
+ return ((BoolValue)val).getValue(vars, program);
+ } else {
+ if (val instanceof DecimalValue) {
+ return ((DecimalValue)val).getValue(vars, program).intValue() > 0;
+ } else {
+ return true;
+ }
+ }
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ForLoop.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ForLoop.java
new file mode 100644
index 0000000..c18c630
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ForLoop.java
@@ -0,0 +1,28 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class ForLoop extends ConditionalStatement {
+ private Expression initializer;
+ private Expression condition;
+ private Expression iterator;
+ private Expression evaluate;
+
+ public ForLoop (Expression initializer, Expression condition, Expression iterator, Expression evaluate) {
+ this.initializer = initializer;
+ this.condition = condition;
+ this.iterator = iterator;
+ this.evaluate = evaluate;
+ }
+
+ public Value evaluate (VarTable vars, Program program) {
+ Value retval = null;
+ for (initializer.evaluate(vars, program); boolify(condition, vars, program); iterator.evaluate(vars, program)) {
+ retval = evaluate.evaluate(vars, program);
+ }
+ return retval;
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/FunctionCall.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/FunctionCall.java
new file mode 100644
index 0000000..e3ba9f8
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/FunctionCall.java
@@ -0,0 +1,38 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import java.util.ArrayList;
+
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.expressions.Variable;
+import org.archphantom.shenanigans.elements.values.Function;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class FunctionCall extends Expression {
+ private String identifier;
+ private ArrayList<Expression> arguments;
+
+ public FunctionCall (String identifier, ArrayList<Expression> arguments) {
+ this.identifier = identifier;
+ this.arguments = arguments;
+ }
+
+ public Value evaluate (VarTable vars, Program program) {
+ Value vfn = new Variable(identifier).evaluate(vars, program);
+ if (vfn instanceof Function) {
+ Function function = (Function) vfn;
+ ArrayList<String> argNames = function.getArgNames();
+ int argnum = Math.min(argNames.size(), arguments.size());
+ VarTable localVars = new VarTable();
+ for (int i = 0; i < argnum; i++) {
+ localVars.set(argNames.get(i), arguments.get(i).evaluate(vars, program));
+ }
+ Value retval = function.getValue(localVars, program);
+ System.out.println("Function returned a "+retval.getClass().getSimpleName()+": "+retval.hashCode());
+ return retval;
+ } else {
+ throw new RuntimeException("No such function exists.");
+ }
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Group.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Group.java
new file mode 100644
index 0000000..8381b16
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Group.java
@@ -0,0 +1,27 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import java.util.ArrayList;
+
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class Group extends Expression {
+ private ArrayList<Expression> items;
+
+ public Group (ArrayList<Expression> items) {
+ this.items = items;
+ }
+
+ public Value evaluate(VarTable vars, Program program) {
+ Value retval = null;
+ System.out.println("Running group's body...");
+ for (Expression e : items) {
+ System.out.println("Running "+e.getClass().getSimpleName()+" in Group.");
+ retval = e.evaluate(vars, program);
+ System.out.println("Returned a "+retval.getClass().getSimpleName()+": "+retval.hashCode());
+ }
+ return retval;
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/If.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/If.java
new file mode 100644
index 0000000..2eca149
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/If.java
@@ -0,0 +1,25 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+
+public class If extends ConditionalStatement {
+ private Expression condition;
+ private Expression evaluate;
+
+ public If (Expression condition, Expression evaluate) {
+ this.condition = condition;
+ this.evaluate = evaluate;
+ }
+
+ public Value evaluate (VarTable vars, Program program) {
+ if (boolify(condition, vars, program)) {
+ return evaluate.evaluate(vars, program);
+ } else {
+ return null;
+ }
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/IfElse.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/IfElse.java
new file mode 100644
index 0000000..980ec19
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/IfElse.java
@@ -0,0 +1,26 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class IfElse extends ConditionalStatement {
+ private Expression condition;
+ private Expression evalTrue;
+ private Expression evalFalse;
+
+ public IfElse (Expression condition, Expression evalTrue, Expression evalFalse) {
+ this.condition = condition;
+ this.evalTrue = evalTrue;
+ this.evalFalse = evalFalse;
+ }
+
+ public Value evaluate (VarTable vars, Program program) {
+ if (boolify(condition, vars, program)) {
+ return evalTrue.evaluate(vars, program);
+ } else {
+ return evalFalse.evaluate(vars, program);
+ }
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Print.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Print.java
new file mode 100644
index 0000000..33f0dba
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Print.java
@@ -0,0 +1,31 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import java.math.BigInteger;
+import java.util.ArrayList;
+
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.Array;
+import org.archphantom.shenanigans.elements.values.IntValue;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class Print extends Expression {
+ private Array data;
+
+ public Print (Expression data) {
+ ArrayList<Expression> list = new ArrayList<Expression>(1);
+ list.add(data);
+ this.data = new Array(list);
+ }
+
+ public Print (Array data) {
+ this.data = data;
+ }
+
+ public Array evaluate(VarTable vars, Program program) {
+ for (int i = 0; i < data.size(); i++) {
+ System.out.print(data.getElement(new IntValue(BigInteger.valueOf(i)), vars, program).evaluate(vars, program).getValue(vars, program).toString());
+ }
+ return data;
+ }
+
+}
diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/WhileLoop.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/WhileLoop.java
new file mode 100644
index 0000000..956a7a4
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/WhileLoop.java
@@ -0,0 +1,24 @@
+package org.archphantom.shenanigans.elements.expressions.statements;
+import org.archphantom.shenanigans.elements.Program;
+import org.archphantom.shenanigans.elements.expressions.Expression;
+import org.archphantom.shenanigans.elements.values.Value;
+import org.archphantom.shenanigans.elements.variables.VarTable;
+
+public class WhileLoop extends ConditionalStatement {
+ private Expression condition;
+ private Expression evaluate;
+
+ public WhileLoop (Expression condition, Expression evaluate) {
+ this.condition = condition;
+ this.evaluate = evaluate;
+ }
+
+ public Value evaluate (VarTable vars, Program program) {
+ Value retval = null;
+ while (boolify(condition, vars, program)) {
+ retval = evaluate.evaluate(vars, program);
+ }
+ return retval;
+ }
+
+}