diff options
| author | bculkin2442 <bjculkin@mix.wvu.edu> | 2017-02-09 13:08:05 -0500 |
|---|---|---|
| committer | bculkin2442 <bjculkin@mix.wvu.edu> | 2017-02-09 13:08:05 -0500 |
| commit | b3be3b131a76d529d4974124d6b4d37fa30c670e (patch) | |
| tree | 37779a971f65898a9affe498349456bdfea3f7e7 /dice-lang/src | |
| parent | 186b9131d46d886c98316e5b582e0cdd734a5024 (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.swp | bin | 0 -> 12288 bytes | |||
| -rw-r--r-- | dice-lang/src/bjc/dicelang/v2/.DiceLangEngine.java.swp | bin | 0 -> 12288 bytes | |||
| -rw-r--r-- | dice-lang/src/bjc/dicelang/v2/DiceLangConsole.java | 50 | ||||
| -rw-r--r-- | dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java | 116 |
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 Binary files differnew file mode 100644 index 0000000..04eb9f7 --- /dev/null +++ b/dice-lang/src/bjc/dicelang/examples/.DiceExpressionPreparer.java.swp diff --git a/dice-lang/src/bjc/dicelang/v2/.DiceLangEngine.java.swp b/dice-lang/src/bjc/dicelang/v2/.DiceLangEngine.java.swp Binary files differnew file mode 100644 index 0000000..46cc355 --- /dev/null +++ b/dice-lang/src/bjc/dicelang/v2/.DiceLangEngine.java.swp 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()); + } +} |
