diff options
Diffstat (limited to 'dice-lang/src')
| -rw-r--r-- | dice-lang/src/bjc/dicelang/v2/Define.java | 14 | ||||
| -rw-r--r-- | dice-lang/src/bjc/dicelang/v2/DiceLangConsole.java | 2 | ||||
| -rw-r--r-- | dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java | 38 | ||||
| -rw-r--r-- | dice-lang/src/bjc/dicelang/v2/StreamEngine.java | 73 |
4 files changed, 115 insertions, 12 deletions
diff --git a/dice-lang/src/bjc/dicelang/v2/Define.java b/dice-lang/src/bjc/dicelang/v2/Define.java index 4617931..6ca0c74 100644 --- a/dice-lang/src/bjc/dicelang/v2/Define.java +++ b/dice-lang/src/bjc/dicelang/v2/Define.java @@ -12,16 +12,16 @@ public class Define implements UnaryOperator<String> { LINE, TOKEN } - int priority; + public final int priority; - boolean doRecur; - boolean subType; + private boolean doRecur; + private boolean subType; - Pattern predicate; - Pattern searcher; + private Pattern predicate; + private Pattern searcher; - Iterator<String> replacers; - String replacer; + private Iterator<String> replacers; + private String replacer; public Define(int priorty, boolean isSub, boolean recur, String predicte, String searchr, Iterable<String> replacrs) { diff --git a/dice-lang/src/bjc/dicelang/v2/DiceLangConsole.java b/dice-lang/src/bjc/dicelang/v2/DiceLangConsole.java index b3b5c08..5460286 100644 --- a/dice-lang/src/bjc/dicelang/v2/DiceLangConsole.java +++ b/dice-lang/src/bjc/dicelang/v2/DiceLangConsole.java @@ -58,7 +58,7 @@ public class DiceLangConsole { private boolean handlePragma(String pragma) { System.out.println("\tRaw pragma: " + pragma); - switch(pragma) { + switch(pragma.substring(0, pragma.indexOf(' '))) { case "debug": System.out.println("\tDebug mode is now " + eng.toggleDebug()); break; diff --git a/dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java b/dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java index 455e5d2..db471c2 100644 --- a/dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java +++ b/dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java @@ -11,6 +11,7 @@ import bjc.utils.funcutils.ListUtils; import bjc.utils.funcutils.StringUtils; import java.util.Arrays; +import java.util.Comparator; import java.util.Deque; import java.util.List; import java.util.LinkedList; @@ -50,6 +51,8 @@ public class DiceLangEngine { // Are defns sorted by priority private boolean defnsSorted; + private StreamEngine streamEng; + private final int MATH_PREC = 20; private final int DICE_PREC = 10; private final int EXPR_PREC = 0; @@ -98,10 +101,15 @@ public class DiceLangEngine { debugMode = true; postfixMode = false; + + streamEng = new StreamEngine(this); } public void sortDefns() { + Comparator<Define> defnCmp = (dfn1, dfn2) -> dfn1.priority - dfn2.priority; + lineDefns.sort(defnCmp); + tokenDefns.sort(defnCmp); defnsSorted = true; } @@ -148,9 +156,25 @@ public class DiceLangEngine { // Sort the defines if they aren't sorted if(!defnsSorted) sortDefns(); + IList<String> streamToks = new FunctionalList<>(); + boolean success = streamEng.doStreams(command.split(" "), streamToks); + if(!success) return false; + + String newComm = ListUtils.collapseTokens(streamToks, " "); + + if(debugMode) + System.out.println("\tCommand after stream commands: " + newComm); + + for(Define dfn : lineDefns.toIterable()) { + newComm = dfn.apply(newComm); + } + + if(debugMode) + System.out.println("\tCommand after line defines: " + newComm); + IMap<String, String> stringLiterals = new FunctionalMap<>(); - Matcher quoteMatcher = quotePattern.matcher(command); + Matcher quoteMatcher = quotePattern.matcher(newComm); StringBuffer destringedCommand = new StringBuffer(); while(quoteMatcher.find()) { @@ -183,14 +207,20 @@ public class DiceLangEngine { IList<String> semiExpandedTokens = deaffixTokens(tokens, deaffixationList); IList<String> fullyExpandedTokens = deaffixTokens(semiExpandedTokens, opExpansionList); - if(debugMode) { + if(debugMode) System.out.printf("\tCommand after token expansion: " + fullyExpandedTokens.toString() + "\n"); - } + IList<Token> lexedTokens = new FunctionalList<>(); for(String token : fullyExpandedTokens.toIterable()) { + String newTok = token; + + for(Define dfn : tokenDefns.toIterable()) { + newTok = dfn.apply(newTok); + } + Token tk = lexToken(token, stringLiterals); if(tk == null) continue; @@ -205,7 +235,7 @@ public class DiceLangEngine { if(!postfixMode) { shuntedTokens = new FunctionalList<>(); - boolean success = shunt.shuntTokens(lexedTokens, shuntedTokens); + success = shunt.shuntTokens(lexedTokens, shuntedTokens); if(!success) return false; } diff --git a/dice-lang/src/bjc/dicelang/v2/StreamEngine.java b/dice-lang/src/bjc/dicelang/v2/StreamEngine.java new file mode 100644 index 0000000..c17abe4 --- /dev/null +++ b/dice-lang/src/bjc/dicelang/v2/StreamEngine.java @@ -0,0 +1,73 @@ +package bjc.dicelang.v2; + +import bjc.utils.funcdata.FunctionalList; +import bjc.utils.funcdata.IList; +import bjc.utils.esodata.Tape; + +public class StreamEngine { + private DiceLangEngine eng; + + private Tape<IList<String>> streams; + private IList<String> currStream; + + public StreamEngine(DiceLangEngine eng) { + streams = new Tape<>(); + + currStream = new FunctionalList<>(); + streams.append(currStream); + } + + public boolean doStreams(String[] toks, IList<String> dest) { + for(String tk : toks) { + if(tk.startsWith("{@")) { + if(!processCommand(tk)) return false; + } else { + currStream.add(tk); + } + } + + for(String tk : currStream.toIterable()) { + dest.add(tk); + } + + return true; + } + + private boolean processCommand(String tk) { + switch(tk.charAt(2)) { + case '+': + streams.append(new FunctionalList<>()); + break; + case '>': + if(!streams.right()) { + System.out.println("\tERROR: Attempted to switch to non-existent stream"); + return false; + } + + currStream = streams.item(); + break; + case '<': + if(!streams.left()) { + System.out.println("\tERROR: Attempted to switch to non-existent stream"); + return false; + } + + currStream = streams.item(); + break; + case '-': + if(streams.size() == 1) { + System.out.println("\tERROR: Cannot delete last stream"); + return false; + } else { + streams.remove(); + currStream = streams.item(); + } + break; + default: + System.out.println("\tERROR: Unknown stream control command: " + tk); + return false; + } + + return true; + } +} |
