From 196117c0da164c226e111cc72a6cc169634f91c5 Mon Sep 17 00:00:00 2001 From: GeonoTRON2000 Date: Fri, 2 May 2014 21:00:45 -0700 Subject: Fixed variable and array storage glitch, cleaned up array printing. --- .../shenanigans/elements/expressions/Variable.java | 11 +++++-- .../expressions/statements/ArrayAssignment.java | 2 +- .../expressions/statements/ArrayVariable.java | 2 +- .../elements/expressions/statements/Print.java | 37 ++++++++++++++-------- .../shenanigans/elements/values/Array.java | 27 +++++++++++----- .../shenanigans/elements/values/Namespace.java | 2 +- .../shenanigans/elements/variables/VarTable.java | 10 +++--- .../archphantom/shenanigans/examples/AddIt.java | 9 ++---- .../shenanigans/examples/Factorial.java | 9 ++---- .../shenanigans/examples/FactorialZ.java | 9 ++---- .../archphantom/shenanigans/examples/ShiftIt.java | 11 ++++--- 11 files changed, 71 insertions(+), 58 deletions(-) diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/Variable.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/Variable.java index c857c29..4251286 100644 --- a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/Variable.java +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/Variable.java @@ -17,12 +17,17 @@ public class Variable extends Expression { String varname = identifier.substring(identifier.indexOf('.')+1); Namespace ns; if ((ns = program.getNamespace(nspacecall)) != null) { - return ns.getVar(varname, vars, program).evaluate(vars, program); + return ns.getVar(varname, vars, program); } else { - return null; + throw new RuntimeException("No such variable: "+identifier); } } else { - return vars.get(identifier).evaluate(vars, program); + Value val; + if ((val = vars.get(identifier)) != null) { + return val; + } else { + throw new RuntimeException("No such variable: "+identifier); + } } } diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayAssignment.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayAssignment.java index c10c159..005685b 100644 --- a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayAssignment.java +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayAssignment.java @@ -28,7 +28,7 @@ public class ArrayAssignment extends Expression { 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); + return array.setElement(iindex, value.evaluate(vars, program), 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 index b637383..65c7438 100644 --- a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayVariable.java +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayVariable.java @@ -26,7 +26,7 @@ public class ArrayVariable extends Expression { 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); + return array.getElement(iindex, vars, program); } else { throw new RuntimeException("Not Implemented"); } diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Print.java b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Print.java index 33f0dba..a4c02ed 100644 --- a/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Print.java +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Print.java @@ -1,31 +1,40 @@ 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.values.Value; import org.archphantom.shenanigans.elements.variables.VarTable; public class Print extends Expression { - private Array data; + private Expression 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()); + + public Value evaluate(VarTable vars, Program program) { + Value vdata = data.evaluate(vars, program); + if (vdata instanceof Array) { + System.out.print('['); + Array arr = (Array) vdata; + for (int i = 0; i < arr.size(); i++) { + Value val = arr.getElement(new IntValue(BigInteger.valueOf(i)), vars, program).evaluate(vars, program); + if (val instanceof Array) { + new Print ((Array) val).evaluate(vars, program); + } else { + System.out.print(val.getValue(vars, program).toString()); + } + if (i < arr.size()-1) { + System.out.print(", "); + } + } + System.out.print(']'); + } else { + System.out.print(vdata.getValue(vars, program).toString()); } - return data; + return vdata; } } diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/values/Array.java b/Shenanigans/src/org/archphantom/shenanigans/elements/values/Array.java index c03b66f..242e81a 100644 --- a/Shenanigans/src/org/archphantom/shenanigans/elements/values/Array.java +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/values/Array.java @@ -1,36 +1,47 @@ 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; + private ArrayList vals; - public Array (ArrayList values) { + public Array () { + this.vals = new ArrayList(); + } + + public Array (ArrayList values) { this.vals = values; } public Array (String string) { - this.vals = new ArrayList(string.length()); + 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) { + public Value 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 Value setElement (IntValue index, Value value, VarTable vars, Program program) { + int iindex = index.intValue(vars, program).intValue(); + int size = vals.size(); + if (iindex >= size) { + for (int i = size; i <= iindex; i++) { + vals.add(null); + } + } + vals.set(index.intValue(vars, program).intValue(), value); + return value; } public int size () { return vals.size(); } - public ArrayList getValue(VarTable vars, Program program) { + public ArrayList getValue(VarTable vars, Program program) { return vals; } diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/values/Namespace.java b/Shenanigans/src/org/archphantom/shenanigans/elements/values/Namespace.java index 5b33bf2..81bfd27 100644 --- a/Shenanigans/src/org/archphantom/shenanigans/elements/values/Namespace.java +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/values/Namespace.java @@ -18,7 +18,7 @@ public class Namespace extends Value { return name; } - public Expression getVar (String identifier, VarTable vars, Program program) { + public Value getVar (String identifier, VarTable vars, Program program) { if (identifier.contains(".")) { String nspacecall = identifier.substring(0, identifier.indexOf('.')); String varname = identifier.substring(identifier.indexOf('.')+1); diff --git a/Shenanigans/src/org/archphantom/shenanigans/elements/variables/VarTable.java b/Shenanigans/src/org/archphantom/shenanigans/elements/variables/VarTable.java index 0811c56..5328846 100644 --- a/Shenanigans/src/org/archphantom/shenanigans/elements/variables/VarTable.java +++ b/Shenanigans/src/org/archphantom/shenanigans/elements/variables/VarTable.java @@ -1,20 +1,20 @@ package org.archphantom.shenanigans.elements.variables; import java.util.Hashtable; -import org.archphantom.shenanigans.elements.expressions.Expression; +import org.archphantom.shenanigans.elements.values.Value; public class VarTable { - private Hashtable vars; + private Hashtable vars; public VarTable () { - vars = new Hashtable(); + vars = new Hashtable(); } - public Expression set (String identifier, Expression value) { + public Value set (String identifier, Value value) { vars.put(identifier, value); return value; } - public Expression get (String identifier) { + public Value get (String identifier) { return vars.get(identifier); } diff --git a/Shenanigans/src/org/archphantom/shenanigans/examples/AddIt.java b/Shenanigans/src/org/archphantom/shenanigans/examples/AddIt.java index 158f9d4..d898bd4 100644 --- a/Shenanigans/src/org/archphantom/shenanigans/examples/AddIt.java +++ b/Shenanigans/src/org/archphantom/shenanigans/examples/AddIt.java @@ -8,9 +8,7 @@ import org.archphantom.shenanigans.elements.expressions.operations.Addition; import org.archphantom.shenanigans.elements.expressions.statements.Assignment; import org.archphantom.shenanigans.elements.expressions.statements.FunctionCall; import org.archphantom.shenanigans.elements.expressions.statements.Group; -import org.archphantom.shenanigans.elements.expressions.statements.Print; -import org.archphantom.shenanigans.elements.values.Array; -import org.archphantom.shenanigans.elements.values.CharValue; +import org.archphantom.shenanigans.elements.expressions.statements.PrintLn; import org.archphantom.shenanigans.elements.values.DecimalValue; import org.archphantom.shenanigans.elements.values.Function; import org.archphantom.shenanigans.elements.values.Namespace; @@ -24,10 +22,7 @@ public class AddIt { argnames.add("x"); argnames.add("y"); ArrayList addit_expr_body = new ArrayList(); - ArrayList to_print = new ArrayList(); - to_print.add(new Addition(new Variable("x"), new Variable("y"))); - to_print.add(new CharValue('\n')); - addit_expr_body.add(new Print(new Array(to_print))); + addit_expr_body.add(new PrintLn(new Addition(new Variable("x"), new Variable("y")))); Group addit_body = new Group(addit_expr_body); Function addit = new Function(argnames, addit_body); list.add(new Assignment("add_it", addit)); diff --git a/Shenanigans/src/org/archphantom/shenanigans/examples/Factorial.java b/Shenanigans/src/org/archphantom/shenanigans/examples/Factorial.java index 931438b..06bf9b4 100644 --- a/Shenanigans/src/org/archphantom/shenanigans/examples/Factorial.java +++ b/Shenanigans/src/org/archphantom/shenanigans/examples/Factorial.java @@ -11,9 +11,7 @@ import org.archphantom.shenanigans.elements.expressions.statements.Assignment; import org.archphantom.shenanigans.elements.expressions.statements.FunctionCall; import org.archphantom.shenanigans.elements.expressions.statements.Group; import org.archphantom.shenanigans.elements.expressions.statements.IfElse; -import org.archphantom.shenanigans.elements.expressions.statements.Print; -import org.archphantom.shenanigans.elements.values.Array; -import org.archphantom.shenanigans.elements.values.CharValue; +import org.archphantom.shenanigans.elements.expressions.statements.PrintLn; import org.archphantom.shenanigans.elements.values.Function; import org.archphantom.shenanigans.elements.values.IntValue; import org.archphantom.shenanigans.elements.values.Namespace; @@ -34,10 +32,7 @@ public class Factorial { list.add(new Assignment("factorial", factorial)); ArrayList arguments = new ArrayList(); arguments.add(new IntValue("10")); - ArrayList to_print = new ArrayList(); - to_print.add(new FunctionCall("factorial", arguments)); - to_print.add(new CharValue('\n')); - list.add(new Print(new Array(to_print))); + list.add(new PrintLn(new FunctionCall("factorial", arguments))); Group group = new Group(list); Namespace main = new Namespace("main", group, new VarTable()); Hashtable namespaces = new Hashtable(); diff --git a/Shenanigans/src/org/archphantom/shenanigans/examples/FactorialZ.java b/Shenanigans/src/org/archphantom/shenanigans/examples/FactorialZ.java index 158bfc0..f6ae70a 100644 --- a/Shenanigans/src/org/archphantom/shenanigans/examples/FactorialZ.java +++ b/Shenanigans/src/org/archphantom/shenanigans/examples/FactorialZ.java @@ -10,10 +10,8 @@ import org.archphantom.shenanigans.elements.expressions.operations.Subtraction; import org.archphantom.shenanigans.elements.expressions.statements.Assignment; import org.archphantom.shenanigans.elements.expressions.statements.FunctionCall; import org.archphantom.shenanigans.elements.expressions.statements.Group; -import org.archphantom.shenanigans.elements.expressions.statements.Print; +import org.archphantom.shenanigans.elements.expressions.statements.PrintLn; import org.archphantom.shenanigans.elements.expressions.statements.WhileLoop; -import org.archphantom.shenanigans.elements.values.Array; -import org.archphantom.shenanigans.elements.values.CharValue; import org.archphantom.shenanigans.elements.values.Function; import org.archphantom.shenanigans.elements.values.IntValue; import org.archphantom.shenanigans.elements.values.Namespace; @@ -37,10 +35,7 @@ public class FactorialZ { list.add(new Assignment("factorialz", factorialz)); ArrayList arguments = new ArrayList(); arguments.add(new IntValue("10")); - ArrayList to_print = new ArrayList(); - to_print.add(new FunctionCall("factorialz", arguments)); - to_print.add(new CharValue('\n')); - list.add(new Print(new Array(to_print))); + list.add(new PrintLn(new FunctionCall("factorialz", arguments))); Group group = new Group(list); Namespace main = new Namespace("main", group, new VarTable()); Hashtable namespaces = new Hashtable(); diff --git a/Shenanigans/src/org/archphantom/shenanigans/examples/ShiftIt.java b/Shenanigans/src/org/archphantom/shenanigans/examples/ShiftIt.java index 71c9e98..1d56397 100644 --- a/Shenanigans/src/org/archphantom/shenanigans/examples/ShiftIt.java +++ b/Shenanigans/src/org/archphantom/shenanigans/examples/ShiftIt.java @@ -14,12 +14,13 @@ import org.archphantom.shenanigans.elements.expressions.statements.Assignment; import org.archphantom.shenanigans.elements.expressions.statements.ForLoop; import org.archphantom.shenanigans.elements.expressions.statements.FunctionCall; import org.archphantom.shenanigans.elements.expressions.statements.Group; -import org.archphantom.shenanigans.elements.expressions.statements.Print; +import org.archphantom.shenanigans.elements.expressions.statements.PrintLn; import org.archphantom.shenanigans.elements.values.Array; import org.archphantom.shenanigans.elements.values.CharValue; import org.archphantom.shenanigans.elements.values.Function; import org.archphantom.shenanigans.elements.values.IntValue; import org.archphantom.shenanigans.elements.values.Namespace; +import org.archphantom.shenanigans.elements.values.Value; import org.archphantom.shenanigans.elements.variables.VarTable; public class ShiftIt { @@ -29,13 +30,15 @@ public class ShiftIt { ArrayList argnames = new ArrayList(); argnames.add("a"); ArrayList shiftit_expr_body = new ArrayList(3); - shiftit_expr_body.add(new ForLoop(new Assignment("l", new IntValue("0")), new BoolLess(new Variable("l"), new Subtraction(new Count(new Variable("a")), new IntValue("1"))), new Assignment("l", new Addition(new Variable("l"), new IntValue("1"))), new ArrayAssignment("a", new Variable("l"), new Addition(new ArrayVariable("a", new Variable("l")), new IntValue("1"))))); + shiftit_expr_body.add(new Assignment("tmp", new ArrayVariable("a", new IntValue("0")))); + shiftit_expr_body.add(new ForLoop(new Assignment("l", new IntValue("0")), new BoolLess(new Variable("l"), new Subtraction(new Count(new Variable("a")), new IntValue("1"))), new Assignment("l", new Addition(new Variable("l"), new IntValue("1"))), new ArrayAssignment("a", new Variable("l"), new ArrayVariable("a", new Addition(new Variable("l"), new IntValue("1")))))); + shiftit_expr_body.add(new ArrayAssignment("a", new Subtraction(new Count(new Variable("a")), new IntValue("1")), new Variable("tmp"))); shiftit_expr_body.add(new Variable("a")); Group shiftit_body = new Group(shiftit_expr_body); Function shiftit = new Function(argnames, shiftit_body); list.add(new Assignment("shiftit", shiftit)); ArrayList arguments = new ArrayList(1); - ArrayList elements = new ArrayList(4); + ArrayList elements = new ArrayList(4); elements.add(new IntValue("3")); elements.add(new IntValue("6")); elements.add(new IntValue("9")); @@ -44,7 +47,7 @@ public class ShiftIt { ArrayList to_print = new ArrayList(2); to_print.add(new FunctionCall("shiftit", arguments)); to_print.add(new CharValue('\n')); - list.add(new Print(new Array(to_print))); + list.add(new PrintLn(new FunctionCall("shiftit", arguments))); Group group = new Group(list); Namespace main = new Namespace("main", group, new VarTable()); Hashtable namespaces = new Hashtable(); -- cgit v1.2.3