summaryrefslogtreecommitdiff
path: root/dice-lang/src
diff options
context:
space:
mode:
authorbculkin2442 <bjculkin@mix.wvu.edu>2017-02-09 13:08:05 -0500
committerbculkin2442 <bjculkin@mix.wvu.edu>2017-02-09 13:08:05 -0500
commitb3be3b131a76d529d4974124d6b4d37fa30c670e (patch)
tree37779a971f65898a9affe498349456bdfea3f7e7 /dice-lang/src
parent186b9131d46d886c98316e5b582e0cdd734a5024 (diff)
Start on dice-lang rewrite. Yay for destringing commands
Diffstat (limited to 'dice-lang/src')
-rw-r--r--dice-lang/src/bjc/dicelang/examples/.DiceExpressionPreparer.java.swpbin0 -> 12288 bytes
-rw-r--r--dice-lang/src/bjc/dicelang/v2/.DiceLangEngine.java.swpbin0 -> 12288 bytes
-rw-r--r--dice-lang/src/bjc/dicelang/v2/DiceLangConsole.java50
-rw-r--r--dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java116
4 files changed, 166 insertions, 0 deletions
diff --git a/dice-lang/src/bjc/dicelang/examples/.DiceExpressionPreparer.java.swp b/dice-lang/src/bjc/dicelang/examples/.DiceExpressionPreparer.java.swp
new file mode 100644
index 0000000..04eb9f7
--- /dev/null
+++ b/dice-lang/src/bjc/dicelang/examples/.DiceExpressionPreparer.java.swp
Binary files differ
diff --git a/dice-lang/src/bjc/dicelang/v2/.DiceLangEngine.java.swp b/dice-lang/src/bjc/dicelang/v2/.DiceLangEngine.java.swp
new file mode 100644
index 0000000..46cc355
--- /dev/null
+++ b/dice-lang/src/bjc/dicelang/v2/.DiceLangEngine.java.swp
Binary files differ
diff --git a/dice-lang/src/bjc/dicelang/v2/DiceLangConsole.java b/dice-lang/src/bjc/dicelang/v2/DiceLangConsole.java
new file mode 100644
index 0000000..741d6f5
--- /dev/null
+++ b/dice-lang/src/bjc/dicelang/v2/DiceLangConsole.java
@@ -0,0 +1,50 @@
+package bjc.dicelang.examples.v2;
+
+import java.util.Scanner;
+
+public class DiceLangConsole {
+ private int commandNumber;
+
+ private DiceLangEngine eng;
+
+ public DiceLangConsole(String[] args) {
+ // @TODO do something with the args
+
+ commandNumber = 0;
+
+ eng = new DiceLangEngine();
+ }
+
+ public void run() {
+ System.out.println("dice-lang v0.2");
+
+ Scanner scn = new Scanner(System.in);
+
+ System.out.printf("(%d) dice-lang> ", commandNumber);
+ String comm = scn.nextLine();
+
+ while(!comm.equals("quit")) {
+ System.out.printf("\tRaw command: %s\n", comm);
+
+ boolean success = eng.runCommand(comm);
+
+ if(success)
+ System.out.println("Command completed succesfully");
+ else
+ System.out.println("Command execution failed");
+
+ commandNumber += 1;
+
+ System.out.printf("(%d) dice-lang> ", commandNumber);
+ String comm = scn.nextLine();
+ }
+
+ scn.close();
+ }
+
+ public static void main(String[] args) {
+ DiceLangConsole console = new DiceLangConsole(args);
+
+ console.run();
+ }
+}
diff --git a/dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java b/dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java
new file mode 100644
index 0000000..a5a9ca4
--- /dev/null
+++ b/dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java
@@ -0,0 +1,116 @@
+package bjc.utils.dicelang.v2;
+
+import bjc.utils.funcdata.FunctionalList;
+import bjc.utils.funcdata.FunctionalMap;
+import bjc.utils.funcdata.FunctionalStringTokenizer;
+import bjc.utils.funcdata.IList;
+import bjc.utils.funcdata.IMap;
+import bjc.utils.funcutils.ListUtils;
+
+import java.util.Deque;
+import java.util.LinkedList;
+
+public class DiceLangEngine {
+ // Input rules for processing tokens
+ private Deque<IPair<String, String>> opExpansionTokens;
+ private Deque<IPair<String, String>> deaffixationTokens;
+
+ // ID for generation of string literal variables
+ private int nextLiteral;
+
+ // Debug indicator
+ private boolean debugMode;
+
+ public DiceLangEngine() {
+ opExpansionTokens = new LinkedList<>();
+
+ opExpansionTokens.add(new Pair<>("+", "\\+"));
+ opExpansionTokens.add(new Pair<>("-", "-"));
+ opExpansionTokens.add(new Pair<>("*", "\\*"));
+ opExpansionTokens.add(new Pair<>("/", "/"));
+ opExpansionTokens.add(new Pair<>(":=", ":="));
+ opExpansionTokens.add(new Pair<>("=>", "=>"));
+
+ deaffixationTokens = new LinkedList<>();
+
+ deaffixationTokens.add(new Pair<>("(", "\\("));
+ deaffixationTokens.add(new Pair<>(")", "\\("));
+ deaffixationTokens.add(new Pair<>("[", "\\["));
+ deaffixationTokens.add(new Pair<>("]", "\\]"));
+
+ nextLiteral = 1;
+
+ // @TODO make configurable
+ debugMode = true;
+ }
+
+ public boolean runCommand(String command) {
+ // Split the command into tokens
+ IList<String> tokens = FunctionalStringTokenizer
+ .fromString(currentLine)
+ .toList();
+
+ // Will hold tokens with string literals removed
+ IList<String> destringed = new FunctionalList<>();
+
+ // Where we keep the string literals
+ // @TODO put these in the sym-table early instead
+ // once there is a sym-table
+ IMap<String, String> stringLiterals = new FunctionalMap<>();
+
+ // Are we parsing a string literal?
+ boolean stringMode = false;
+
+ // The current string literal
+ StringBuilder currentLiteral = new StringBuilder();
+
+ for(String token : tokens.toIterable()) {
+ String[] tokenParts = token.split("^(?!\\\\\")\"");
+
+ if(tokenParts.length == 1) {
+ // Insert token into correct place
+ if(stringMode) {
+ currentLiteral.add(tokenParts[0]);
+ } else {
+ destringed.add(tokenParts[0]);
+ }
+ } else {
+ // Handle multiple "'s in a token
+ for(String stringPart : tokenParts) {
+ // Insert token into correct place
+ if(stringMode) {
+ currentLiteral.add(stringPart);
+ } else {
+ destringed.add(stringPart);
+ }
+
+ // We found a quote. Toggle string mode
+ // and collect the literal
+ stringMode = !stringMode;
+
+ if(debugMode)
+ System.out.printf("DEBUG: Parsed string"
+ + " literal ("
+ + currentLiteral.toString() + ")");
+
+ stringLiterals.put("stringLiteral"
+ + nextLiteral,
+ currentLiteral.toString());
+ destringed.add("stringLiteral" + nextLiteral);
+
+ nextLiteral += 1;
+ currentLiteral = new StringBuilder();
+ }
+ }
+ }
+
+ if(stringMode) {
+ System.out.printf("\tERROR: Unclosed string literal (%s"
+ + ").\n", currentLiteral.toString());
+ }
+
+ if(debugMode)
+ System.out.println("Command after destringing: "
+ + destringed.toString());
+ }
+}