From eb05c2dd956b7e991f52eb5c7f03a0f11b7f1f33 Mon Sep 17 00:00:00 2001 From: GeonoTRON2000 Date: Tue, 29 Apr 2014 07:13:20 -0700 Subject: Pushed existing work --- .../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 ++++++++++++++ 11 files changed, 327 insertions(+) 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/statements') 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