diff options
48 files changed, 1438 insertions, 0 deletions
diff --git a/Shenanigans/src/org/archphantom/shenanigans/Shenanigans.java b/Shenanigans/src/org/archphantom/shenanigans/Shenanigans.java new file mode 100644 index 0000000..c516de0 --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/Shenanigans.java @@ -0,0 +1,55 @@ +package org.archphantom.shenanigans; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; + +public class Shenanigans { + private static final String HELP_STRING = "############################### Shenanigans Help ###############################\r\n" + + "# #" + + "# <no arguments>: parse from standard input as Shenanigans code #" + + "# -h or --HELP: display this help message #" + + "# -f or --FILE <filename>: parse this file as Shenanigans code #" + + "# #" + + "################################################################################"; + + public static void main (String[] args) { + try { + boolean usefiles = false; + ArrayList<InputStream> streams = new ArrayList<InputStream>(); + for (int i = 0; i < args.length; i++) { + if (args[i].equals("-h") || args[i].equalsIgnoreCase("--help")) { + System.out.println(HELP_STRING); + return; + } + if ((args[i].equals("-f") || args[i].equalsIgnoreCase("--file")) && (i+1) < args.length) { + streams.add(new FileInputStream(args[i+1])); + usefiles = true; + } + } + if (usefiles) { + parse(streams.toArray(new InputStream[] {})); + } else { + parse(System.in); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void parse (InputStream[] streams) throws IOException { + for (InputStream stream : streams) { + parse(stream); + } + } + + public static void parse (InputStream stream) throws IOException { + String data = ""; + int b; + while ((b = stream.read()) != -1) { + data += (char) b; + } + //ShenaniganParser.parse(data); + } + +} 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<String, Namespace> namespaces; + + public Program (Hashtable<String, Namespace> 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<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; + } + +} 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<Expression> vals; + + public Array (ArrayList<Expression> values) { + this.vals = values; + } + + public Array (String string) { + this.vals = new ArrayList<Expression>(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<Expression> 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<String> arguments; + private Expression body; + + public Function (ArrayList<String> arguments, Expression body) { + this.arguments = arguments; + this.body = body; + } + + public ArrayList<String> 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<String, Expression> vars; + + public VarTable () { + vars = new Hashtable<String, Expression>(); + } + + public Expression set (String identifier, Expression value) { + vars.put(identifier, value); + return value; + } + + public Expression 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 new file mode 100644 index 0000000..158f9d4 --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/examples/AddIt.java @@ -0,0 +1,48 @@ +package org.archphantom.shenanigans.examples; +import java.util.ArrayList; +import java.util.Hashtable; +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.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.values.DecimalValue; +import org.archphantom.shenanigans.elements.values.Function; +import org.archphantom.shenanigans.elements.values.Namespace; +import org.archphantom.shenanigans.elements.variables.VarTable; + +public class AddIt { + + public static void main (String[] args) { + ArrayList<Expression> list = new ArrayList<Expression>(); + ArrayList<String> argnames = new ArrayList<String>(); + 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))); + Group addit_body = new Group(addit_expr_body); + Function addit = new Function(argnames, addit_body); + list.add(new Assignment("add_it", addit)); + ArrayList<Expression> arguments = new ArrayList<Expression>(); + arguments.add(new DecimalValue("2.6789553890921339210")); + arguments.add(new DecimalValue("-1.8888888888888888888")); + list.add(new FunctionCall("add_it", arguments)); + Group group = new Group(list); + Namespace main = new Namespace("main", group, new VarTable()); + Hashtable<String, Namespace> namespaces = new Hashtable<String, Namespace>(); + namespaces.put("main", main); + Program p = new Program(namespaces); + System.out.println("Running..."); + p.run(); + System.out.println("Ran..."); + } + +} diff --git a/Shenanigans/src/org/archphantom/shenanigans/examples/CheckIt.java b/Shenanigans/src/org/archphantom/shenanigans/examples/CheckIt.java new file mode 100644 index 0000000..8506584 --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/examples/CheckIt.java @@ -0,0 +1,44 @@ +package org.archphantom.shenanigans.examples; +import java.util.ArrayList; +import java.util.Hashtable; +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.expressions.comparators.BoolGreater; +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.DecimalValue; +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.variables.VarTable; + +public class CheckIt { + + public static void main (String[] args) { + ArrayList<Expression> list = new ArrayList<Expression>(); + ArrayList<String> argnames = new ArrayList<String>(); + argnames.add("x"); + ArrayList<Expression> checkit_expr_body = new ArrayList<Expression>(); + checkit_expr_body.add(new IfElse(new BoolGreater(new Variable("x"), new IntValue("0")), new Print(new Array("True\n")), new Print(new Array("False\n")))); + Group checkit_body = new Group(checkit_expr_body); + Function checkit = new Function(argnames, checkit_body); + list.add(new Assignment("checkit", checkit)); + ArrayList<Expression> arguments = new ArrayList<Expression>(); + arguments.add(new DecimalValue("298")); + list.add(new FunctionCall("checkit", arguments)); + Group group = new Group(list); + Namespace main = new Namespace("main", group, new VarTable()); + Hashtable<String, Namespace> namespaces = new Hashtable<String, Namespace>(); + namespaces.put("main", main); + Program p = new Program(namespaces); + System.out.println("Running..."); + p.run(); + System.out.println("Ran..."); + } + +} diff --git a/Shenanigans/src/org/archphantom/shenanigans/examples/Factorial.java b/Shenanigans/src/org/archphantom/shenanigans/examples/Factorial.java new file mode 100644 index 0000000..931438b --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/examples/Factorial.java @@ -0,0 +1,49 @@ +package org.archphantom.shenanigans.examples; +import java.util.ArrayList; +import java.util.Hashtable; +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.expressions.comparators.BoolEqual; +import org.archphantom.shenanigans.elements.expressions.operations.Multiplication; +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.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.values.Function; +import org.archphantom.shenanigans.elements.values.IntValue; +import org.archphantom.shenanigans.elements.values.Namespace; +import org.archphantom.shenanigans.elements.variables.VarTable; + +public class Factorial { + + public static void main (String[] args) { + ArrayList<Expression> list = new ArrayList<Expression>(); + ArrayList<String> argnames = new ArrayList<String>(); + argnames.add("n"); + ArrayList<Expression> factorial_expr_body = new ArrayList<Expression>(); + ArrayList<Expression> recursionargs = new ArrayList<Expression>(); + recursionargs.add(new Subtraction(new Variable("n"), new IntValue("1"))); + factorial_expr_body.add(new IfElse(new BoolEqual(new Variable("n"), new IntValue("0")), new IntValue("1"), new Multiplication(new FunctionCall("main.factorial", recursionargs), new Variable("n")))); + Group factorial_body = new Group(factorial_expr_body); + Function factorial = new Function(argnames, factorial_body); + 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))); + Group group = new Group(list); + Namespace main = new Namespace("main", group, new VarTable()); + Hashtable<String, Namespace> namespaces = new Hashtable<String, Namespace>(); + namespaces.put("main", main); + Program p = new Program(namespaces); + p.run(); + } + +} diff --git a/Shenanigans/src/org/archphantom/shenanigans/examples/FactorialZ.java b/Shenanigans/src/org/archphantom/shenanigans/examples/FactorialZ.java new file mode 100644 index 0000000..158bfc0 --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/examples/FactorialZ.java @@ -0,0 +1,52 @@ +package org.archphantom.shenanigans.examples; +import java.util.ArrayList; +import java.util.Hashtable; +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.expressions.comparators.BoolGreater; +import org.archphantom.shenanigans.elements.expressions.operations.Multiplication; +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.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; +import org.archphantom.shenanigans.elements.variables.VarTable; + +public class FactorialZ { + + public static void main (String[] args) { + ArrayList<Expression> list = new ArrayList<Expression>(); + ArrayList<String> argnames = new ArrayList<String>(); + argnames.add("n"); + ArrayList<Expression> factorialz_expr_body = new ArrayList<Expression>(); + factorialz_expr_body.add(new Assignment("res", new IntValue("1"))); + ArrayList<Expression> loop_body = new ArrayList<Expression>(); + loop_body.add(new Assignment("res", new Multiplication(new Variable("res"), new Variable("n")))); + loop_body.add(new Assignment("n", new Subtraction(new Variable("n"), new IntValue("1")))); + factorialz_expr_body.add(new WhileLoop(new BoolGreater(new Variable("n"), new IntValue("0")), new Group(loop_body))); + factorialz_expr_body.add(new Variable("res")); + Group factorialz_body = new Group(factorialz_expr_body); + Function factorialz = new Function(argnames, factorialz_body); + 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))); + Group group = new Group(list); + Namespace main = new Namespace("main", group, new VarTable()); + Hashtable<String, Namespace> namespaces = new Hashtable<String, Namespace>(); + namespaces.put("main", main); + Program p = new Program(namespaces); + p.run(); + } + +} diff --git a/Shenanigans/src/org/archphantom/shenanigans/examples/ShiftIt.java b/Shenanigans/src/org/archphantom/shenanigans/examples/ShiftIt.java new file mode 100644 index 0000000..71c9e98 --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/examples/ShiftIt.java @@ -0,0 +1,56 @@ +package org.archphantom.shenanigans.examples; +import java.util.ArrayList; +import java.util.Hashtable; +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.expressions.comparators.BoolLess; +import org.archphantom.shenanigans.elements.expressions.comparators.Count; +import org.archphantom.shenanigans.elements.expressions.operations.Addition; +import org.archphantom.shenanigans.elements.expressions.operations.Subtraction; +import org.archphantom.shenanigans.elements.expressions.statements.ArrayAssignment; +import org.archphantom.shenanigans.elements.expressions.statements.ArrayVariable; +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.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.variables.VarTable; + +public class ShiftIt { + + public static void main (String[] args) { + ArrayList<Expression> list = new ArrayList<Expression>(); + 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 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); + elements.add(new IntValue("3")); + elements.add(new IntValue("6")); + elements.add(new IntValue("9")); + elements.add(new IntValue("12")); + arguments.add(new Array(elements)); + 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))); + Group group = new Group(list); + Namespace main = new Namespace("main", group, new VarTable()); + Hashtable<String, Namespace> namespaces = new Hashtable<String, Namespace>(); + namespaces.put("main", main); + Program p = new Program(namespaces); + p.run(); + } + +} diff --git a/Shenanigans/src/org/archphantom/shenanigans/parser/ShenaniganParser.scala b/Shenanigans/src/org/archphantom/shenanigans/parser/ShenaniganParser.scala new file mode 100644 index 0000000..e413a03 --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/parser/ShenaniganParser.scala @@ -0,0 +1,50 @@ +package org.archphantom.shenanigans.parser +/* +import org.archphantom.shenanigans.elements.expressions._ +import org.archphantom.shenanigans.elements.expressions.statements._ +import org.archphantom.shenanigans.elements.values._ +import scala.util.parsing.combinator._ +import scala.util.parsing.combinator.lexical.StdLexical +import scala.util.parsing.combinator.syntactical.StandardTokenParsers +import org.archphantom.shenanigans.elements.expressions.operations._ + +object ShenaniganParser extends StandardTokenParsers { + override val lexical = new ShenaniLexer + + def parse (input : String) { + + } + + def boolean : Parser[BoolValue] = ("true" | "false") ^^ { + s => new BoolValue(s.toBoolean) + } + + def string : Parser[Array] = stringLit ^^ { + s => new Array(s) + } + + def double : Parser[DecimalValue] = numericLit ^^ { + s => new DecimalValue(s) + } + + def int : Parser[IntValue] = """\-?[0-9]+""".r ^^ { + s => new IntValue(s) + } + + def parens : Parser[Expression] = "(" ~> expr <~ ")" + + def unaryMinus:Parser[Subtraction] = "-" ~> expr ^^ { new Subtraction(new IntValue(0), expr) } + + def literal : Parser[Value] = boolean | string | double | int + + def variable : Parser[Variable] = """[a-zA-Z_]([\w\.]*\w)?""".r ^^ { + s => new Variable(s) + } + + def expr = literal | variable + +} + +class ShenaniLexer extends StdLexical { + +}*/
\ No newline at end of file |
