summaryrefslogtreecommitdiff
path: root/dice-lang/src
diff options
context:
space:
mode:
authorbculkin2442 <bjculkin@mix.wvu.edu>2017-02-16 09:56:40 -0500
committerbculkin2442 <bjculkin@mix.wvu.edu>2017-02-16 09:56:40 -0500
commit5fd7a83838f607c3eced0e0b7d97a84f6fb5613e (patch)
treeebc88eadcf46275ea175ae90ab3cb4592c142f4b /dice-lang/src
parentf9752a872ad68a47b872eccb953332d372052cac (diff)
Basic stream commands
Diffstat (limited to 'dice-lang/src')
-rw-r--r--dice-lang/src/bjc/dicelang/v2/Define.java14
-rw-r--r--dice-lang/src/bjc/dicelang/v2/DiceLangConsole.java2
-rw-r--r--dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java38
-rw-r--r--dice-lang/src/bjc/dicelang/v2/StreamEngine.java73
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;
+ }
+}