summaryrefslogtreecommitdiff
path: root/Shenanigans
diff options
context:
space:
mode:
authorGeonoTRON2000 <geono@thegt.org>2014-05-02 21:00:45 -0700
committerGeonoTRON2000 <geono@thegt.org>2014-05-02 21:00:45 -0700
commit196117c0da164c226e111cc72a6cc169634f91c5 (patch)
tree11ebfc6e941d2f8a0f2001377f9710552a9558b6 /Shenanigans
parent508b66baa22aa54b940606663dd569eee03397ee (diff)
downloadshenanigans-196117c0da164c226e111cc72a6cc169634f91c5.tar.gz
Fixed variable and array storage glitch, cleaned up array printing.
Diffstat (limited to 'Shenanigans')
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/Variable.java11
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayAssignment.java2
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/ArrayVariable.java2
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/expressions/statements/Print.java37
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/values/Array.java27
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/values/Namespace.java2
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/elements/variables/VarTable.java10
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/examples/AddIt.java9
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/examples/Factorial.java9
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/examples/FactorialZ.java9
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/examples/ShiftIt.java11
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<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());
+
+ 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<Expression> vals;
+ private ArrayList<Value> vals;
- public Array (ArrayList<Expression> values) {
+ public Array () {
+ this.vals = new ArrayList<Value>();
+ }
+
+ public Array (ArrayList<Value> values) {
this.vals = values;
}
public Array (String string) {
- this.vals = new ArrayList<Expression>(string.length());
+ this.vals = new ArrayList<Value>(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<Expression> getValue(VarTable vars, Program program) {
+ public ArrayList<Value> 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<String, Expression> vars;
+ private Hashtable<String, Value> vars;
public VarTable () {
- vars = new Hashtable<String, Expression>();
+ vars = new Hashtable<String, Value>();
}
- 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<Expression> addit_expr_body = new ArrayList<Expression>();
- ArrayList<Expression> to_print = new ArrayList<Expression>();
- 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<Expression> arguments = new ArrayList<Expression>();
arguments.add(new IntValue("10"));
- ArrayList<Expression> to_print = new ArrayList<Expression>();
- 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<String, Namespace> namespaces = new Hashtable<String, Namespace>();
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<Expression> arguments = new ArrayList<Expression>();
arguments.add(new IntValue("10"));
- ArrayList<Expression> to_print = new ArrayList<Expression>();
- 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<String, Namespace> namespaces = new Hashtable<String, Namespace>();
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<String> argnames = new ArrayList<String>();
argnames.add("a");
ArrayList<Expression> shiftit_expr_body = new ArrayList<Expression>(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<Expression> arguments = new ArrayList<Expression>(1);
- ArrayList<Expression> elements = new ArrayList<Expression>(4);
+ ArrayList<Value> elements = new ArrayList<Value>(4);
elements.add(new IntValue("3"));
elements.add(new IntValue("6"));
elements.add(new IntValue("9"));
@@ -44,7 +47,7 @@ public class ShiftIt {
ArrayList<Expression> to_print = new ArrayList<Expression>(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<String, Namespace> namespaces = new Hashtable<String, Namespace>();