summaryrefslogtreecommitdiff
path: root/base/src/bjc
diff options
context:
space:
mode:
authorstudent <student@localhost>2018-02-12 11:30:54 -0500
committerstudent <student@localhost>2018-02-12 11:30:54 -0500
commitd7af27dab45dd6f82c27519e6b4fd2faa162f884 (patch)
tree1907cc51f97f841b1fff2238b54096a20386a704 /base/src/bjc
parent5b827a1bdba27f763c035553f7bdb8da4f9cf71a (diff)
Refactor SCL token into seperate class
Diffstat (limited to 'base/src/bjc')
-rw-r--r--base/src/bjc/dicelang/Evaluator.java92
-rw-r--r--base/src/bjc/dicelang/Node.java25
-rw-r--r--base/src/bjc/dicelang/scl/SCLToken.java161
-rw-r--r--base/src/bjc/dicelang/scl/StreamControlConsole.java5
-rw-r--r--base/src/bjc/dicelang/scl/StreamControlEngine.java192
-rw-r--r--base/src/bjc/dicelang/scl/StreamEngine.java8
6 files changed, 246 insertions, 237 deletions
diff --git a/base/src/bjc/dicelang/Evaluator.java b/base/src/bjc/dicelang/Evaluator.java
index d817c42..f3b2450 100644
--- a/base/src/bjc/dicelang/Evaluator.java
+++ b/base/src/bjc/dicelang/Evaluator.java
@@ -7,7 +7,6 @@ import java.util.function.Consumer;
import bjc.dicelang.dice.CompoundDie;
import bjc.dicelang.dice.Die;
-import bjc.dicelang.dice.FudgeDie;
import bjc.dicelang.dice.MathDie;
import bjc.dicelang.dice.ScalarDie;
import bjc.dicelang.dice.SimpleDie;
@@ -54,27 +53,6 @@ public class Evaluator {
}
}
- /* @TODO 10/09/17 Ben Culkin :NodeFAIL
- * These methods should be moved to Node.
- */
- /* Create a failing node. */
- private static Node FAIL() {
- return new Node(Node.Type.RESULT, new EvaluatorResult(FAILURE));
- }
-
- private static Node FAIL(final ITree<Node> orig) {
- return new Node(Node.Type.RESULT, new EvaluatorResult(FAILURE, orig));
- }
-
- private static Node FAIL(final Node orig) {
- return new Node(Node.Type.RESULT, new EvaluatorResult(FAILURE, orig));
- }
-
- private static Node FAIL(final EvaluatorResult res) {
- EvaluatorResult eres = new EvaluatorResult(FAILURE, new Node(Node.Type.RESULT, res));
- return new Node(Node.Type.RESULT, eres);
- }
-
/* The engine we are connected to. */
private final DiceLangEngine eng;
@@ -165,7 +143,7 @@ public class Evaluator {
return ast;
default:
Errors.inst.printError(EK_EVAL_INVNODE, ast.getHead().type.toString());
- return new Tree<>(FAIL(ast));
+ return new Tree<>(Node.FAIL(ast));
}
}
@@ -174,7 +152,7 @@ public class Evaluator {
/* Unary operators only take one operand. */
if (ast.getChildrenCount() != 1) {
Errors.inst.printError(EK_EVAL_UNUNARY, Integer.toString(ast.getChildrenCount()));
- return new Tree<>(FAIL(ast));
+ return new Tree<>(Node.FAIL(ast));
}
switch (ast.getHead().operatorType) {
@@ -217,7 +195,7 @@ public class Evaluator {
if (nChild == null) {
Errors.inst.printError(EK_EVAL_INVNODE);
- return new Tree<>(FAIL(ast));
+ return new Tree<>(Node.FAIL(ast));
}
final Node childNode = nChild.getHead();
@@ -270,7 +248,7 @@ public class Evaluator {
return new Tree<>(new Node(Node.Type.RESULT, fres));
default:
Errors.inst.printError(EK_EVAL_INVUNARY, ast.getHead().operatorType.toString());
- return new Tree<>(FAIL(ast));
+ return new Tree<>(Node.FAIL(ast));
}
}
@@ -283,7 +261,7 @@ public class Evaluator {
Errors.inst.printError(EK_EVAL_INVBIN, Integer.toString(ast.getChildrenCount()),
ast.toString());
- return new Tree<>(FAIL(ast));
+ return new Tree<>(Node.FAIL(ast));
}
final ITree<Node> left = ast.getChild(0);
@@ -308,7 +286,7 @@ public class Evaluator {
return evaluateStringBinary(binOp, leftRes, rightRes, ctx);
default:
Errors.inst.printError(EK_EVAL_UNBIN, binOp.toString());
- return new Tree<>(FAIL(ast));
+ return new Tree<>(Node.FAIL(ast));
}
}
@@ -318,7 +296,7 @@ public class Evaluator {
final EvaluatorResult right, final Context ctx) {
if (left.type != STRING) {
Errors.inst.printError(EK_EVAL_INVSTRING, left.type.toString());
- return new Tree<>(FAIL(left));
+ return new Tree<>(Node.FAIL(left));
}
final String strang = left.stringVal;
@@ -327,7 +305,7 @@ public class Evaluator {
case STRCAT:
if (right.type != STRING) {
Errors.inst.printError(EK_EVAL_UNSTRING, right.type.toString());
- return new Tree<>(FAIL(right));
+ return new Tree<>(Node.FAIL(right));
}
final String strung = right.stringVal;
@@ -337,7 +315,7 @@ public class Evaluator {
case STRREP:
if (right.type != INT) {
Errors.inst.printError(EK_EVAL_INVSTRING, right.type.toString());
- return new Tree<>(FAIL(right));
+ return new Tree<>(Node.FAIL(right));
}
String res = strang;
@@ -350,7 +328,7 @@ public class Evaluator {
return new Tree<>(new Node(Node.Type.RESULT, new EvaluatorResult(STRING, res)));
default:
Errors.inst.printError(EK_EVAL_UNSTRING, op.toString());
- return new Tree<>(FAIL());
+ return new Tree<>(Node.FAIL());
}
}
@@ -379,7 +357,7 @@ public class Evaluator {
new SimpleDie(left.diceVal.scalar, right.intVal));
} else {
Errors.inst.printError(EK_EVAL_INVDGROUP, right.type.toString());
- return new Tree<>(FAIL(right));
+ return new Tree<>(Node.FAIL(right));
}
} else if (left.type == INT) {
if (right.type == DICE && !right.diceVal.isList) {
@@ -389,20 +367,20 @@ public class Evaluator {
res = new EvaluatorResult(DICE, new SimpleDie(left.intVal, right.intVal));
} else {
Errors.inst.printError(EK_EVAL_INVDGROUP, right.type.toString());
- return new Tree<>(FAIL(right));
+ return new Tree<>(Node.FAIL(right));
}
} else {
Errors.inst.printError(EK_EVAL_INVDGROUP, left.type.toString());
- return new Tree<>(FAIL(left));
+ return new Tree<>(Node.FAIL(left));
}
case DICECONCAT:
if (left.type != DICE || left.diceVal.isList) {
Errors.inst.printError(EK_EVAL_INVDICE, left.type.toString());
- return new Tree<>(FAIL(left));
+ return new Tree<>(Node.FAIL(left));
} else if (right.type != DICE || right.diceVal.isList) {
Errors.inst.printError(EK_EVAL_INVDICE, right.type.toString());
- return new Tree<>(FAIL(right));
+ return new Tree<>(Node.FAIL(right));
} else {
res = new EvaluatorResult(DICE,
new CompoundDie(left.diceVal.scalar, right.diceVal.scalar));
@@ -413,10 +391,10 @@ public class Evaluator {
case DICELIST:
if (left.type != DICE || left.diceVal.isList) {
Errors.inst.printError(EK_EVAL_INVDICE, left.type.toString());
- return new Tree<>(FAIL(left));
+ return new Tree<>(Node.FAIL(left));
} else if (right.type != DICE || right.diceVal.isList) {
Errors.inst.printError(EK_EVAL_INVDICE, right.type.toString());
- return new Tree<>(FAIL(right));
+ return new Tree<>(Node.FAIL(right));
} else {
res = new EvaluatorResult(DICE,
new SimpleDieList(left.diceVal.scalar, right.diceVal.scalar));
@@ -426,7 +404,7 @@ public class Evaluator {
default:
Errors.inst.printError(EK_EVAL_UNDICE, op.toString());
- return new Tree<>(FAIL());
+ return new Tree<>(Node.FAIL());
}
return new Tree<>(new Node(Node.Type.RESULT, res));
@@ -438,27 +416,27 @@ public class Evaluator {
final EvaluatorResult right, final Context ctx) {
if (left.type == STRING || right.type == STRING) {
Errors.inst.printError(EK_EVAL_STRINGMATH);
- return new Tree<>(FAIL());
+ return new Tree<>(Node.FAIL());
} else if (left.type == FAILURE || right.type == FAILURE) {
- return new Tree<>(FAIL());
+ return new Tree<>(Node.FAIL());
} else if (left.type == INT && right.type != INT) {
Errors.inst.printError(EK_EVAL_MISMATH);
- return new Tree<>(FAIL(right));
+ return new Tree<>(Node.FAIL(right));
} else if (left.type == FLOAT && right.type != FLOAT) {
Errors.inst.printError(EK_EVAL_MISMATH);
- return new Tree<>(FAIL(right));
+ return new Tree<>(Node.FAIL(right));
} else if (left.type == DICE && right.type != DICE) {
Errors.inst.printError(EK_EVAL_MISMATH);
- return new Tree<>(FAIL(right));
+ return new Tree<>(Node.FAIL(right));
} else if (right.type == INT && left.type != INT) {
Errors.inst.printError(EK_EVAL_MISMATH);
- return new Tree<>(FAIL(left));
+ return new Tree<>(Node.FAIL(left));
} else if (right.type == FLOAT && left.type != FLOAT) {
Errors.inst.printError(EK_EVAL_MISMATH);
- return new Tree<>(FAIL(left));
+ return new Tree<>(Node.FAIL(left));
} else if (right.type == DICE && left.type != DICE) {
Errors.inst.printError(EK_EVAL_MISMATH);
- return new Tree<>(FAIL(left));
+ return new Tree<>(Node.FAIL(left));
}
EvaluatorResult res = null;
@@ -470,10 +448,10 @@ public class Evaluator {
} else if (left.type == DICE) {
if (left.diceVal.isList) {
Errors.inst.printError(EK_EVAL_INVDICE, left.toString());
- return new Tree<>(FAIL(left));
+ return new Tree<>(Node.FAIL(left));
} else if (right.diceVal.isList) {
Errors.inst.printError(EK_EVAL_INVDICE, right.toString());
- return new Tree<>(FAIL(right));
+ return new Tree<>(Node.FAIL(right));
}
res = new EvaluatorResult(DICE, new MathDie(MathDie.MathOp.ADD, left.diceVal.scalar,
@@ -490,10 +468,10 @@ public class Evaluator {
} else if (left.type == DICE) {
if (left.diceVal.isList) {
Errors.inst.printError(EK_EVAL_INVDICE, left.toString());
- return new Tree<>(FAIL(left));
+ return new Tree<>(Node.FAIL(left));
} else if (right.diceVal.isList) {
Errors.inst.printError(EK_EVAL_INVDICE, right.toString());
- return new Tree<>(FAIL(right));
+ return new Tree<>(Node.FAIL(right));
}
res = new EvaluatorResult(DICE, new MathDie(MathDie.MathOp.SUBTRACT,
@@ -510,10 +488,10 @@ public class Evaluator {
} else if (left.type == DICE) {
if (left.diceVal.isList) {
Errors.inst.printError(EK_EVAL_INVDICE, left.toString());
- return new Tree<>(FAIL(left));
+ return new Tree<>(Node.FAIL(left));
} else if (right.diceVal.isList) {
Errors.inst.printError(EK_EVAL_INVDICE, right.toString());
- return new Tree<>(FAIL(right));
+ return new Tree<>(Node.FAIL(right));
}
res = new EvaluatorResult(DICE, new MathDie(MathDie.MathOp.MULTIPLY,
@@ -541,7 +519,7 @@ public class Evaluator {
}
} else {
Errors.inst.printError(EK_EVAL_DIVDICE);
- return new Tree<>(FAIL());
+ return new Tree<>(Node.FAIL());
}
break;
@@ -563,14 +541,14 @@ public class Evaluator {
}
} else {
Errors.inst.printError(EK_EVAL_DIVDICE);
- return new Tree<>(FAIL());
+ return new Tree<>(Node.FAIL());
}
break;
default:
Errors.inst.printError(EK_EVAL_UNMATH, op.toString());
- return new Tree<>(FAIL());
+ return new Tree<>(Node.FAIL());
}
return new Tree<>(new Node(Node.Type.RESULT, res));
diff --git a/base/src/bjc/dicelang/Node.java b/base/src/bjc/dicelang/Node.java
index 4238cfc..746ba34 100644
--- a/base/src/bjc/dicelang/Node.java
+++ b/base/src/bjc/dicelang/Node.java
@@ -1,5 +1,9 @@
package bjc.dicelang;
+import static bjc.dicelang.EvaluatorResult.Type.FAILURE;
+
+import bjc.utils.data.ITree;
+
/*
* @TODO 10/09/17 Ben Culkin :NodeReorg
* Same thing, different class. Split into subclasses based off of the type
@@ -102,4 +106,25 @@ public class Node {
public int hashCode() {
return super.hashCode();
}
+
+ static Node FAIL(final EvaluatorResult res) {
+ EvaluatorResult eres = new EvaluatorResult(FAILURE, new Node(Type.RESULT, res));
+ return new Node(Type.RESULT, eres);
+ }
+
+ static Node FAIL(final Node orig) {
+ return new Node(Type.RESULT, new EvaluatorResult(FAILURE, orig));
+ }
+
+ static Node FAIL(final ITree<Node> orig) {
+ return new Node(Type.RESULT, new EvaluatorResult(FAILURE, orig));
+ }
+
+ /* @TODO 10/09/17 Ben Culkin :NodeFAIL
+ * These methods should be moved to Node.
+ */
+ /* Create a failing node. */
+ static Node FAIL() {
+ return new Node(Type.RESULT, new EvaluatorResult(FAILURE));
+ }
}
diff --git a/base/src/bjc/dicelang/scl/SCLToken.java b/base/src/bjc/dicelang/scl/SCLToken.java
new file mode 100644
index 0000000..a3226e2
--- /dev/null
+++ b/base/src/bjc/dicelang/scl/SCLToken.java
@@ -0,0 +1,161 @@
+package bjc.dicelang.scl;
+
+import static bjc.dicelang.Errors.ErrorKey.EK_SCL_INVTOKEN;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import bjc.dicelang.Errors;
+import bjc.utils.funcdata.IList;
+import bjc.utils.parserutils.TokenUtils;
+
+import static bjc.dicelang.scl.SCLToken.Type.*;
+
+/*
+ * @TODO 10/08/17 Ben Culkin :TokenSplit
+ * Again with the multiple subclasses in one class. Split it so
+ * that each subclass only has the fields it needs.
+ */
+public class SCLToken {
+ public static enum Type {
+ /* Natural tokens. These come directly from strings */
+ ILIT, FLIT, BLIT, SQUOTE, DQUOTE, OBRACKET, OBRACE, SYMBOL, WORD,
+
+ /* Synthetic tokens. These are produced from special tokens. */
+ SLIT, WORDS, ARRAY,
+
+ /* Word tokens These are subordinate to WORD tokens */
+ /*
+ * @NOTE These should really be in their own enum.
+ */
+ /* Array manipulation */
+ MAKEARRAY, MAKEEXEC, MAKEUNEXEC,
+ /* Stream manipulation */
+ NEWSTREAM, LEFTSTREAM, RIGHTSTREAM, DELETESTREAM, MERGESTREAM,
+ /* Stack manipulation */
+ STACKCOUNT, STACKEMPTY, DROP, NDROP, NIP, NNIP,
+ }
+
+ /* The type of this token */
+ public SCLToken.Type type;
+
+ /* Used for ILIT */
+ public long intVal;
+ /* Used for FLIT */
+ public double floatVal;
+ /* Used for BLIT */
+ public boolean boolVal;
+ /* Used for SYMBOL & SLIT */
+ public String stringVal;
+ /* Used for WORD */
+ public SCLToken tokenVal;
+ /* Used for WORDS & ARRAY */
+ public IList<SCLToken> tokenVals;
+
+ /* Create a new token. */
+ public SCLToken(final SCLToken.Type typ) {
+ type = typ;
+ }
+
+ /* Create a new token. */
+ public SCLToken(final SCLToken.Type typ, final long iVal) {
+ this(typ);
+
+ intVal = iVal;
+ }
+
+ /* Create a new token. */
+ public SCLToken(final SCLToken.Type typ, final double dVal) {
+ this(typ);
+
+ floatVal = dVal;
+ }
+
+ /* Create a new token. */
+ public SCLToken(final SCLToken.Type typ, final boolean bVal) {
+ this(typ);
+
+ boolVal = bVal;
+ }
+
+ /* Create a new token. */
+ public SCLToken(final SCLToken.Type typ, final String sVal) {
+ this(typ);
+
+ stringVal = sVal;
+ }
+
+ /* Create a new token. */
+ public SCLToken(final SCLToken.Type typ, final SCLToken tVal) {
+ this(typ);
+
+ tokenVal = tVal;
+ }
+
+ /* Create a new token. */
+ public SCLToken(final SCLToken.Type typ, final SCLToken.Type tVal) {
+ this(typ, new SCLToken(tVal));
+ }
+
+ /* Create a new token. */
+ public SCLToken(final SCLToken.Type typ, final IList<SCLToken> tVals) {
+ this(typ);
+
+ tokenVals = tVals;
+ }
+
+ /* Convert a string into a token. */
+ public static SCLToken tokenizeString(final String token) {
+ if (litTokens.containsKey(token)) {
+ return new SCLToken(litTokens.get(token));
+ } else if (token.startsWith("\\")) {
+ return new SCLToken(SYMBOL, token.substring(1));
+ } else if (builtinWords.containsKey(token)) {
+ return new SCLToken(WORD, builtinWords.get(token));
+ } else if (token.equals("true")) {
+ return new SCLToken(BLIT, true);
+ } else if (token.equals("false")) {
+ return new SCLToken(BLIT, false);
+ } else if (TokenUtils.isInt(token)) {
+ return new SCLToken(ILIT, Long.parseLong(token));
+ } else if (TokenUtils.isDouble(token)) {
+ return new SCLToken(FLIT, Double.parseDouble(token));
+ } else {
+ Errors.inst.printError(EK_SCL_INVTOKEN, token);
+ return null;
+ }
+ }
+
+ /* The literal tokens. */
+ private static final Map<String, SCLToken.Type> litTokens;
+ /* The builtin words. */
+ private static final Map<String, SCLToken.Type> builtinWords;
+
+ static {
+ /* Init literal tokens. */
+ litTokens = new HashMap<>();
+
+ litTokens.put("'", SQUOTE);
+ litTokens.put("\"", DQUOTE);
+ litTokens.put("[", OBRACKET);
+ litTokens.put("{", OBRACE);
+
+ /* Init builtin words. */
+ builtinWords = new HashMap<>();
+
+ builtinWords.put("makearray", MAKEARRAY);
+ builtinWords.put("+stream", NEWSTREAM);
+ builtinWords.put(">stream", LEFTSTREAM);
+ builtinWords.put("<stream", RIGHTSTREAM);
+ builtinWords.put("-stream", DELETESTREAM);
+ builtinWords.put("<-stream", MERGESTREAM);
+ builtinWords.put("cvx", MAKEEXEC);
+ builtinWords.put("cvux", MAKEUNEXEC);
+ builtinWords.put("#", STACKCOUNT);
+ builtinWords.put("empty?", STACKEMPTY);
+ builtinWords.put("drop", DROP);
+ builtinWords.put("ndrop", NDROP);
+ builtinWords.put("nip", NIP);
+ builtinWords.put("nnip", NNIP);
+ }
+} \ No newline at end of file
diff --git a/base/src/bjc/dicelang/scl/StreamControlConsole.java b/base/src/bjc/dicelang/scl/StreamControlConsole.java
index 649c6fa..78b1d49 100644
--- a/base/src/bjc/dicelang/scl/StreamControlConsole.java
+++ b/base/src/bjc/dicelang/scl/StreamControlConsole.java
@@ -3,11 +3,8 @@ package bjc.dicelang.scl;
import bjc.utils.funcdata.FunctionalList;
import bjc.utils.funcdata.IList;
-import java.util.Iterator;
import java.util.Scanner;
-import java.util.function.Supplier;
-
/**
* Implement a SCL REPL
*
@@ -71,5 +68,7 @@ public class StreamControlConsole {
System.out.print("Command string executed succesfully.\n\n");
System.out.print("Enter a SCL command string (blank to exit): ");
}
+
+ scn.close();
}
}
diff --git a/base/src/bjc/dicelang/scl/StreamControlEngine.java b/base/src/bjc/dicelang/scl/StreamControlEngine.java
index d5e8b72..ec0f706 100644
--- a/base/src/bjc/dicelang/scl/StreamControlEngine.java
+++ b/base/src/bjc/dicelang/scl/StreamControlEngine.java
@@ -11,7 +11,7 @@ import bjc.utils.funcdata.IList;
import bjc.utils.parserutils.TokenUtils;
import static bjc.dicelang.Errors.ErrorKey.*;
-import static bjc.dicelang.scl.StreamControlEngine.Token.Type.*;
+import static bjc.dicelang.scl.SCLToken.Type.*;
/*
* @TODO 10/08/17 Ben Culkin :SCLReorg
@@ -27,164 +27,14 @@ import static bjc.dicelang.scl.StreamControlEngine.Token.Type.*;
* @author Ben Culkin
*/
public class StreamControlEngine {
- /*
- * @TODO 10/08/17 Ben Culkin :TokenSplit
- * Again with the multiple subclasses in one class. Split it so
- * that each subclass only has the fields it needs.
- */
- public static class Token {
- public static enum Type {
- /* Natural tokens. These come directly from strings */
- ILIT, FLIT, BLIT, SQUOTE, DQUOTE, OBRACKET, OBRACE, SYMBOL, WORD,
-
- /* Synthetic tokens. These are produced from special tokens. */
- SLIT, WORDS, ARRAY,
-
- /* Word tokens These are subordinate to WORD tokens */
- /*
- * @NOTE
- * These should really be in their own enum.
- */
- /* Array manipulation */
- MAKEARRAY, MAKEEXEC, MAKEUNEXEC,
- /* Stream manipulation */
- NEWSTREAM, LEFTSTREAM, RIGHTSTREAM, DELETESTREAM, MERGESTREAM,
- /* Stack manipulation */
- STACKCOUNT, STACKEMPTY, DROP, NDROP, NIP, NNIP,
- }
-
- /* The type of this token */
- public Type type;
-
- /* Used for ILIT */
- public long intVal;
- /* Used for FLIT */
- public double floatVal;
- /* Used for BLIT */
- public boolean boolVal;
- /* Used for SYMBOL & SLIT */
- public String stringVal;
- /* Used for WORD */
- public Token tokenVal;
- /* Used for WORDS & ARRAY */
- public IList<Token> tokenVals;
-
- /* Create a new token. */
- public Token(final Type typ) {
- type = typ;
- }
-
- /* Create a new token. */
- public Token(final Type typ, final long iVal) {
- this(typ);
-
- intVal = iVal;
- }
-
- /* Create a new token. */
- public Token(final Type typ, final double dVal) {
- this(typ);
-
- floatVal = dVal;
- }
-
- /* Create a new token. */
- public Token(final Type typ, final boolean bVal) {
- this(typ);
-
- boolVal = bVal;
- }
-
- /* Create a new token. */
- public Token(final Type typ, final String sVal) {
- this(typ);
-
- stringVal = sVal;
- }
-
- /* Create a new token. */
- public Token(final Type typ, final Token tVal) {
- this(typ);
-
- tokenVal = tVal;
- }
-
- /* Create a new token. */
- public Token(final Type typ, final Token.Type tVal) {
- this(typ, new Token(tVal));
- }
-
- /* Create a new token. */
- public Token(final Type typ, final IList<Token> tVals) {
- this(typ);
-
- tokenVals = tVals;
- }
-
- /* Convert a string into a token. */
- public static Token tokenizeString(final String token) {
- if (litTokens.containsKey(token)) {
- return new Token(litTokens.get(token));
- } else if (token.startsWith("\\")) {
- return new Token(SYMBOL, token.substring(1));
- } else if (builtinWords.containsKey(token)) {
- return new Token(WORD, builtinWords.get(token));
- } else if (token.equals("true")) {
- return new Token(BLIT, true);
- } else if (token.equals("false")) {
- return new Token(BLIT, false);
- } else if (TokenUtils.isInt(token)) {
- return new Token(ILIT, Long.parseLong(token));
- } else if (TokenUtils.isDouble(token)) {
- return new Token(FLIT, Double.parseDouble(token));
- } else {
- Errors.inst.printError(EK_SCL_INVTOKEN, token);
- return null;
- }
- }
-
- /* The literal tokens. */
- private static final Map<String, Token.Type> litTokens;
- /* The builtin words. */
- private static final Map<String, Token.Type> builtinWords;
-
- static {
- /* Init literal tokens. */
- litTokens = new HashMap<>();
-
- litTokens.put("'", SQUOTE);
- litTokens.put("\"", DQUOTE);
- litTokens.put("[", OBRACKET);
- litTokens.put("{", OBRACE);
-
- /* Init builtin words. */
- builtinWords = new HashMap<>();
-
- builtinWords.put("makearray", MAKEARRAY);
- builtinWords.put("+stream", NEWSTREAM);
- builtinWords.put(">stream", LEFTSTREAM);
- builtinWords.put("<stream", RIGHTSTREAM);
- builtinWords.put("-stream", DELETESTREAM);
- builtinWords.put("<-stream", MERGESTREAM);
- builtinWords.put("cvx", MAKEEXEC);
- builtinWords.put("cvux", MAKEUNEXEC);
- builtinWords.put("#", STACKCOUNT);
- builtinWords.put("empty?", STACKEMPTY);
- builtinWords.put("drop", DROP);
- builtinWords.put("ndrop", NDROP);
- builtinWords.put("nip", NIP);
- builtinWords.put("nnip", NNIP);
- }
- }
-
/* The stream engine we're hooked to. */
private final StreamEngine eng;
/* The current stack state. */
- private final Stack<Token> curStack;
+ private final Stack<SCLToken> curStack;
/* Map of user defined words. */
- private final Map<String, Token> words;
+ private final Map<String, SCLToken> words;
/**
* Create a new stream control engine.
@@ -211,7 +61,7 @@ public class StreamControlEngine {
for (int i = 0; i < tokens.length; i++) {
/* Tokenize each token. */
final String token = tokens[i];
- final Token tok = Token.tokenizeString(token);
+ final SCLToken tok = SCLToken.tokenizeString(token);
if (tok == null) {
System.out.printf("ERROR: Tokenization failed for '%s'\n", token);
@@ -240,8 +90,8 @@ public class StreamControlEngine {
if (i == -1) {
return false;
}
- final Token brak = curStack.pop();
- curStack.push(new Token(ARRAY, brak.tokenVals));
+ final SCLToken brak = curStack.pop();
+ curStack.push(new SCLToken(ARRAY, brak.tokenVals));
break;
case WORD:
@@ -260,7 +110,7 @@ public class StreamControlEngine {
return true;
}
- private boolean handleWord(final Token tk) {
+ private boolean handleWord(final SCLToken tk) {
boolean succ = true;
/* Handle each type of word. */
@@ -316,10 +166,10 @@ public class StreamControlEngine {
}
break;
case STACKCOUNT:
- curStack.push(new Token(ILIT, curStack.size()));
+ curStack.push(new SCLToken(ILIT, curStack.size()));
break;
case STACKEMPTY:
- curStack.push(new Token(BLIT, curStack.empty()));
+ curStack.push(new SCLToken(BLIT, curStack.empty()));
break;
case DROP:
if (curStack.size() == 0) {
@@ -357,7 +207,7 @@ public class StreamControlEngine {
/* Handle nipping a specified number of items. */
private boolean handleNNip() {
- final Token num = curStack.pop();
+ final SCLToken num = curStack.pop();
if (num.type != ILIT) {
Errors.inst.printError(EK_SCL_INVARG, num.type.toString());
@@ -377,7 +227,7 @@ public class StreamControlEngine {
/* Handle dropping a specified number of items. */
private boolean handleNDrop() {
- final Token num = curStack.pop();
+ final SCLToken num = curStack.pop();
if (num.type != ILIT) {
Errors.inst.printError(EK_SCL_INVARG, num.type.toString());
@@ -397,7 +247,7 @@ public class StreamControlEngine {
/* Handle toggling the executable flag on an array. */
private boolean toggleExec(final boolean exec) {
- final Token top = curStack.top();
+ final SCLToken top = curStack.top();
if (exec) {
if (top.type != ARRAY) {
@@ -420,26 +270,26 @@ public class StreamControlEngine {
/* Handle creating an array. */
private boolean makeArray() {
- final Token num = curStack.pop();
+ final SCLToken num = curStack.pop();
if (num.type != ILIT) {
Errors.inst.printError(EK_SCL_INVARG, num.type.toString());
}
- final IList<Token> arr = new FunctionalList<>();
+ final IList<SCLToken> arr = new FunctionalList<>();
for (int i = 0; i < num.intVal; i++) {
arr.add(curStack.pop());
}
- curStack.push(new Token(ARRAY, arr));
+ curStack.push(new SCLToken(ARRAY, arr));
return true;
}
/* Handle a delimited series of tokens. */
private int handleDelim(final int i, final String[] tokens, final String delim) {
- final IList<Token> toks = new FunctionalList<>();
+ final IList<SCLToken> toks = new FunctionalList<>();
int n = i + 1;
@@ -451,7 +301,7 @@ public class StreamControlEngine {
String tok = tokens[n];
while (!tok.equals(delim)) {
- final Token ntok = Token.tokenizeString(tok);
+ final SCLToken ntok = SCLToken.tokenizeString(tok);
switch (ntok.type) {
case SQUOTE:
@@ -473,8 +323,8 @@ public class StreamControlEngine {
if (n == -1) {
return -1;
}
- final Token brak = curStack.pop();
- toks.add(new Token(ARRAY, brak.tokenVals));
+ final SCLToken brak = curStack.pop();
+ toks.add(new SCLToken(ARRAY, brak.tokenVals));
break;
default:
toks.add(ntok);
@@ -497,7 +347,7 @@ public class StreamControlEngine {
/* @NOTE
* Instead of being hardcoded, this should be a parameter.
*/
- curStack.push(new Token(WORDS, toks));
+ curStack.push(new SCLToken(WORDS, toks));
return n;
}
@@ -539,7 +389,7 @@ public class StreamControlEngine {
*/
n += 1;
- curStack.push(new Token(SLIT, TokenUtils.descapeString(sb.toString())));
+ curStack.push(new SCLToken(SLIT, TokenUtils.descapeString(sb.toString())));
return n;
}
diff --git a/base/src/bjc/dicelang/scl/StreamEngine.java b/base/src/bjc/dicelang/scl/StreamEngine.java
index 6e970b7..2e0a6d7 100644
--- a/base/src/bjc/dicelang/scl/StreamEngine.java
+++ b/base/src/bjc/dicelang/scl/StreamEngine.java
@@ -1,11 +1,5 @@
package bjc.dicelang.scl;
-import static bjc.dicelang.Errors.ErrorKey.EK_STRM_INVCOM;
-import static bjc.dicelang.Errors.ErrorKey.EK_STRM_LAST;
-import static bjc.dicelang.Errors.ErrorKey.EK_STRM_NONEX;
-
-import static java.util.logging.Level.*;
-
import bjc.dicelang.DiceLangEngine;
import bjc.dicelang.Errors;
import bjc.utils.esodata.SingleTape;
@@ -17,6 +11,8 @@ import bjc.utils.funcutils.ListUtils;
import java.util.Arrays;
+import static bjc.dicelang.Errors.ErrorKey.*;
+
/**
* Implements multiple interleaved parse streams, as well as a command language
* for the streams.