summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/dicelang
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/bjc/dicelang')
-rw-r--r--src/main/java/bjc/dicelang/scl/StreamControlConsole.java4
-rw-r--r--src/main/java/bjc/dicelang/scl/StreamControlEngine.java6
-rw-r--r--src/main/java/bjc/dicelang/scl/StreamEngine.java39
-rw-r--r--src/main/java/bjc/dicelang/scl/tokens/ArraySCLToken.java4
-rw-r--r--src/main/java/bjc/dicelang/scl/tokens/WordListSCLToken.java6
-rw-r--r--src/main/java/bjc/dicelang/scl/tokens/WordsSCLToken.java4
-rw-r--r--src/main/java/bjc/dicelang/sclv2/SCLEngine.java89
7 files changed, 118 insertions, 34 deletions
diff --git a/src/main/java/bjc/dicelang/scl/StreamControlConsole.java b/src/main/java/bjc/dicelang/scl/StreamControlConsole.java
index ae4dcca..30da717 100644
--- a/src/main/java/bjc/dicelang/scl/StreamControlConsole.java
+++ b/src/main/java/bjc/dicelang/scl/StreamControlConsole.java
@@ -3,7 +3,7 @@ package bjc.dicelang.scl;
import java.util.Scanner;
import bjc.funcdata.FunctionalList;
-import bjc.funcdata.IList;
+import bjc.funcdata.ListEx;
/**
* Implement a SCL REPL
@@ -45,7 +45,7 @@ public class StreamControlConsole {
}
/* Break the token into strings. */
- IList<String> res = new FunctionalList<>();
+ ListEx<String> res = new FunctionalList<>();
String[] tokens = ln.split(" ");
/* Run the stream engine on the tokens. */
diff --git a/src/main/java/bjc/dicelang/scl/StreamControlEngine.java b/src/main/java/bjc/dicelang/scl/StreamControlEngine.java
index 5637962..b0f4eb3 100644
--- a/src/main/java/bjc/dicelang/scl/StreamControlEngine.java
+++ b/src/main/java/bjc/dicelang/scl/StreamControlEngine.java
@@ -29,7 +29,7 @@ import bjc.dicelang.scl.tokens.WordsSCLToken;
import bjc.esodata.SimpleStack;
import bjc.esodata.Stack;
import bjc.funcdata.FunctionalList;
-import bjc.funcdata.IList;
+import bjc.funcdata.ListEx;
import bjc.utils.parserutils.TokenUtils;
/*
@@ -340,7 +340,7 @@ public class StreamControlEngine {
Errors.inst.printError(EK_SCL_INVARG, num.type.toString());
}
- final IList<SCLToken> arr = new FunctionalList<>();
+ final ListEx<SCLToken> arr = new FunctionalList<>();
for (int i = 0; i < ((IntSCLToken) num).intVal; i++) {
arr.add(curStack.pop());
@@ -353,7 +353,7 @@ public class StreamControlEngine {
/* Handle a delimited series of tokens. */
private boolean handleDelim(final Iterator<String> tokens, final String delim) {
- final IList<SCLToken> toks = new FunctionalList<>();
+ final ListEx<SCLToken> toks = new FunctionalList<>();
if (!tokens.hasNext()) {
Errors.inst.printError(EK_SCL_MMQUOTE, delim);
diff --git a/src/main/java/bjc/dicelang/scl/StreamEngine.java b/src/main/java/bjc/dicelang/scl/StreamEngine.java
index 4f2e0b8..c153158 100644
--- a/src/main/java/bjc/dicelang/scl/StreamEngine.java
+++ b/src/main/java/bjc/dicelang/scl/StreamEngine.java
@@ -1,19 +1,13 @@
package bjc.dicelang.scl;
-import static bjc.dicelang.scl.Errors.ErrorKey.EK_STRM_INVCOM;
-import static bjc.dicelang.scl.Errors.ErrorKey.EK_STRM_LAST;
-import static bjc.dicelang.scl.Errors.ErrorKey.EK_STRM_NONEX;
+import static bjc.dicelang.scl.Errors.ErrorKey.*;
-import java.util.Arrays;
-import java.util.function.Predicate;
+import java.util.*;
+import java.util.function.*;
-import bjc.esodata.SingleTape;
-import bjc.esodata.Tape;
-import bjc.funcdata.FunctionalList;
-import bjc.funcdata.FunctionalMap;
-import bjc.funcdata.IList;
-import bjc.funcdata.IMap;
-import bjc.utils.funcutils.ListUtils;
+import bjc.esodata.*;
+import bjc.funcdata.*;
+import bjc.utils.funcutils.*;
/**
* Implements multiple interleaved parse streams, as well as a command language
@@ -31,8 +25,8 @@ public class StreamEngine {
public final boolean debug = true;
/* Our streams. */
- private Tape<IList<String>> streams;
- private IList<String> currStream;
+ private Tape<ListEx<String>> streams;
+ private ListEx<String> currStream;
/* Saved streams */
//private Map<String, IList<String>> savedStreams;
@@ -40,7 +34,7 @@ public class StreamEngine {
/* Handler for SCL programs */
private final StreamControlEngine scleng;
- private static IMap<Character, Predicate<StreamEngine>> commands;
+ private static MapEx<Character, Predicate<StreamEngine>> commands;
static {
commands = new FunctionalMap<>();
@@ -96,7 +90,7 @@ public class StreamEngine {
*
* @return Whether or not the streams were successfully processed.
*/
- public boolean doStreams(final String[] toks, final IList<String> dest) {
+ public boolean doStreams(final String[] toks, final ListEx<String> dest) {
return doStreams(Arrays.asList(toks), dest);
}
@@ -111,7 +105,7 @@ public class StreamEngine {
*
* @return Whether or not the streams were successfully processed.
*/
- public boolean doStreams(final Iterable<String> toks, final IList<String> dest) {
+ public boolean doStreams(final Iterable<String> toks, final ListEx<String> dest) {
/* Initialize per-run state. */
init();
@@ -216,7 +210,7 @@ public class StreamEngine {
return false;
}
- final IList<String> stringLit = streams.remove();
+ final ListEx<String> stringLit = streams.remove();
currStream = streams.item();
final String merg = ListUtils.collapseTokens(stringLit, "");
@@ -252,11 +246,12 @@ public class StreamEngine {
/* Process each command. */
for(final char comm : comms) {
- boolean succ = commands.getOrDefault(comm, (eng) -> {
- Errors.inst.printError(EK_STRM_INVCOM, tk);
+ boolean succ = commands.get(comm)
+ .orElseGet(() -> (eng) -> {
+ Errors.inst.printError(EK_STRM_INVCOM, tk);
- return false;
- }).test(this);
+ return false;
+ }).test(this);
if(!succ) return false;
}
diff --git a/src/main/java/bjc/dicelang/scl/tokens/ArraySCLToken.java b/src/main/java/bjc/dicelang/scl/tokens/ArraySCLToken.java
index 17c76a3..577d883 100644
--- a/src/main/java/bjc/dicelang/scl/tokens/ArraySCLToken.java
+++ b/src/main/java/bjc/dicelang/scl/tokens/ArraySCLToken.java
@@ -1,6 +1,6 @@
package bjc.dicelang.scl.tokens;
-import bjc.funcdata.IList;
+import bjc.funcdata.ListEx;
/**
* Represents an array token.
@@ -16,7 +16,7 @@ public class ArraySCLToken extends WordListSCLToken {
* @param tokens
* The tokens in the array.
*/
- public ArraySCLToken(IList<SCLToken> tokens) {
+ public ArraySCLToken(ListEx<SCLToken> tokens) {
super(true, tokens);
}
diff --git a/src/main/java/bjc/dicelang/scl/tokens/WordListSCLToken.java b/src/main/java/bjc/dicelang/scl/tokens/WordListSCLToken.java
index 123e11d..3f4db1e 100644
--- a/src/main/java/bjc/dicelang/scl/tokens/WordListSCLToken.java
+++ b/src/main/java/bjc/dicelang/scl/tokens/WordListSCLToken.java
@@ -1,6 +1,6 @@
package bjc.dicelang.scl.tokens;
-import bjc.funcdata.IList;
+import bjc.funcdata.ListEx;
/**
* Represents a list of words.
@@ -12,7 +12,7 @@ public abstract class WordListSCLToken extends SCLToken {
/**
* The list of words.
*/
- public IList<SCLToken> tokenVals;
+ public ListEx<SCLToken> tokenVals;
/**
* Create a new word-list token.
@@ -22,7 +22,7 @@ public abstract class WordListSCLToken extends SCLToken {
* @param tokens
* The tokens in the array.
*/
- protected WordListSCLToken(boolean isArray, IList<SCLToken> tokens) {
+ protected WordListSCLToken(boolean isArray, ListEx<SCLToken> tokens) {
if (isArray) {
type = TokenType.ARRAY;
} else {
diff --git a/src/main/java/bjc/dicelang/scl/tokens/WordsSCLToken.java b/src/main/java/bjc/dicelang/scl/tokens/WordsSCLToken.java
index dc1d7d3..6520bf9 100644
--- a/src/main/java/bjc/dicelang/scl/tokens/WordsSCLToken.java
+++ b/src/main/java/bjc/dicelang/scl/tokens/WordsSCLToken.java
@@ -1,6 +1,6 @@
package bjc.dicelang.scl.tokens;
-import bjc.funcdata.IList;
+import bjc.funcdata.ListEx;
/**
* A token representing an executable bunch of words.
@@ -16,7 +16,7 @@ public class WordsSCLToken extends WordListSCLToken {
* @param tokens
* The tokens to use.
*/
- public WordsSCLToken(IList<SCLToken> tokens) {
+ public WordsSCLToken(ListEx<SCLToken> tokens) {
super(false, tokens);
}
diff --git a/src/main/java/bjc/dicelang/sclv2/SCLEngine.java b/src/main/java/bjc/dicelang/sclv2/SCLEngine.java
new file mode 100644
index 0000000..8781456
--- /dev/null
+++ b/src/main/java/bjc/dicelang/sclv2/SCLEngine.java
@@ -0,0 +1,89 @@
+package bjc.dicelang.sclv2;
+
+import java.util.*;
+
+import bjc.esodata.*;
+
+/**
+ * Engine for running SCL.
+ *
+ * Not threadsafe.
+ *
+ * @author Ben Culkin
+ */
+public class SCLEngine
+{
+ private TapeLibrary<Deque<String>> streams;
+ private Deque<String> currentStream;
+
+// private Map<String, Deque<String>> streamLibrary;
+
+ private boolean inQuoteMode;
+
+ /**
+ * Create a new SCL engine.
+ */
+ public SCLEngine()
+ {
+ reinit();
+ }
+
+ /**
+ * Reinitialize this engine, as if it was newly constructed.
+ */
+ public void reinit()
+ {
+ streams = new TapeLibrary<>();
+ streams.setAllowAutoCreation(true);
+ streams.mountTape("default");
+
+// streamLibrary = new HashMap<>();
+
+ currentStream = new ArrayDeque<>();
+ streams.item(currentStream);
+
+ inQuoteMode = false;
+ }
+
+ /**
+ * Run the engine on a given set of input.
+ *
+ * @param input
+ * The source of input to use.
+ *
+ * @return The stream that was active at the end of the input.
+ */
+ public Deque<String> run(Iterator<String> input)
+ {
+ while (input.hasNext())
+ {
+ String token = input.next();
+
+ if (inQuoteMode)
+ {
+
+ if (token.equalsIgnoreCase("{@SQ}")) inQuoteMode = true;
+ else if (token.equalsIgnoreCase("{@SU}")) inQuoteMode = false;
+ else currentStream.add(token);
+ } else
+ {
+ if (token.startsWith("{@S") && token.endsWith("}"))
+ {
+ String[] commands = token.substring(3, token.length()).split(";");
+ for (String command : commands) {
+ switch (command)
+ {
+ default:
+ // Unknown command; need to handle it
+ }
+ }
+ } else
+ {
+ currentStream.add(token);
+ }
+ }
+ }
+
+ return currentStream;
+ }
+} \ No newline at end of file