From b3be3b131a76d529d4974124d6b4d37fa30c670e Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Thu, 9 Feb 2017 13:08:05 -0500 Subject: Start on dice-lang rewrite. Yay for destringing commands --- dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java | 116 ++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java (limited to 'dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java') 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> opExpansionTokens; + private Deque> 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 tokens = FunctionalStringTokenizer + .fromString(currentLine) + .toList(); + + // Will hold tokens with string literals removed + IList 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 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()); + } +} -- cgit v1.2.3