diff options
Diffstat (limited to 'src/main/java')
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 |
