summaryrefslogtreecommitdiff
path: root/base/src/bjc/dicelang/Node.java
diff options
context:
space:
mode:
Diffstat (limited to 'base/src/bjc/dicelang/Node.java')
-rw-r--r--base/src/bjc/dicelang/Node.java105
1 files changed, 105 insertions, 0 deletions
diff --git a/base/src/bjc/dicelang/Node.java b/base/src/bjc/dicelang/Node.java
new file mode 100644
index 0000000..4238cfc
--- /dev/null
+++ b/base/src/bjc/dicelang/Node.java
@@ -0,0 +1,105 @@
+package bjc.dicelang;
+
+/*
+ * @TODO 10/09/17 Ben Culkin :NodeReorg
+ * Same thing, different class. Split into subclasses based off of the type
+ * values.
+ */
+/**
+ * Represents a node in the AST.
+ *
+ * @author Ben Culkin
+ */
+public class Node {
+ public static enum Type {
+ ROOT, TOKREF, UNARYOP, BINOP, GROUP, OGROUP, RESULT
+ }
+
+ public static enum GroupType {
+ ARRAY, CODE
+ }
+
+ public final Type type;
+
+ // These can have or not have values based of the node type
+ public Token tokenVal;
+ public Token.Type operatorType;
+ public GroupType groupType;
+ public EvaluatorResult resultVal;
+
+ public Node(final Type typ) {
+ type = typ;
+ }
+
+ public Node(final Type typ, final Token tokenVl) {
+ this(typ);
+
+ tokenVal = tokenVl;
+ }
+
+ public Node(final Type typ, final Token.Type opType) {
+ this(typ);
+
+ operatorType = opType;
+ }
+
+ public Node(final Type typ, final GroupType grupType) {
+ this(typ);
+
+ groupType = grupType;
+ }
+
+ public Node(final Type typ, final EvaluatorResult res) {
+ this(typ);
+
+ resultVal = res;
+ }
+
+ @Override
+ public String toString() {
+ switch (type) {
+ case UNARYOP:
+ case BINOP:
+ return "(" + type.name() + " : " + operatorType + ")";
+
+ case OGROUP:
+ case TOKREF:
+ return "(" + type.name() + " : " + tokenVal + ")";
+
+ case GROUP:
+ return "(" + type.name() + " : " + groupType + ")";
+
+ case RESULT:
+ return "(" + type.name() + " : " + resultVal + ")";
+
+ default:
+ return "Unknown node type " + type;
+ }
+ }
+
+ @Override
+ public boolean equals(final Object other) {
+ if (!(other instanceof Node)) {
+ return false;
+ }
+
+ final Node otk = (Node) other;
+
+ if (otk.type != type) {
+ return false;
+ }
+
+ switch (type) {
+ case OGROUP:
+ return tokenVal.equals(otk.tokenVal);
+
+ default:
+ return true;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode();
+ }
+}