summaryrefslogtreecommitdiff
path: root/dice-lang/src/bjc/dicelang/v2
diff options
context:
space:
mode:
authorbjculkin <bjculkin@WIT-136XG42.wvu-ad.wvu.edu>2017-03-01 10:13:41 -0500
committerbjculkin <bjculkin@WIT-136XG42.wvu-ad.wvu.edu>2017-03-01 10:13:41 -0500
commit36e0911c6ec27707a74f0b90b1052a16374243ea (patch)
tree08ca7723b0c0a6a7f3ce1830c59e5211e46168b8 /dice-lang/src/bjc/dicelang/v2
parent6ed83507953322c35a456d64d89f8f4f9cb0a6a1 (diff)
Package reorganization
Diffstat (limited to 'dice-lang/src/bjc/dicelang/v2')
-rw-r--r--dice-lang/src/bjc/dicelang/v2/Define.java125
-rw-r--r--dice-lang/src/bjc/dicelang/v2/DiceLangConsole.java261
-rw-r--r--dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java551
-rw-r--r--dice-lang/src/bjc/dicelang/v2/DoubleMatcher.java58
-rw-r--r--dice-lang/src/bjc/dicelang/v2/Errors.java245
-rw-r--r--dice-lang/src/bjc/dicelang/v2/Evaluator.java424
-rw-r--r--dice-lang/src/bjc/dicelang/v2/EvaluatorResult.java97
-rw-r--r--dice-lang/src/bjc/dicelang/v2/Node.java82
-rw-r--r--dice-lang/src/bjc/dicelang/v2/Parser.java167
-rw-r--r--dice-lang/src/bjc/dicelang/v2/Shunter.java258
-rw-r--r--dice-lang/src/bjc/dicelang/v2/StreamEngine.java118
-rw-r--r--dice-lang/src/bjc/dicelang/v2/Token.java140
-rw-r--r--dice-lang/src/bjc/dicelang/v2/Tokenizer.java154
-rw-r--r--dice-lang/src/bjc/dicelang/v2/dice/CompoundDie.java31
-rw-r--r--dice-lang/src/bjc/dicelang/v2/dice/CompoundingDie.java63
-rw-r--r--dice-lang/src/bjc/dicelang/v2/dice/DiceBox.java142
-rw-r--r--dice-lang/src/bjc/dicelang/v2/dice/Die.java9
-rw-r--r--dice-lang/src/bjc/dicelang/v2/dice/DieExpression.java30
-rw-r--r--dice-lang/src/bjc/dicelang/v2/dice/DieList.java8
-rw-r--r--dice-lang/src/bjc/dicelang/v2/dice/ExplodingDice.java70
-rw-r--r--dice-lang/src/bjc/dicelang/v2/dice/FudgeDie.java37
-rw-r--r--dice-lang/src/bjc/dicelang/v2/dice/MathDie.java74
-rw-r--r--dice-lang/src/bjc/dicelang/v2/dice/ScalarDie.java29
-rw-r--r--dice-lang/src/bjc/dicelang/v2/dice/SimpleDie.java60
-rw-r--r--dice-lang/src/bjc/dicelang/v2/dice/SimpleDieList.java48
25 files changed, 0 insertions, 3281 deletions
diff --git a/dice-lang/src/bjc/dicelang/v2/Define.java b/dice-lang/src/bjc/dicelang/v2/Define.java
deleted file mode 100644
index 5af91ea..0000000
--- a/dice-lang/src/bjc/dicelang/v2/Define.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package bjc.dicelang.v2;
-
-import bjc.utils.data.CircularIterator;
-
-import static bjc.dicelang.v2.Errors.ErrorKey.*;
-
-import java.util.Iterator;
-import java.util.function.UnaryOperator;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
-
-public class Define implements UnaryOperator<String> {
- public static enum Type { LINE, TOKEN }
-
- public static final int MAX_RECURS = 10;
-
- public final int priority;
- public final boolean inError;
-
- private boolean doRecur;
- private boolean subType;
-
- private Pattern predicate;
- private Pattern searcher;
-
- private Iterator<String> replacers;
- private String replacer;
-
- public Define(int priorty,
- boolean isSub, boolean recur, boolean isCircular,
- String predicte, String searchr, Iterable<String> replacrs) {
- priority = priorty;
- doRecur = recur;
- subType = isSub;
-
- if(predicte != null) {
- try {
- predicate = Pattern.compile(predicte);
- } catch (PatternSyntaxException psex) {
- Errors.inst.printError(EK_DFN_PREDSYN, psex.getMessage());
- inError = true;
- return;
- }
- }
-
- try {
- searcher = Pattern.compile(searchr);
- } catch (PatternSyntaxException psex) {
- Errors.inst.printError(EK_DFN_SRCSYN, psex.getMessage());
- inError = true;
- return;
- }
-
- inError = false;
-
- if(subType) {
- if(replacrs.iterator().hasNext()) {
- replacers = new CircularIterator<>(replacrs, isCircular);
- } else {
- replacers = null;
- }
- } else {
- Iterator<String> itr = replacrs.iterator();
-
- if(itr.hasNext()) replacer = itr.next();
- else replacer = "";
- }
- }
-
- public String apply(String tok) {
- if(inError) return tok;
-
- if(predicate != null) {
- if(!predicate.matcher(tok).matches()) {
- return tok;
- }
- }
-
- String strang = doPass(tok);
-
- if(doRecur) {
- int recurCount = 0;
-
- if(strang.equals(tok)) {
- return strang;
- } else {
- String oldStrang = strang;
-
- do {
- strang = doPass(tok);
- recurCount += 1;
- } while(!strang.equals(oldStrang) && recurCount < MAX_RECURS);
-
- if(recurCount >= MAX_RECURS) {
- Errors.inst.printError(EK_DFN_RECUR, Integer.toString(MAX_RECURS), tok, strang);
- return strang;
- }
- }
- }
-
- return strang;
- }
-
- private String doPass(String tok) {
- Matcher searcherMatcher = searcher.matcher(tok);
-
- if(subType) {
- StringBuffer sb = new StringBuffer();
- while(searcherMatcher.find()) {
- if(replacers == null) {
- searcherMatcher.appendReplacement(sb,"");
- } else {
- String replac = replacers.next();
- searcherMatcher.appendReplacement(sb, replac);
- }
- }
-
- searcherMatcher.appendTail(sb);
- return sb.toString();
- } else {
- return searcherMatcher.replaceAll(replacer);
- }
- }
-}
diff --git a/dice-lang/src/bjc/dicelang/v2/DiceLangConsole.java b/dice-lang/src/bjc/dicelang/v2/DiceLangConsole.java
deleted file mode 100644
index 7f3c85b..0000000
--- a/dice-lang/src/bjc/dicelang/v2/DiceLangConsole.java
+++ /dev/null
@@ -1,261 +0,0 @@
-package bjc.dicelang.v2;
-
-import static bjc.dicelang.v2.Errors.ErrorKey.*;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.LinkedList;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import jline.ConsoleReader;
-import jline.Terminal;
-
-public class DiceLangConsole {
- private int commandNumber;
-
- private DiceLangEngine eng;
-
- private ConsoleReader read;
-
- public DiceLangConsole(String[] args) {
- // @TODO do something with the args
- commandNumber = 0;
-
- eng = new DiceLangEngine();
-
- Terminal.setupTerminal();
- }
-
- public void run() {
- try {
- read = new ConsoleReader();
- } catch(IOException ioex) {
- System.out.println("ERROR: Console init failed");
- return;
- }
-
- System.out.println("dice-lang v0.2");
-
- String comm = null;
-
- try {
- comm = read.readLine(String.format("(%d) dice-lang> ", commandNumber));
- } catch (IOException ioex) {
- System.out.println("ERROR: I/O failed");
- return;
- }
-
- while(!comm.equals("quit") && !comm.equals("exit")) {
- if(comm.startsWith("pragma")) {
- boolean success = handlePragma(comm.substring(7));
-
- if(success) System.out.println("Pragma completed succesfully");
- else System.out.println("Pragma execution failed");
- } else {
- 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;
- }
-
- try {
- comm = read.readLine(String.format("(%d) dice-lang> ", commandNumber));
- } catch (IOException ioex) {
- System.out.println("ERROR: I/O failed");
- return;
- }
- }
- }
-
- private boolean handlePragma(String pragma) {
- System.out.println("\tRaw pragma: " + pragma);
-
- String pragmaName = null;
- int firstIndex = pragma.indexOf(' ');
- if(firstIndex == -1) {
- pragmaName = pragma;
- } else {
- pragmaName = pragma.substring(0, firstIndex);
- }
-
- switch(pragmaName) {
- case "debug":
- System.out.println("\tDebug mode is now " + eng.toggleDebug());
- break;
- case "postfix":
- System.out.println("\tPostfix mode is now " + eng.togglePostfix());
- break;
- case "prefix":
- System.out.println("\tPrefix mode is now " + eng.togglePrefix());
- break;
- case "stepeval":
- System.out.println("\tStepeval mode is now" + eng.toggleStepEval());
- break;
- case "define":
- return defineMode(pragma.substring(7));
- case "help":
- return helpMode(pragma.substring(5));
- default:
- Errors.inst.printError(EK_CONS_INVPRAG, pragma);
- return false;
- }
-
- return true;
- }
-
- private boolean helpMode(String pragma) {
- switch(pragma.trim()) {
- case "help":
- System.out.println("\tGet help on pragmas");
- break;
- case "debug":
- System.out.println("\tToggle debug mode. (Output stage results)");
- break;
- case "postfix":
- System.out.println("\tToggle postfix mode. (Don't shunt tokens)");
- break;
- case "prefix":
- System.out.println("\tToggle prefix mode. (Reverse token order instead of shunting)");
- break;
- case "stepeval":
- System.out.println("\tToggle stepeval mode. (Print out evaluation progress)");
- break;
- case "define":
- System.out.println("\tAdd a macro rewrite directive.");
- System.out.println("\tdefine <priority> <type> <recursion> <guard> <circular> <patterns>...");
- break;
- default:
- System.out.println("\tNo help available for pragma " + pragma);
- }
-
- // Help always works
- return true;
- }
-
- /*
- * Matches slash-delimited strings
- * (like /text/ or /text\/text/)
- * Uses the "normal* (special normal*)*" pattern style
- * recommended in 'Mastering regular expressions'
- * Here, the normal is 'anything but a forward or backslash'
- * (in regex, thats '[^/\\]') and the special is 'an escaped forward slash'
- * (in regex, thats '\\\\/')
- *
- * Then, we just follow the pattern, escape it for java strings, and
- * add the enclosing slashes
- */
- private Pattern slashPattern = Pattern.compile("/((?:\\\\.|[^/\\\\])*)/");
-
- private boolean defineMode(String defineText) {
- int firstIndex = defineText.indexOf(' ');
- int secondIndex = defineText.indexOf(' ', firstIndex + 1);
- int thirdIndex = defineText.indexOf(' ', secondIndex + 1);
- int fourthIndex = defineText.indexOf(' ', thirdIndex + 1);
- int fifthIndex = defineText.indexOf(' ', fourthIndex + 1);
- int sixthIndex = defineText.indexOf(' ', fifthIndex + 1);
-
- if(firstIndex == -1) {
- Errors.inst.printError(EK_CONS_INVDEFINE, "(no priority)");
- return false;
- } else if(secondIndex == -1) {
- Errors.inst.printError(EK_CONS_INVDEFINE, "(no define type)");
- return false;
- } else if(thirdIndex == -1) {
- Errors.inst.printError(EK_CONS_INVDEFINE, "(no recursion type)");
- return false;
- } else if(fourthIndex == -1) {
- Errors.inst.printError(EK_CONS_INVDEFINE, "(no guard type)");
- return false;
- } else if(fifthIndex == -1) {
- Errors.inst.printError(EK_CONS_INVDEFINE, "(no circularity)");
- return false;
- } else if(sixthIndex == -1) {
- Errors.inst.printError(EK_CONS_INVDEFINE, "(no patterns)");
- return false;
- }
-
- int priority = Integer.parseInt(defineText.substring(0, firstIndex));
-
- String defineType = defineText.substring(firstIndex + 1, secondIndex);
-
- Define.Type type;
- boolean subMode = false;
-
- switch(defineType) {
- case "line":
- type = Define.Type.LINE;
- break;
- case "token":
- type = Define.Type.TOKEN;
- break;
- case "subline":
- type = Define.Type.LINE;
- subMode = true;
- break;
- case "subtoken":
- type = Define.Type.TOKEN;
- subMode = true;
- break;
- default:
- Errors.inst.printError(EK_CONS_INVDEFINE, "(unknown type)");
- return false;
- }
-
- boolean doRecur = defineText.substring(secondIndex + 1, thirdIndex)
- .equalsIgnoreCase("true");
- boolean hasGuard = defineText.substring(thirdIndex + 1, fourthIndex)
- .equalsIgnoreCase("true");
- boolean isCircular = defineText.substring(thirdIndex + 1, fourthIndex)
- .equalsIgnoreCase("true");
-
- String pats = defineText.substring(fifthIndex + 1).trim();
- Matcher patMatcher = slashPattern.matcher(pats);
-
- String guardPattern = null;
-
- if(hasGuard) {
- if(!patMatcher.find()) {
- Errors.inst.printError(EK_CONS_INVDEFINE, "(no guard pattern)");
- return false;
- }
-
- guardPattern = patMatcher.group(1);
- }
-
- if(!patMatcher.find()) {
- Errors.inst.printError(EK_CONS_INVDEFINE, "(no search pattern)");
- return false;
- }
-
- String searchPattern = patMatcher.group(1);
- List<String> replacePatterns = new LinkedList<>();
-
- while(patMatcher.find()) {
- replacePatterns.add(patMatcher.group(1));
- }
-
- Define dfn = new Define(priority, subMode, doRecur, isCircular,
- guardPattern, searchPattern, replacePatterns);
-
- if(dfn.inError) return false;
-
- if(type == Define.Type.LINE) {
- eng.addLineDefine(dfn);
- } else {
- eng.addTokenDefine(dfn);
- }
-
- return true;
- }
-
- 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
deleted file mode 100644
index 8a877af..0000000
--- a/dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java
+++ /dev/null
@@ -1,551 +0,0 @@
-package bjc.dicelang.v2;
-
-import bjc.utils.data.IPair;
-import bjc.utils.data.ITree;
-import bjc.utils.data.Pair;
-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 static bjc.dicelang.v2.Errors.ErrorKey.*;
-import static bjc.dicelang.v2.Token.Type.*;
-
-import java.util.Comparator;
-import java.util.Deque;
-import java.util.Iterator;
-import java.util.List;
-import java.util.LinkedList;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class DiceLangEngine {
- // Input rules for processing tokens
- private List<IPair<String, String>> opExpansionList;
- private List<IPair<String, String>> deaffixationList;
-
- // ID for generation
- private int nextLiteral;
-
- // Debug indicator
- private boolean debugMode;
- // Should we do shunting?
- private boolean postfixMode;
- // Should we reverse the token stream
- private boolean prefixMode;
- // Should we do step-by-step evaluation
- private boolean stepEval;
-
- // Shunter for token postfixing
- private Shunter shunt;
- // Tokenizer for tokenizing
- private Tokenizer tokenzer;
- // Parser for tree construction
- private Parser parsr;
- // Evaluator for evaluating
- private Evaluator eval;
-
- // Tables for symbols
- public final IMap<Integer, String> symTable;
- public final IMap<Integer, String> stringLits;
-
-
- // Lists for preprocessing
- private IList<Define> lineDefns;
- private IList<Define> tokenDefns;
-
- // Are defns sorted by priority
- private boolean defnsSorted;
-
- // Stream engine for processing streams
- private StreamEngine streamEng;
-
- public DiceLangEngine() {
- lineDefns = new FunctionalList<>();
- tokenDefns = new FunctionalList<>();
- defnsSorted = true;
-
- symTable = new FunctionalMap<>();
- stringLits = new FunctionalMap<>();
-
- opExpansionList = new LinkedList<>();
-
- opExpansionList.add(new Pair<>("+", "\\+"));
- opExpansionList.add(new Pair<>("-", "-"));
- opExpansionList.add(new Pair<>("*", "\\*"));
- opExpansionList.add(new Pair<>("//", "//"));
- opExpansionList.add(new Pair<>("/", "/"));
- opExpansionList.add(new Pair<>(":=", ":="));
- opExpansionList.add(new Pair<>("=>", "=>"));
- opExpansionList.add(new Pair<>(",", ","));
-
- deaffixationList = new LinkedList<>();
-
- deaffixationList.add(new Pair<>("(", "\\("));
- deaffixationList.add(new Pair<>(")", "\\)"));
- deaffixationList.add(new Pair<>("[", "\\["));
- deaffixationList.add(new Pair<>("]", "\\]"));
- deaffixationList.add(new Pair<>("{", "\\{"));
- deaffixationList.add(new Pair<>("}", "}"));
-
- nextLiteral = 1;
-
- debugMode = true;
- postfixMode = false;
- prefixMode = false;
- stepEval = false;
-
- streamEng = new StreamEngine(this);
- shunt = new Shunter();
- tokenzer = new Tokenizer(this);
- parsr = new Parser();
- eval = new Evaluator(this);
- }
-
- public void sortDefns() {
- Comparator<Define> defnCmp = (dfn1, dfn2) -> dfn1.priority - dfn2.priority;
-
- lineDefns.sort(defnCmp);
- tokenDefns.sort(defnCmp);
-
- defnsSorted = true;
- }
-
- public void addLineDefine(Define dfn) {
- lineDefns.add(dfn);
-
- defnsSorted = false;
- }
-
- public void addTokenDefine(Define dfn) {
- tokenDefns.add(dfn);
-
- defnsSorted = false;
- }
-
- public boolean toggleDebug() {
- debugMode = !debugMode;
-
- return debugMode;
- }
-
- public boolean togglePostfix() {
- postfixMode = !postfixMode;
-
- return postfixMode;
- }
-
- public boolean togglePrefix() {
- prefixMode = !prefixMode;
-
- return prefixMode;
- }
-
- public boolean toggleStepEval() {
- stepEval = !stepEval;
-
- return stepEval;
- }
-
- /*
- * Matches quote-delimited strings
- * (like "text" or "text\"text")
- * Uses the "normal* (special normal*)*" pattern style
- * recommended in 'Mastering regular expressions'
- * Here, the normal is 'anything but a forward or backslash'
- * (in regex, thats '[^\""]') and the special is 'an escaped forward slash'
- * (in regex, thats '\\"')
- *
- * Then, we just follow the pattern, escape it for java strings, and
- * add the enclosing quotes
- */
- private Pattern quotePattern = Pattern.compile("\"([^\\\"]*(?:\\\"(?:[^\\\"])*)*)\"");
-
- // Similiar to the above, but using angle brackets instead of quotes
- private Pattern nonExpandPattern = Pattern.compile("<<([^\\>]*(?:\\>(?:[^\\>])*)*)>>");
-
- public boolean runCommand(String command) {
- // 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(newComm);
- StringBuffer destringedCommand = new StringBuffer();
-
- while(quoteMatcher.find()) {
- String stringLit = quoteMatcher.group(1);
-
- String litName = "stringLiteral" + nextLiteral++;
- stringLiterals.put(litName, stringLit);
-
- quoteMatcher.appendReplacement(destringedCommand, " " + litName + " ");
- }
-
- quoteMatcher.appendTail(destringedCommand);
-
- // Split the command into tokens
- IList<String> tokens = FunctionalStringTokenizer
- .fromString(destringedCommand.toString()).toList();
-
- if(debugMode) {
- System.out.println("\tCommand after destringing: " + destringedCommand);
-
- if(stringLiterals.getSize() > 0) {
- System.out.println("\tString literals in table");
-
- stringLiterals.forEach((key, val) -> {
- System.out.printf("\t\tName: (%s)\tValue: (%s)\n", key, val);
- });
- }
- }
-
- IMap<String, String> nonExpandedTokens = new FunctionalMap<>();
-
- tokens = tokens.map(tk -> {
- Matcher nonExpandMatcher = nonExpandPattern.matcher(tk);
-
- if(nonExpandMatcher.matches()) {
- String tkName = "nonExpandToken" + nextLiteral++;
- nonExpandedTokens.put(tkName, nonExpandMatcher.group(1));
-
- return tkName;
- } else {
- return tk;
- }
- });
-
- System.out.println("\tCommand after removal of non-expanders: " + tokens.toString());
-
- IList<String> semiExpandedTokens = deaffixTokens(tokens, deaffixationList);
- IList<String> fullyExpandedTokens = deaffixTokens(semiExpandedTokens, opExpansionList);
-
- System.out.println("\tCommand after token expansion: " + fullyExpandedTokens.toString());
-
- fullyExpandedTokens = fullyExpandedTokens.map(tk -> {
- if(tk.startsWith("nonExpandToken")) {
- return nonExpandedTokens.get(tk);
- } else {
- return tk;
- }
- });
-
- if(debugMode)
- System.out.printf("\tCommand after non-expander reinsertion: "
- + fullyExpandedTokens.toString() + "\n");
-
-
- IList<Token> lexedTokens = new FunctionalList<>();
-
- for(String token : fullyExpandedTokens) {
- String newTok = token;
-
- for(Define dfn : tokenDefns.toIterable()) {
- newTok = dfn.apply(newTok);
- }
-
- Token tk = tokenzer.lexToken(token, stringLiterals);
-
- if(tk == null) continue;
- else if(tk == Token.NIL_TOKEN) return false;
- else lexedTokens.add(tk);
- }
-
- if(debugMode)
- System.out.printf("\tCommand after tokenization: %s\n", lexedTokens.toString());
-
- IList<Token> shuntedTokens = lexedTokens;
-
- IList<Token> preparedTokens = new FunctionalList<>();
- boolean sc = removePreshuntTokens(lexedTokens, preparedTokens);
-
- if(!sc) return false;
-
- if(debugMode && !postfixMode)
- System.out.printf("\tCommand after pre-shunter removal: %s\n", preparedTokens.toString());
-
- if(!postfixMode && !prefixMode) {
- shuntedTokens = new FunctionalList<>();
- success = shunt.shuntTokens(preparedTokens, shuntedTokens);
- if(!success) return false;
- } else if(prefixMode) {
- preparedTokens.reverse();
- shuntedTokens = preparedTokens.map(tk -> {
- switch(tk.type) {
- case OBRACE:
- return new Token(CBRACE, tk.intValue);
- case OPAREN:
- return new Token(CPAREN, tk.intValue);
- case OBRACKET:
- return new Token(CBRACKET, tk.intValue);
- case CBRACE:
- return new Token(OBRACE, tk.intValue);
- case CPAREN:
- return new Token(OPAREN, tk.intValue);
- case CBRACKET:
- return new Token(OBRACKET, tk.intValue);
- default:
- return tk;
- }
- });
- }
-
- if(debugMode && !postfixMode)
- System.out.printf("\tCommand after shunting: %s\n", shuntedTokens.toString());
-
- IList<Token> readyTokens = shuntedTokens.flatMap(tk -> {
- if(tk.type == Token.Type.TOKGROUP) {
- return tk.tokenValues;
- } else if(tk.type == Token.Type.TAGOP || tk.type == Token.Type.TAGOPR) {
- return tk.tokenValues;
- } else {
- return new FunctionalList<>(tk);
- }
- });
-
- if(debugMode && !postfixMode)
- System.out.printf("\tCommand after re-preshunting: %s\n", readyTokens.toString());
-
- IList<ITree<Node>> astForest = new FunctionalList<>();
- success = parsr.parseTokens(readyTokens, astForest);
-
- if(!success) return false;
-
- if(debugMode) {
- evaluateForest(astForest);
- }
-
- return true;
- }
-
- private void evaluateForest(IList<ITree<Node>> astForest) {
- System.out.println("\tParsed forest of asts");
- int treeNo = 1;
-
- for(ITree<Node> ast : astForest) {
- System.out.println("\t\tTree " + treeNo + " in forest:\n" + ast);
-
- if(stepEval) {
- int step = 1;
-
- for(Iterator<ITree<Node>> itr = eval.stepDebug(ast); itr.hasNext();){
- ITree<Node> nodeStep = itr.next();
-
- System.out.printf("\t\tStep %d: Node is %s", step, nodeStep);
-
- if(nodeStep == null) {
- System.out.println();
-
- step += 1;
- continue;
- }
-
- if(nodeStep.getHead().type == Node.Type.RESULT) {
- EvaluatorResult res = nodeStep.getHead().resultVal;
-
- System.out.printf(" (result is %s", res);
-
- if(res.type == EvaluatorResult.Type.DICE) {
- System.out.printf(" (sample roll %s)", res.diceVal.value());
- }
-
- if(res.origVal != null) {
- System.out.printf(" (original tree is %s)", res.origVal);
- }
-
- System.out.printf(")");
- }
-
-
- System.out.println();
- step += 1;
- }
- } else {
- EvaluatorResult res = eval.evaluate(ast);
- System.out.printf("\t\tEvaluates to %s", res);
-
- if(res.type == EvaluatorResult.Type.DICE) {
- System.out.println("\t\t (sample roll " + res.diceVal.value() + ")");
- }
- }
-
- System.out.println();
-
- treeNo += 1;
- }
- }
-
- private boolean removePreshuntTokens(IList<Token> lexedTokens, IList<Token> preparedTokens) {
- boolean success;
- int curBraceCount = 0;
- Deque<IList<Token>> bracedTokens = new LinkedList<>();
- IList<Token> curBracedTokens = null;
-
- for(Token tk : lexedTokens) {
- if(tk.type == Token.Type.OBRACE && tk.intValue == 2) {
- curBraceCount += 1;
-
- if(curBraceCount != 1) {
- bracedTokens.push(curBracedTokens);
- }
-
- curBracedTokens = new FunctionalList<>();
- } else if(tk.type == Token.Type.CBRACE && tk.intValue == 2) {
- if(curBraceCount == 0) {
- Errors.inst.printError(EK_ENG_NOOPENING);
- return false;
- }
-
- curBraceCount -= 1;
-
- IList<Token> preshuntTokens = new FunctionalList<>();
-
- success = shunt.shuntTokens(curBracedTokens, preshuntTokens);
-
- if(debugMode)
- System.out.println("\t\tPreshunted " + curBracedTokens + " into " + preshuntTokens);
-
- if(!success) return false;
-
- if(curBraceCount >= 1) {
- curBracedTokens = bracedTokens.pop();
-
- curBracedTokens.add(new Token(Token.Type.TOKGROUP, preshuntTokens));
- } else {
- preparedTokens.add(new Token(Token.Type.TOKGROUP, preshuntTokens));
- }
- } else {
- if(curBraceCount >= 1) {
- curBracedTokens.add(tk);
- } else {
- preparedTokens.add(tk);
- }
- }
- }
-
- if(curBraceCount > 0) {
- Errors.inst.printError(EK_ENG_NOCLOSING);
- return false;
- }
-
- return true;
- }
-
-
-
- private IList<String> deaffixTokens(IList<String> tokens, List<IPair<String, String>> deaffixTokens) {
- Deque<String> working = new LinkedList<>();
-
- for(String tk : tokens) {
- working.add(tk);
- }
-
- for(IPair<String, String> op : deaffixTokens) {
- Deque<String> newWorking = new LinkedList<>();
-
- String opRegex = op.getRight();
-
- Pattern opRegexPattern = Pattern.compile(opRegex);
- Pattern opRegexOnly = Pattern.compile("\\A(?:" + opRegex + ")+\\Z");
- Pattern opRegexStarting = Pattern.compile("\\A" + opRegex);
- Pattern opRegexEnding = Pattern.compile(opRegex + "\\Z");
-
- for(String tk : working) {
- if(opRegexOnly.matcher(tk).matches()) {
- // The string contains only the operator
- newWorking.add(tk);
- } else {
- Matcher medianMatcher = opRegexPattern.matcher(tk);
-
- // Read the first match
- boolean found = medianMatcher.find();
-
- if(!found) {
- newWorking.add(tk);
- continue;
- }
-
- Matcher startMatcher = opRegexStarting.matcher(tk);
- Matcher endMatcher = opRegexEnding.matcher(tk);
-
- boolean startsWith = startMatcher.find();
- boolean endsWith = endMatcher.find();
- boolean doSplit = medianMatcher.find();
-
- medianMatcher.reset();
-
- if(doSplit || (!startsWith && !endsWith)) {
- String[] pieces = opRegexPattern.split(tk);
-
- if(startsWith) {
- // Skip the starting operator
- medianMatcher.find();
- newWorking.add(tk.substring(0, startMatcher.end()));
- }
-
- for(int i = 0; i < pieces.length; i++) {
- String piece = pieces[i];
-
- // Find the next operator
- boolean didFind = medianMatcher.find();
-
- if(piece.equals("")) {
- System.out.printf("\tWARNING: Empty token found during operator expansion"
- + "of token (%s). Weirdness may happen as a result\n", tk);
- continue;
- }
-
- newWorking.add(piece);
-
- if(didFind)
- newWorking.add(tk.substring(medianMatcher.start(), medianMatcher.end()));
- }
-
- if(endsWith)
- newWorking.add(tk.substring(endMatcher.start()));
- } else if(startsWith && endsWith) {
- newWorking.add(tk.substring(0, startMatcher.end()));
- newWorking.add(tk.substring(startMatcher.end(), endMatcher.start()));
- newWorking.add(tk.substring(endMatcher.start()));
- } else if(startsWith) {
- newWorking.add(tk.substring(0, startMatcher.end()));
- newWorking.add(tk.substring(startMatcher.end()));
- } else if(endsWith) {
- newWorking.add(tk.substring(0, endMatcher.start()));
- newWorking.add(tk.substring(endMatcher.start()));
- } else {
- newWorking.add(tk);
- }
- }
-
- }
-
- working = newWorking;
- }
-
- IList<String> returned = new FunctionalList<>();
- for(String ent : working) {
- returned.add(ent);
- }
-
- return returned;
- }
-}
diff --git a/dice-lang/src/bjc/dicelang/v2/DoubleMatcher.java b/dice-lang/src/bjc/dicelang/v2/DoubleMatcher.java
deleted file mode 100644
index 5f6f0db..0000000
--- a/dice-lang/src/bjc/dicelang/v2/DoubleMatcher.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package bjc.dicelang.v2;
-
-import java.util.regex.Pattern;
-
-/**
- * Checks if a string would pass Double.parseDouble.
- *
- * Uses a regex from the javadoc for Double.valueOf()
- */
-public class DoubleMatcher {
- private static final String Digits =
- "(\\p{Digit}+)";
- private static final String HexDigits =
- "(\\p{XDigit}+)";
-
- // an exponent is 'e' or 'E' followed by an optionally
- // signed decimal integer.
- private static final String Exp =
- "[eE][+-]?" + Digits;
-
- private static final String fpRegex =
- ("[\\x00-\\x20]*" +
- // Optional leading "whitespace"
- "[+-]?(" + // Optional sign character
- "NaN|" + // "NaN" string
- "Infinity|" + // "Infinity" string
-
- // A decimal floating-point string representing a finite positive
- // number without a leading sign has at most five basic pieces:
- // Digits . Digits ExponentPart FloatTypeSuffix
- //
- // Since this method allows integer-only strings as input
- // in addition to strings of floating-point literals, the
- // two sub-patterns below are simplifications of the grammar
- // productions from section 3.10.2 of
- // The Javaâ„¢ Language Specification.
-
- // Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt
- "((("+Digits+"(\\.)?("+Digits+"?)("+Exp+")?)|"+
-
- // . Digits ExponentPart_opt FloatTypeSuffix_opt
- "(\\.("+Digits+")("+Exp+")?)|"+
-
- // Hexadecimal strings
- "((" +
- // 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt
- "(0[xX]" + HexDigits + "(\\.)?)|" +
-
- // 0[xX] HexDigits_opt . HexDigits BinaryExponent FloatTypeSuffix_opt
- "(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" +
-
- ")[pP][+-]?" + Digits + "))" +
- "[fFdD]?))" +
- "[\\x00-\\x20]*");// Optional trailing "whitespace"
-
- public static final Pattern floatingLiteral = Pattern.compile("\\A" + fpRegex + "\\Z");
-
-}
diff --git a/dice-lang/src/bjc/dicelang/v2/Errors.java b/dice-lang/src/bjc/dicelang/v2/Errors.java
deleted file mode 100644
index 6ad74ab..0000000
--- a/dice-lang/src/bjc/dicelang/v2/Errors.java
+++ /dev/null
@@ -1,245 +0,0 @@
-package bjc.dicelang.v2;
-
-public class Errors {
- public static enum ErrorKey {
- // Define Errors
- // Incorrect define guard syntax
- EK_DFN_PREDSYN,
- // Incorrect define search syntax
- EK_DFN_SRCSYN,
- // Recursive define recursed too many times
- EK_DFN_RECUR,
-
- // Console Errors
- // Unknown console pragma
- EK_CONS_INVPRAG,
- // Improperly formatted define
- EK_CONS_INVDEFINE,
-
- // Language Engine Errors
- // Found closing doublebrace w/out opening doublebrace
- EK_ENG_NOOPENING,
- // Reached end of command w/out balanced doublebraces
- EK_ENG_NOCLOSING,
-
- // Tokenizer Errors
- // Found an unexpected grouping token
- EK_TOK_UNGROUP,
- // Invalid base for a flexadecimal number
- EK_TOK_INVBASE,
- // Invalid flexadecimal number in a given base
- EK_TOK_INVFLEX,
-
- // Evaluator Errors
- // Unknown node type
- EK_EVAL_INVNODE,
- // Incorrect # of args to binary operator
- EK_EVAL_INVBIN,
- // Incorrect # of args to unary operator
- EK_EVAL_INVUNARY,
- // Unknown binary operator
- EK_EVAL_UNBIN,
- // Unknown unary operator
- EK_EVAL_UNUNARY,
- // Math on strings doesn't work
- EK_EVAL_STRINGMATH,
- // Attempted divide by zero
- EK_EVAL_DIVZERO,
- // Attempted to divide dice
- EK_EVAL_DIVDICE,
- // Unknown math operator
- EK_EVAL_UNMATH,
- // Unknown token reference
- EK_EVAL_UNTOK,
- // Unknown dice operator
- EK_EVAL_UNDICE,
- // Incorrect type to dice group operator
- EK_EVAL_INVDGROUP,
- // Incorrect type to other dice operator
- EK_EVAL_INVDICE,
- // Mismatched types to math operator
- EK_EVAL_MISMATH,
-
- // Parser Error
- // Group closing where there couldn't be an opener
- EK_PARSE_NOCLOSE,
- // Group closing without group opener
- EK_PARSE_UNCLOSE,
- // Incorrect # of arguments to binary operator
- EK_PARSE_BINARY,
- // Not enough operands to binary operator
- EK_PARSE_UNOPERAND,
- // Unrecognized token type
- EK_PARSE_INVTOKEN,
-
- // Shunter Error
- // Unary operator expected a operand, but got an operator
- EK_SHUNT_NOTADV,
- // Unary operator expected an operator, but got an operand
- EK_SHUNT_NOTADJ,
- // Unary operator expected an operator, but didn't find one
- EK_SHUNT_NOOP,
- // Asked for opening grouping operator, but couldn't find one
- EK_SHUNT_NOGROUP,
- // No group for group seperator to attach to
- EK_SHUNT_INVSEP,
-
- // Stream Errors
- // Attempted to switch to a non-existant stream
- EK_STRM_NONEX,
- // Can't delete the last stream
- EK_STRM_LAST,
- // Unknown stream command
- EK_STRM_INVCOM,
-
- }
-
- public static enum ErrorMode {
- WIZARD, DEV
- }
-
- private ErrorMode mode;
-
- public void printError(ErrorKey key, String... args) {
- switch(mode) {
- case WIZARD:
- System.out.println("\t? " + key.ordinal());
- break;
- case DEV:
- devError(key, args);
- break;
- default:
- System.out.println("\tERROR ERROR: Unknown error mode " + mode);
- }
- }
-
- private void devError(ErrorKey key, String[] args) {
- switch(key) {
- case EK_DFN_PREDSYN:
- System.out.printf("\tERROR: Incorrect define guard syntax %s\n", args[0]);
- break;
- case EK_DFN_SRCSYN:
- System.out.printf("\tERROR: Incorrect define match syntax %s\n", args[0]);
- break;
- case EK_DFN_RECUR:
- System.out.printf("\tERROR: Recursive define didn't converge after %s iterations."
- + " Original string was %s, last iteration was %s\n",
- args[0], args[1], args[2]);
- break;
- case EK_CONS_INVPRAG:
- System.out.printf("\tERROR: Unknown pragma %s\n", args[0]);
- break;
- case EK_CONS_INVDEFINE:
- System.out.printf("\tERROR: Improperly formatted define %s\n", args[0]);
- break;
- case EK_ENG_NOOPENING:
- System.out.printf("\tERROR: Encountered closing doublebrace without"
- + " matching opening doublebrace\n");
- break;
- case EK_ENG_NOCLOSING:
- System.out.printf("\tERROR: Reached end of string before closing doublebrace was found\n");
- break;
- case EK_TOK_UNGROUP:
- System.out.printf("\tERROR: Unrecognized grouping token %s\n", args[0]);
- break;
- case EK_TOK_INVBASE:
- System.out.printf("\tERROR: Invalid flexadecimal base %s\n", args[0]);
- break;
- case EK_TOK_INVFLEX:
- System.out.printf("\tERROR: Invalid flexadecimal number %s in base %s\n", args[0], args[1]);
- break;
- case EK_EVAL_INVNODE:
- System.out.printf("\tERROR: Unknown node in evaluator: %s\n", args[0]);
- break;
- case EK_EVAL_INVBIN:
- System.out.printf("\tERROR: Binary operators take 2 operand, not %s\n"
- + "\tProblem node is %s\n", args[0], args[1]);
- break;
- case EK_EVAL_UNBIN:
- System.out.printf("\tERROR: Unknown binary operator %s\n", args[0]);
- break;
- case EK_EVAL_STRINGMATH:
- System.out.printf("\tERROR: Math operators don't work on strings\n");
- break;
- case EK_EVAL_DIVZERO:
- System.out.printf("\tERROR: Attempted divide by zero\n");
- break;
- case EK_EVAL_DIVDICE:
- System.out.printf("\tERROR: Dice cannot be divided\n");
- break;
- case EK_EVAL_UNMATH:
- System.out.printf("\tERROR: Unknown math binary operator: %s\n", args[0]);
- break;
- case EK_EVAL_UNTOK:
- System.out.printf("\tERROR: Unknown token ref %s\n", args[0]);
- break;
- case EK_EVAL_UNDICE:
- System.out.printf("\tERROR: Unknown dice operator %s\n", args[0]);
- break;
- case EK_EVAL_INVDGROUP:
- System.out.printf("\tERROR: Dice group operator expects scalar dice or integers,"
- + " not %s\n", args[0]);
- break;
- case EK_EVAL_INVDICE:
- System.out.printf("\tERROR: Dice operators expect scalar dice, not %s\n", args[0]);
- break;
- case EK_EVAL_MISMATH:
- System.out.printf("\tERROR: Math operators expect two operands of the same type\n");
- break;
- case EK_PARSE_NOCLOSE:
- System.out.printf("\tERROR: Group closing with no possible group opener\n");
- break;
- case EK_PARSE_UNCLOSE:
- System.out.printf("\tERROR: Found group closer without opener: (closing was %s"
- + ", expected %s)\n", args[0], args[1]);
- break;
- case EK_PARSE_BINARY:
- System.out.printf("\tERROR: Expected at least two operands\n");
- break;
- case EK_PARSE_UNOPERAND:
- System.out.printf("\tERROR: Operator %s expected more operands than provided\n", args[0]);
- break;
- case EK_PARSE_INVTOKEN:
- System.out.printf("\tERROR: Unrecognized token type in parsing: %s\n", args[0]);
- break;
- case EK_SHUNT_NOTADV:
- System.out.printf("\tERROR: Unary operator %s is an adjective, not an adverb. It can't be"
- + " applied to the operator %s\n", args[0], args[1]);
- break;
- case EK_SHUNT_NOTADJ:
- System.out.printf("\tERROR: Unary operator %s is an adjective, not an adverb. It can't be"
- + " applied to the operator %s\n", args[0], args[1]);
- break;
- case EK_SHUNT_NOOP:
- System.out.printf("\tERROR: Unary operator %s is an adverb, but there is no operator"
- + " to apply it to\n", args[0]);
- break;
- case EK_SHUNT_NOGROUP:
- System.out.printf("\tERROR: Couldn't find matching grouping %s (expected %s)\n",
- args[0], args[1]);
- break;
- case EK_SHUNT_INVSEP:
- System.out.printf("\tERROR: Couldn't find grouper for group seperator to attach to\n");
- break;
- case EK_STRM_NONEX:
- System.out.printf("\tERROR: Attempted to switch to non-existent stream\n");
- break;
- case EK_STRM_LAST:
- System.out.printf("\tERROR: Cannot delete last stream\n");
- break;
- case EK_STRM_INVCOM:
- System.out.printf("\tERROR: Unknown stream control command %s\n", args[0]);
- break;
- default:
- System.out.printf("\tERROR ERROR: Unknown error key %s\n", key);
- }
- }
-
- public final static Errors inst;
-
- static {
- inst = new Errors();
-
- inst.mode = ErrorMode.DEV;
- }
-}
diff --git a/dice-lang/src/bjc/dicelang/v2/Evaluator.java b/dice-lang/src/bjc/dicelang/v2/Evaluator.java
deleted file mode 100644
index ed9db17..0000000
--- a/dice-lang/src/bjc/dicelang/v2/Evaluator.java
+++ /dev/null
@@ -1,424 +0,0 @@
-package bjc.dicelang.v2;
-
-import bjc.dicelang.v2.dice.CompoundDie;
-import bjc.dicelang.v2.dice.MathDie;
-import bjc.dicelang.v2.dice.SimpleDie;
-import bjc.dicelang.v2.dice.SimpleDieList;
-import bjc.utils.data.ITree;
-import bjc.utils.data.SingleIterator;
-import bjc.utils.data.Tree;
-import bjc.utils.data.TopDownTransformIterator;
-import bjc.utils.data.TopDownTransformResult;
-
-import static bjc.dicelang.v2.Errors.ErrorKey.*;
-import static bjc.dicelang.v2.EvaluatorResult.Type.*;
-
-import java.util.Deque;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.function.Consumer;
-
-public class Evaluator {
- private static enum CoerceSteps {
- INTEGER, FLOAT;
- }
-
- private static class Context {
- public Consumer<Iterator<ITree<Node>>> thunk;
-
- public boolean isDebug;
- }
-
- private static Node FAIL() {
- return new Node(Node.Type.RESULT, new EvaluatorResult(FAILURE));
- }
-
- private static Node FAIL(ITree<Node> orig) {
- return new Node(Node.Type.RESULT, new EvaluatorResult(FAILURE, orig));
- }
-
- private static Node FAIL(Node orig) {
- return new Node(Node.Type.RESULT, new EvaluatorResult(FAILURE, orig));
- }
-
- private static Node FAIL(EvaluatorResult res) {
- return new Node(Node.Type.RESULT, new EvaluatorResult(FAILURE, new Node(Node.Type.RESULT, res)));
- }
-
- private DiceLangEngine eng;
-
- public Evaluator(DiceLangEngine en) {
- eng = en;
- }
-
- public EvaluatorResult evaluate(ITree<Node> comm) {
- Context ctx = new Context();
-
- ctx.isDebug = false;
- ctx.thunk = (itr) -> {
- // Deliberately finish the iterator, but ignore results. It's only for stepwise evaluation
- // but we don't know if stepping the iterator causes something to happen
- while(itr.hasNext()) itr.next();
- };
-
- return comm.topDownTransform(this::pickEvaluationType,
- (node) -> this.evaluateNode(node, ctx)).getHead().resultVal;
- }
-
- // @FIXME Something's broken with step evaluation
- public Iterator<ITree<Node>> stepDebug(ITree<Node> comm) {
- Context ctx = new Context();
-
- ctx.isDebug = true;
-
- return new TopDownTransformIterator<>(this::pickEvaluationType, (node, thnk) -> {
- ctx.thunk = thnk;
-
- return this.evaluateNode(node, ctx);
- }, comm);
- }
-
- private TopDownTransformResult pickEvaluationType(Node nd) {
- switch(nd.type) {
- case UNARYOP:
- switch(nd.operatorType) {
- case COERCE:
- return TopDownTransformResult.RTRANSFORM;
- default:
- return TopDownTransformResult.PUSHDOWN;
- }
- default:
- return TopDownTransformResult.PUSHDOWN;
- }
- }
-
- private ITree<Node> evaluateNode(ITree<Node> ast, Context ctx) {
- switch(ast.getHead().type) {
- case UNARYOP:
- return evaluateUnaryOp(ast, ctx);
- case BINOP:
- return evaluateBinaryOp(ast, ctx);
- case TOKREF:
- return evaluateTokenRef(ast.getHead().tokenVal, ctx);
- case ROOT:
- return ast.getChild(ast.getChildrenCount() - 1);
- case RESULT:
- return ast;
- default:
- Errors.inst.printError(EK_EVAL_INVNODE, ast.getHead().type.toString());
- return new Tree<>(FAIL(ast));
- }
- }
-
- private ITree<Node> evaluateUnaryOp(ITree<Node> ast, Context ctx) {
- switch(ast.getHead().operatorType) {
- case COERCE:
- if(ast.getChildrenCount() != 1) {
- Errors.inst.printError(EK_EVAL_UNUNARY, Integer.toString(ast.getChildrenCount()));
- return new Tree<>(FAIL(ast));
- }
-
- ITree<Node> toCoerce = ast.getChild(0);
- ITree<Node> retVal = new Tree<>(toCoerce.getHead());
- Deque<ITree<Node>> children = new LinkedList<>();
-
- CoerceSteps curLevel = CoerceSteps.INTEGER;
-
- for(int i = 0; i < toCoerce.getChildrenCount(); i++) {
- ITree<Node> child = toCoerce.getChild(i);
- ITree<Node> nChild = null;
-
- if(ctx.isDebug) {
- Iterator<ITree<Node>> nd = stepDebug(child);
-
- for(; nd.hasNext(); nChild = nd.next()) {
- ctx.thunk.accept(new SingleIterator<>(child));
- }
- } else {
- nChild = new Tree<>(new Node(Node.Type.RESULT, evaluate(child)));
-
- if(nChild != null) ctx.thunk.accept(new SingleIterator<>(nChild));
- }
-
- Node childNode = nChild.getHead();
- EvaluatorResult res = childNode.resultVal;
-
- if(res.type == FLOAT) curLevel = CoerceSteps.FLOAT;
-
- children.add(nChild);
- }
-
- for(ITree<Node> child : children) {
- Node nd = child.getHead();
- EvaluatorResult res = nd.resultVal;
-
- switch(res.type) {
- case INT:
- if(curLevel == CoerceSteps.FLOAT) {
- nd.resultVal = new EvaluatorResult(FLOAT, (double)res.intVal);
- }
- default:
- // Do nothing
- break;
- }
-
- retVal.addChild(child);
- }
-
- return retVal;
- default:
- Errors.inst.printError(EK_EVAL_INVUNARY, ast.getHead().operatorType.toString());
- return new Tree<>(FAIL(ast));
- }
- }
-
- private ITree<Node> evaluateBinaryOp(ITree<Node> ast, Context ctx) {
- Token.Type binOp = ast.getHead().operatorType;
-
- if(ast.getChildrenCount() != 2) {
- Errors.inst.printError(EK_EVAL_INVBIN, Integer.toString(ast.getChildrenCount()), ast.toString());
-
- return new Tree<>(FAIL(ast));
- }
-
- ITree<Node> left = ast.getChild(0);
- ITree<Node> right = ast.getChild(1);
-
- switch(binOp) {
- case ADD:
- case SUBTRACT:
- case MULTIPLY:
- case DIVIDE:
- case IDIVIDE:
- return evaluateMathBinary(binOp,
- left.getHead().resultVal, right.getHead().resultVal,
- ctx);
- case DICEGROUP:
- case DICECONCAT:
- case DICELIST:
- return evaluateDiceBinary(binOp,
- left.getHead().resultVal, right.getHead().resultVal,
- ctx);
- default:
- Errors.inst.printError(EK_EVAL_UNBIN, binOp.toString());
- return new Tree<>(FAIL(ast));
- }
- }
-
- private ITree<Node> evaluateDiceBinary(Token.Type op,
- EvaluatorResult left, EvaluatorResult right, Context ctx) {
- EvaluatorResult res = null;
-
- switch(op) {
- case DICEGROUP:
- if(left.type == DICE && !left.diceVal.isList) {
- if(right.type == DICE && !right.diceVal.isList) {
- res = new EvaluatorResult(DICE,
- new SimpleDie(left.diceVal.scalar, right.diceVal.scalar));
- } else if (right.type == INT) {
- res = new EvaluatorResult(DICE, new SimpleDie(left.diceVal.scalar, right.intVal));
- } else {
- Errors.inst.printError(EK_EVAL_INVDGROUP, right.type.toString());
- return new Tree<>(FAIL(right));
- }
- } else if(left.type == INT) {
- if(right.type == DICE && !right.diceVal.isList) {
- res = new EvaluatorResult(DICE, new SimpleDie(left.intVal, right.diceVal.scalar));
- } else if (right.type == INT) {
- res = new EvaluatorResult(DICE, new SimpleDie(left.intVal, right.intVal));
- } else {
- Errors.inst.printError(EK_EVAL_INVDGROUP, right.type.toString());
- return new Tree<>(FAIL(right));
- }
- } else {
- Errors.inst.printError(EK_EVAL_INVDGROUP, left.type.toString());
- return new Tree<>(FAIL(left));
- }
- case DICECONCAT:
- if(left.type != DICE || left.diceVal.isList) {
- Errors.inst.printError(EK_EVAL_INVDICE, left.type.toString());
- return new Tree<>(FAIL(left));
- } else if(right.type != DICE || right.diceVal.isList) {
- Errors.inst.printError(EK_EVAL_INVDICE, right.type.toString());
- return new Tree<>(FAIL(right));
- } else {
- res = new EvaluatorResult(DICE,
- new CompoundDie(left.diceVal.scalar, right.diceVal.scalar));
- }
- break;
- case DICELIST:
- if(left.type != DICE || left.diceVal.isList) {
- Errors.inst.printError(EK_EVAL_INVDICE, left.type.toString());
- return new Tree<>(FAIL(left));
- } else if(right.type != DICE || right.diceVal.isList) {
- Errors.inst.printError(EK_EVAL_INVDICE, right.type.toString());
- return new Tree<>(FAIL(right));
- } else {
- res = new EvaluatorResult(DICE,
- new SimpleDieList(left.diceVal.scalar, right.diceVal.scalar));
- }
- break;
- default:
- Errors.inst.printError(EK_EVAL_UNDICE, op.toString());
- return new Tree<>(FAIL());
- }
-
- return new Tree<>(new Node(Node.Type.RESULT, res));
- }
-
- private ITree<Node> evaluateMathBinary(Token.Type op,
- EvaluatorResult left, EvaluatorResult right, Context ctx) {
- if(left.type == STRING || right.type == STRING) {
- Errors.inst.printError(EK_EVAL_STRINGMATH);
- return new Tree<>(FAIL());
- } else if(left.type == FAILURE || right.type == FAILURE) {
- return new Tree<>(FAIL());
- } else if(left.type == INT && right.type != INT) {
- Errors.inst.printError(EK_EVAL_MISMATH);
- return new Tree<>(FAIL(right));
- } else if(left.type == FLOAT && right.type != FLOAT) {
- Errors.inst.printError(EK_EVAL_MISMATH);
- return new Tree<>(FAIL(right));
- } else if(left.type == DICE && right.type != DICE) {
- Errors.inst.printError(EK_EVAL_MISMATH);
- return new Tree<>(FAIL(right));
- } else if(right.type == INT && left.type != INT) {
- Errors.inst.printError(EK_EVAL_MISMATH);
- return new Tree<>(FAIL(left));
- } else if(right.type == FLOAT && left.type != FLOAT) {
- Errors.inst.printError(EK_EVAL_MISMATH);
- return new Tree<>(FAIL(left));
- } else if(right.type == DICE && left.type != DICE) {
- Errors.inst.printError(EK_EVAL_MISMATH);
- return new Tree<>(FAIL(left));
- }
-
- EvaluatorResult res = null;
-
- switch(op) {
- case ADD:
- if(left.type == INT) {
- res = new EvaluatorResult(INT, left.intVal + right.intVal);
- } else if(left.type == DICE) {
- if(left.diceVal.isList) {
- Errors.inst.printError(EK_EVAL_INVDICE, left.toString());
- return new Tree<>(FAIL(left));
- } else if(right.diceVal.isList) {
- Errors.inst.printError(EK_EVAL_INVDICE, right.toString());
- return new Tree<>(FAIL(right));
- }
-
- res = new EvaluatorResult(DICE, new MathDie(MathDie.MathOp.ADD,
- left.diceVal.scalar, right.diceVal.scalar));
- } else {
- res = new EvaluatorResult(FLOAT, left.floatVal + right.floatVal);
- }
- break;
- case SUBTRACT:
- if(left.type == INT) {
- res = new EvaluatorResult(INT, left.intVal - right.intVal);
- } else if(left.type == DICE) {
- if(left.diceVal.isList) {
- Errors.inst.printError(EK_EVAL_INVDICE, left.toString());
- return new Tree<>(FAIL(left));
- } else if(right.diceVal.isList) {
- Errors.inst.printError(EK_EVAL_INVDICE, right.toString());
- return new Tree<>(FAIL(right));
- }
-
- res = new EvaluatorResult(DICE, new MathDie(MathDie.MathOp.SUBTRACT,
- left.diceVal.scalar, right.diceVal.scalar));
- } else {
- res = new EvaluatorResult(FLOAT, left.floatVal - right.floatVal);
- }
- break;
- case MULTIPLY:
- if(left.type == INT) {
- res = new EvaluatorResult(INT, left.intVal * right.intVal);
- } else if(left.type == DICE) {
- if(left.diceVal.isList) {
- Errors.inst.printError(EK_EVAL_INVDICE, left.toString());
- return new Tree<>(FAIL(left));
- } else if(right.diceVal.isList) {
- Errors.inst.printError(EK_EVAL_INVDICE, right.toString());
- return new Tree<>(FAIL(right));
- }
-
- res = new EvaluatorResult(DICE, new MathDie(MathDie.MathOp.MULTIPLY,
- left.diceVal.scalar, right.diceVal.scalar));
- } else {
- res = new EvaluatorResult(FLOAT, left.floatVal * right.floatVal);
- }
- break;
- case DIVIDE:
- if(left.type == INT) {
- if(right.intVal == 0) {
- Errors.inst.printError(EK_EVAL_DIVZERO);
- res = new EvaluatorResult(FAILURE, right);
- } else {
- res = new EvaluatorResult(FLOAT, left.intVal / right.intVal);
- }
- } else if(left.type == FLOAT) {
- if(right.floatVal == 0) {
- Errors.inst.printError(EK_EVAL_DIVZERO);
- res = new EvaluatorResult(FAILURE, right);
- } else {
- res = new EvaluatorResult(FLOAT, left.floatVal / right.floatVal);
- }
- } else {
- Errors.inst.printError(EK_EVAL_DIVDICE);
- return new Tree<>(FAIL());
- }
- break;
- case IDIVIDE:
- if(left.type == INT) {
- if(right.intVal == 0) {
- Errors.inst.printError(EK_EVAL_DIVZERO);
- res = new EvaluatorResult(FAILURE, right);
- } else {
- res = new EvaluatorResult(INT, (int) (left.intVal / right.intVal));
- }
- } else if(left.type == FLOAT) {
- if(right.floatVal == 0) {
- Errors.inst.printError(EK_EVAL_DIVZERO);
- res = new EvaluatorResult(FAILURE, right);
- } else {
- res = new EvaluatorResult(INT, (int) (left.floatVal / right.floatVal));
- }
- } else {
- Errors.inst.printError(EK_EVAL_DIVDICE);
- return new Tree<>(FAIL());
- }
- break;
- default:
- Errors.inst.printError(EK_EVAL_UNMATH, op.toString());
- return new Tree<>(FAIL());
- }
-
- return new Tree<>(new Node(Node.Type.RESULT, res));
- }
-
- private ITree<Node> evaluateTokenRef(Token tk, Context ctx) {
- EvaluatorResult res = null;
-
- switch(tk.type) {
- case INT_LIT:
- res = new EvaluatorResult(INT, tk.intValue);
- break;
- case FLOAT_LIT:
- res = new EvaluatorResult(FLOAT, tk.floatValue);
- break;
- case DICE_LIT:
- res = new EvaluatorResult(DICE, tk.diceValue);
- break;
- case STRING_LIT:
- res = new EvaluatorResult(STRING, eng.stringLits.get((int)(tk.intValue)));
- break;
- default:
- Errors.inst.printError(EK_EVAL_UNTOK, tk.type.toString());
- res = new EvaluatorResult(FAILURE);
- }
-
- return new Tree<>(new Node(Node.Type.RESULT, res));
- }
-}
diff --git a/dice-lang/src/bjc/dicelang/v2/EvaluatorResult.java b/dice-lang/src/bjc/dicelang/v2/EvaluatorResult.java
deleted file mode 100644
index bac4d2d..0000000
--- a/dice-lang/src/bjc/dicelang/v2/EvaluatorResult.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package bjc.dicelang.v2;
-
-import bjc.dicelang.v2.dice.Die;
-import bjc.dicelang.v2.dice.DieExpression;
-import bjc.dicelang.v2.dice.DieList;
-import bjc.utils.data.ITree;
-import bjc.utils.data.Tree;
-
-public class EvaluatorResult {
- public static enum Type {
- FAILURE,
- INT, FLOAT, DICE, STRING
- }
-
- public final EvaluatorResult.Type type;
-
- // These may or may not have values based
- // off of the result type
- public long intVal;
- public double floatVal;
- public DieExpression diceVal;
- public String stringVal;
-
- // Original node data
- public ITree<Node> origVal;
-
- public EvaluatorResult(EvaluatorResult.Type typ) {
- type = typ;
- }
-
- public EvaluatorResult(EvaluatorResult.Type typ, ITree<Node> orig) {
- this(typ);
-
- origVal = orig;
- }
-
- public EvaluatorResult(EvaluatorResult.Type typ, Node orig) {
- this(typ, new Tree<>(orig));
- }
-
- public EvaluatorResult(EvaluatorResult.Type typ, EvaluatorResult orig) {
- this(typ, new Node(Node.Type.RESULT, orig));
- }
-
- public EvaluatorResult(EvaluatorResult.Type typ, long iVal) {
- this(typ);
-
- intVal = iVal;
- }
-
- public EvaluatorResult(EvaluatorResult.Type typ, double dVal) {
- this(typ);
-
- floatVal = dVal;
- }
-
- public EvaluatorResult(EvaluatorResult.Type typ, DieExpression dVal) {
- this(typ);
-
- diceVal = dVal;
- }
-
- public EvaluatorResult(EvaluatorResult.Type typ, Die dVal) {
- this(typ);
-
- diceVal = new DieExpression(dVal);
- }
-
- public EvaluatorResult(EvaluatorResult.Type typ, DieList dVal) {
- this(typ);
-
- diceVal = new DieExpression(dVal);
- }
-
- public EvaluatorResult(EvaluatorResult.Type typ, String strang) {
- this(typ);
-
- stringVal = strang;
- }
-
- public String toString() {
- switch(type) {
- case INT:
- return type.toString() + "(" + intVal + ")";
- case FLOAT:
- return type.toString() + "(" + floatVal + ")";
- case DICE:
- return type.toString() + "(" + diceVal + ")";
- case STRING:
- return type.toString() + "(" + stringVal + ")";
- case FAILURE:
- return type.toString();
- default:
- return "Unknown result type " + type.toString();
- }
- }
-} \ No newline at end of file
diff --git a/dice-lang/src/bjc/dicelang/v2/Node.java b/dice-lang/src/bjc/dicelang/v2/Node.java
deleted file mode 100644
index 334a9f3..0000000
--- a/dice-lang/src/bjc/dicelang/v2/Node.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package bjc.dicelang.v2;
-
-public class Node {
- public static enum Type {
- ROOT, TOKREF,
- UNARYOP, BINOP,
- GROUP, OGROUP,
- RESULT
- }
-
- public static enum GroupType {
- ARRAY, CODE
- }
-
- public final Type type;
-
- // These can have or not have values based of the node type
- public Token tokenVal;
- public Token.Type operatorType;
- public GroupType groupType;
- public EvaluatorResult resultVal;
-
- public Node(Type typ) {
- type = typ;
- }
-
- public Node(Type typ, Token tokenVl) {
- this(typ);
-
- tokenVal = tokenVl;
- }
-
- public Node(Type typ, Token.Type opType) {
- this(typ);
-
- operatorType = opType;
- }
-
- public Node(Type typ, GroupType grupType) {
- this(typ);
-
- groupType = grupType;
- }
-
- public Node(Type typ, EvaluatorResult res) {
- this(typ);
-
- resultVal = res;
- }
-
- public String toString() {
- switch(type) {
- case UNARYOP:
- case BINOP:
- return "(" + type.name() + " : " + operatorType + ")";
- case OGROUP:
- case TOKREF:
- return "(" + type.name() + " : " + tokenVal + ")";
- case GROUP:
- return "(" + type.name() + " : " + groupType + ")";
- case RESULT:
- return "(" + type.name() + " : " + resultVal + ")";
- default:
- return "Unknown node type " + type;
- }
- }
-
- public boolean equals(Object other) {
- if(!(other instanceof Node)) return false;
-
- Node otk = (Node)other;
-
- if(otk.type != type) return false;
-
- switch(type) {
- case OGROUP:
- return tokenVal.equals(otk.tokenVal);
- default:
- return true;
- }
- }
-}
diff --git a/dice-lang/src/bjc/dicelang/v2/Parser.java b/dice-lang/src/bjc/dicelang/v2/Parser.java
deleted file mode 100644
index a47707d..0000000
--- a/dice-lang/src/bjc/dicelang/v2/Parser.java
+++ /dev/null
@@ -1,167 +0,0 @@
-package bjc.dicelang.v2;
-
-import static bjc.dicelang.v2.Errors.ErrorKey.*;
-import static bjc.dicelang.v2.Node.Type.*;
-import static bjc.dicelang.v2.Token.Type.*;
-
-import java.util.Deque;
-import java.util.LinkedList;
-
-import bjc.utils.data.ITree;
-import bjc.utils.data.Tree;
-import bjc.utils.funcdata.IList;
-
-public class Parser {
- public Parser() {
-
- }
-
- public boolean parseTokens(IList<Token> tokens,
- IList<ITree<Node>> results) {
- Deque<ITree<Node>> working = new LinkedList<>();
-
- for(Token tk : tokens) {
- switch(tk.type) {
- case OBRACKET:
- case OBRACE:
- working.push(new Tree<>(new Node(OGROUP, tk)));
- break;
- case CBRACKET:
- case CBRACE:
- boolean sc = parseClosingGrouper(working, tk);
- if(!sc) return false;
- break;
- case LET:
- case BIND:
- if(working.size() < 2) {
- Errors.inst.printError(EK_PARSE_BINARY);
- return false;
- } else {
- ITree<Node> right = working.pop();
- ITree<Node> left = working.pop();
-
- ITree<Node> opNode = new Tree<>(new Node(BINOP, tk.type));
-
- working.push(opNode);
- }
- break;
- case ADD:
- case SUBTRACT:
- case MULTIPLY:
- case DIVIDE:
- case IDIVIDE:
- case DICEGROUP:
- case DICECONCAT:
- case DICELIST:
- if(working.size() == 0) {
- Errors.inst.printError(EK_PARSE_UNOPERAND, tk.toString());
- return false;
- } else if(working.size() == 1) {
- ITree<Node> operand = working.pop();
-
- ITree<Node> opNode = new Tree<>(new Node(UNARYOP, tk.type));
-
- opNode.addChild(operand);
-
- working.push(opNode);
- } else {
- ITree<Node> right = working.pop();
- ITree<Node> left = working.pop();
-
- ITree<Node> opNode = new Tree<>(new Node(BINOP, tk.type));
-
- opNode.addChild(left);
- opNode.addChild(right);
-
- working.push(opNode);
- }
- break;
- case COERCE:
- if(working.size() == 0) {
- Errors.inst.printError(EK_PARSE_UNOPERAND, tk.toString());
- } else {
- ITree<Node> operand = working.pop();
- ITree<Node> opNode = new Tree<>(new Node(UNARYOP, tk.type));
-
- opNode.addChild(operand);
-
- working.push(opNode);
- }
- break;
- case INT_LIT:
- case FLOAT_LIT:
- case STRING_LIT:
- case VREF:
- case DICE_LIT:
- working.push(new Tree<>(new Node(TOKREF, tk)));
- break;
- default:
- Errors.inst.printError(EK_PARSE_INVTOKEN, tk.type.toString());
- return false;
- }
- }
-
- for(ITree<Node> ast : working) {
- results.add(ast);
- }
-
- return true;
- }
-
- private boolean parseClosingGrouper(Deque<ITree<Node>> working, Token tk) {
- if(working.size() == 0) {
- Errors.inst.printError(EK_PARSE_NOCLOSE);
- return false;
- }
-
- ITree<Node> groupNode = null;
- switch(tk.type) {
- case CBRACE:
- groupNode = new Tree<>(new Node(GROUP, Node.GroupType.CODE));
- break;
- case CBRACKET:
- groupNode = new Tree<>(new Node(GROUP, Node.GroupType.ARRAY));
- break;
- default:
- break;
- }
-
- Token matching = null;
- if(tk.type == CBRACKET) {
- matching = new Token(Token.Type.OBRACKET, tk.intValue);
- } else if(tk.type == CBRACE) {
- matching = new Token(Token.Type.OBRACE, tk.intValue);
- }
-
- ITree<Node> matchNode = new Tree<>(new Node(OGROUP, matching));
- if(!working.contains(matchNode)) {
- Errors.inst.printError(EK_PARSE_UNCLOSE, tk.toString(), matchNode.toString());
-
- System.out.println("\tCurrent forest is: ");
-
- int treeNo = 1;
- for(ITree<Node> ast : working) {
- System.out.println("Tree " + treeNo++ + ": " + ast.toString());
- }
-
- return false;
- } else {
- Deque<ITree<Node>> childs = new LinkedList<>();
-
- while(!working.peek().equals(matchNode)) {
- childs.push(working.pop());
- }
-
- // Discard opener
- working.pop();
-
- for(ITree<Node> child : childs) {
- groupNode.addChild(child);
- }
-
- working.push(groupNode);
- }
-
- return true;
- }
-}
diff --git a/dice-lang/src/bjc/dicelang/v2/Shunter.java b/dice-lang/src/bjc/dicelang/v2/Shunter.java
deleted file mode 100644
index 28dafef..0000000
--- a/dice-lang/src/bjc/dicelang/v2/Shunter.java
+++ /dev/null
@@ -1,258 +0,0 @@
-package bjc.dicelang.v2;
-
-import bjc.utils.funcdata.FunctionalList;
-import bjc.utils.funcdata.FunctionalMap;
-import bjc.utils.funcdata.IList;
-import bjc.utils.funcdata.IMap;
-
-import static bjc.dicelang.v2.Errors.ErrorKey.*;
-import static bjc.dicelang.v2.Token.Type.*;
-
-import java.util.Deque;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.Set;
-
-public class Shunter {
- // The binary operators and their
- // priorities
- private IMap<Token.Type, Integer> ops;
-
- // Unary operators that can only be
- // applied to non-operator tokens and yield operator tokens
- private Set<Token.Type> unaryAdjectives;
-
- // Unary operators that can only be
- // applied to operator tokens and yield operator tokens
- private Set<Token.Type> unaryAdverbs;
-
- // Unary operators that can only be
- // applied to operator tokens and yield data tokens
- private Set<Token.Type> unaryGerunds;
-
- private final int MATH_PREC = 20;
- private final int DICE_PREC = 10;
- private final int EXPR_PREC = 0;
-
- public Shunter() {
- ops = new FunctionalMap<>();
-
- unaryAdjectives = new HashSet<>();
- unaryAdverbs = new HashSet<>();
- unaryGerunds = new HashSet<>();
-
- unaryAdverbs.add(COERCE);
-
- ops.put(ADD, 0 + MATH_PREC);
- ops.put(SUBTRACT, 0 + MATH_PREC);
-
- ops.put(MULTIPLY, 1 + MATH_PREC);
- ops.put(IDIVIDE, 1 + MATH_PREC);
- ops.put(DIVIDE, 1 + MATH_PREC);
-
- ops.put(DICEGROUP, 0 + DICE_PREC);
-
- ops.put(DICECONCAT, 1 + DICE_PREC);
-
- ops.put(DICELIST, 2 + DICE_PREC);
-
- ops.put(LET, 0 + EXPR_PREC);
- ops.put(BIND, 1 + EXPR_PREC);
- }
-
- private boolean isUnary(Token tk) {
- Token.Type ty = tk.type;
-
- if(unaryAdjectives.contains(ty)) return true;
- if(unaryAdverbs.contains(ty)) return true;
- if(unaryGerunds.contains(ty)) return true;
-
- return false;
- }
-
- private boolean isOp(Token tk) {
- Token.Type ty = tk.type;
-
- if(ops.containsKey(ty)) return true;
- if(unaryAdjectives.contains(ty)) return true;
- if(unaryAdverbs.contains(ty)) return true;
- if(unaryGerunds.contains(ty)) return true;
- if(ty == TAGOPR) return true;
-
- return false;
- }
-
- private boolean shuntToken(Token tk, Deque<Token> opStack,
- Deque<Token> unaryStack, Deque<Token> currReturned,
- Deque<Token> feed) {
- if(unaryStack.size() != 0) {
- if(isUnary(tk)) {
- unaryStack.add(tk);
- return true;
- }
-
- Token unaryOp = unaryStack.pop();
-
- Token.Type unaryType = unaryOp.type;
-
- if(unaryAdjectives.contains(unaryType)) {
- if(isOp(tk)) {
- Errors.inst.printError(EK_SHUNT_NOTADV, unaryOp.toString(), tk.toString());
- return false;
- }
-
- Token newTok = new Token(TAGOPR);
-
- if(tk.type == TAGOP) {
- newTok.tokenValues = tk.tokenValues;
- } else {
- newTok.tokenValues = new FunctionalList<>(tk);
- }
-
- newTok.tokenValues.add(unaryOp);
- opStack.push(newTok);
-
- return true;
- } else if(unaryAdverbs.contains(unaryType)) {
- if(!isOp(tk)) {
- Errors.inst.printError(EK_SHUNT_NOTADJ, unaryOp.toString(), tk.toString());
- return false;
- }
-
- Token newTok = new Token(TAGOPR);
-
- if(tk.type == TAGOP) {
- newTok.tokenValues = tk.tokenValues;
- } else {
- newTok.tokenValues = new FunctionalList<>(tk);
- }
-
- newTok.tokenValues.add(unaryOp);
- opStack.push(newTok);
-
- return true;
- }
- }
-
- if(isUnary(tk)) {
- unaryStack.add(tk);
- return true;
- } else if(isOp(tk)) {
- while(!opStack.isEmpty() && isHigherPrec(tk, opStack.peek())) {
- currReturned.addLast(opStack.pop());
- }
-
- opStack.push(tk);
- } else if(tk.type == OPAREN || tk.type == OBRACE) {
- opStack.push(tk);
-
- if(tk.type == OBRACE) currReturned.addLast(tk);
- } else if(tk.type == CPAREN || tk.type == CBRACE) {
- Token matching = null;
-
- switch(tk.type) {
- case CPAREN:
- matching = new Token(OPAREN, tk.intValue);
- break;
- case CBRACE:
- matching = new Token(OBRACE, tk.intValue);
- break;
- default:
- break;
- }
-
- if(!opStack.contains(matching)) {
- Errors.inst.printError(EK_SHUNT_NOGROUP, tk.toString(), matching.toString());
- return false;
- }
-
- while(!opStack.peek().equals(matching)) {
- currReturned.addLast(opStack.pop());
- }
-
- if(tk.type == CBRACE) {
- currReturned.addLast(tk);
- }
-
- opStack.pop();
- } else if(tk.type == GROUPSEP) {
- IList<Token> group = new FunctionalList<>();
-
- while(currReturned.size() != 0 && !currReturned.peek().isGrouper()) {
- group.add(currReturned.pop());
- }
-
- while(opStack.size() != 0 && !opStack.peek().isGrouper()) {
- group.add(opStack.pop());
- }
-
- if(currReturned.size() == 0) {
- Errors.inst.printError(EK_SHUNT_INVSEP);
- return false;
- }
-
- currReturned.addLast(new Token(TOKGROUP, group));
- } else {
- currReturned.addLast(tk);
- }
-
- return true;
- }
-
- public boolean shuntTokens(IList<Token> tks, IList<Token> returned) {
- Deque<Token> opStack = new LinkedList<>();
- Deque<Token> unaryOps = new LinkedList<>();
-
- Deque<Token> currReturned = new LinkedList<>();
-
- Deque<Token> feed = new LinkedList<>();
-
- for(Token tk : tks.toIterable()) {
- while(feed.size() != 0)
- shuntToken(feed.poll(), opStack, unaryOps, currReturned, feed);
- shuntToken(tk, opStack, unaryOps, currReturned, feed);
- }
-
- // Flush leftover operators
- while(!opStack.isEmpty()) {
- currReturned.addLast(opStack.pop());
- }
-
- for(Token tk : currReturned) {
- returned.add(tk);
- }
-
- return true;
- }
-
- private boolean isHigherPrec(Token lft, Token rght) {
- Token.Type left = lft.type;
- Token.Type right = rght.type;
-
- boolean exists = ops.containsKey(right);
-
- if(rght.type == TAGOPR) exists = true;
-
- // If it doesn't, the left is higher precedence.
- if (!exists) {
- return false;
- }
-
- int rightPrecedence;
- int leftPrecedence;
-
- if(rght.type == TAGOPR) {
- rightPrecedence = (int)rght.intValue;
- } else {
- rightPrecedence = ops.get(right);
- }
-
- if(lft.type == TAGOPR) {
- leftPrecedence = (int)lft.intValue;
- } else {
- leftPrecedence = ops.get(left);
- }
-
- return rightPrecedence >= leftPrecedence;
- }
-}
diff --git a/dice-lang/src/bjc/dicelang/v2/StreamEngine.java b/dice-lang/src/bjc/dicelang/v2/StreamEngine.java
deleted file mode 100644
index cd43e92..0000000
--- a/dice-lang/src/bjc/dicelang/v2/StreamEngine.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package bjc.dicelang.v2;
-
-import bjc.utils.funcdata.FunctionalList;
-import bjc.utils.funcdata.IList;
-import bjc.utils.funcutils.ListUtils;
-
-import static bjc.dicelang.v2.Errors.ErrorKey.*;
-
-import bjc.utils.esodata.SingleTape;
-import bjc.utils.esodata.Tape;
-
-public class StreamEngine {
- private DiceLangEngine eng;
-
- private Tape<IList<String>> streams;
- private IList<String> currStream;
-
- public StreamEngine(DiceLangEngine engine) {
- eng = engine;
- }
-
- private void init() {
- streams = new SingleTape<>();
-
- currStream = new FunctionalList<>();
- streams.insertBefore(currStream);
- }
-
- public boolean doStreams(String[] toks, IList<String> dest) {
- init();
-
- boolean quoteMode = false;
-
- for(String tk : toks) {
- if(tk.startsWith("{@S") && !quoteMode) {
- if(tk.equals("{@SQ}")) {
- quoteMode = true;
- } else if(!processCommand(tk)) {
- return false;
- }
- // Command ran correctly, continue
- } else {
- if(tk.equals("{@SU}")) {
- quoteMode = false;
- } else if(tk.startsWith("\\") && tk.endsWith("{@SU}")) {
- currStream.add(tk.substring(1));
- } else {
- currStream.add(tk);
- }
- }
- }
-
- for(String tk : currStream) {
- dest.add(tk);
- }
-
- return true;
- }
-
- private boolean processCommand(String tk) {
- char[] comms = null;
-
- if(tk.length() > 5) {
- comms = tk.substring(3, tk.length() - 1).toCharArray();
- } else {
- comms = new char[1];
- comms[0] = tk.charAt(3);
- }
-
- for(char comm : comms) {
- switch(comm) {
- case '+':
- streams.insertAfter(new FunctionalList<>());
- break;
- case '>':
- if(!streams.right()) {
- Errors.inst.printError(EK_STRM_NONEX);
- return false;
- }
-
- currStream = streams.item();
- break;
- case '<':
- if(!streams.left()) {
- Errors.inst.printError(EK_STRM_NONEX);
- return false;
- }
-
- currStream = streams.item();
- break;
- case '-':
- if(streams.size() == 1) {
- Errors.inst.printError(EK_STRM_LAST);
- return false;
- } else {
- streams.remove();
- currStream = streams.item();
- }
- break;
- case 'S':
- if(streams.size() == 1) {
- Errors.inst.printError(EK_STRM_LAST);
- return false;
- } else {
- IList<String> stringLit = streams.remove();
- currStream = streams.item();
- currStream.add(ListUtils.collapseTokens(stringLit, " "));
- }
- break;
- default:
- Errors.inst.printError(EK_STRM_INVCOM, tk);
- return false;
- }
- }
-
- return true;
- }
-}
diff --git a/dice-lang/src/bjc/dicelang/v2/Token.java b/dice-lang/src/bjc/dicelang/v2/Token.java
deleted file mode 100644
index 3d8359f..0000000
--- a/dice-lang/src/bjc/dicelang/v2/Token.java
+++ /dev/null
@@ -1,140 +0,0 @@
-package bjc.dicelang.v2;
-
-import bjc.dicelang.v2.dice.DieExpression;
-import bjc.utils.funcdata.IList;
-
-/**
- * Lexer token
- */
-public class Token {
- public final static Token NIL_TOKEN = new Token(Type.NIL);
-
- /**
- * Possible token types
- */
- public static enum Type {
- // Natural tokens
- // These are produced from lexemes
- ADD, SUBTRACT,
- MULTIPLY,
- DIVIDE, IDIVIDE,
- INT_LIT, FLOAT_LIT, STRING_LIT,
- VREF,
- DICE_LIT, DICEGROUP, DICECONCAT, DICELIST,
- LET, BIND, COERCE,
- OPAREN, CPAREN,
- OBRACKET, CBRACKET,
- OBRACE, CBRACE,
-
- // Synthetic tokens
- // These are produced when needed
- NIL, GROUPSEP, TOKGROUP,
- TAGOP, TAGOPR
- }
-
- public final Type type;
-
- // This is used for the following token types
- // INT_LIT (int value)
- // STRING_LIT (index into string table)
- // VREF (index into sym table)
- // O* and C* (sym-count of current token)
- public long intValue;
-
- // This is used for the following token types
- // FLOAT_LIT (float value)
- public double floatValue;
-
- // This is used for the following token types
- // DICE_LIT (dice value)
- public DieExpression diceValue;
-
- // This is used for the following token types
- // TOKGROUP (the tokens in the group)
- // TAG* (the tagged construct)
- public IList<Token> tokenValues;
-
- public Token(Type typ) {
- type = typ;
- }
-
- public Token(Type typ, long val) {
- this(typ);
-
- intValue = val;
- }
-
- public Token(Type typ, double val) {
- this(typ);
-
- floatValue = val;
- }
-
- public Token(Type typ, DieExpression val) {
- this(typ);
-
- diceValue = val;
- }
-
- public Token(Type typ, IList<Token> tkVals) {
- this(typ);
-
- tokenValues = tkVals;
- }
-
- public String toString() {
- switch(type) {
- case INT_LIT:
- case STRING_LIT:
- case VREF:
- case OPAREN:
- case CPAREN:
- case OBRACKET:
- case CBRACKET:
- case OBRACE:
- case CBRACE:
- return type.toString() + "("
- + intValue + ")";
- case FLOAT_LIT:
- return type.toString() + "("
- + floatValue + ")";
- case DICE_LIT:
- return type.toString() + "("
- + diceValue + ")";
- case TAGOP:
- case TAGOPR:
- case TOKGROUP:
- return type.toString() + "("
- + tokenValues + ")";
- default:
- return type.toString();
- }
- }
-
- public boolean equals(Object other) {
- if(!(other instanceof Token)) return false;
-
- Token otk = (Token)other;
-
- if(otk.type != type) return false;
-
- switch(type) {
- case OBRACE:
- case OBRACKET:
- return intValue == otk.intValue;
- default:
- return true;
- }
- }
-
- public boolean isGrouper() {
- switch(type) {
- case OPAREN:
- case OBRACE:
- case OBRACKET:
- return true;
- default:
- return false;
- }
- }
-}
diff --git a/dice-lang/src/bjc/dicelang/v2/Tokenizer.java b/dice-lang/src/bjc/dicelang/v2/Tokenizer.java
deleted file mode 100644
index 40b1285..0000000
--- a/dice-lang/src/bjc/dicelang/v2/Tokenizer.java
+++ /dev/null
@@ -1,154 +0,0 @@
-package bjc.dicelang.v2;
-
-import static bjc.dicelang.v2.Errors.ErrorKey.*;
-import static bjc.dicelang.v2.Token.Type.*;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import bjc.dicelang.v2.dice.DiceBox;
-import bjc.utils.funcdata.FunctionalMap;
-import bjc.utils.funcdata.IMap;
-import bjc.utils.funcutils.StringUtils;
-
-public class Tokenizer {
- // Literal tokens for tokenization
- private IMap<String, Token.Type> litTokens;
-
- private DiceLangEngine eng;
-
- private int nextSym = 0;
-
- public Tokenizer(DiceLangEngine engine) {
- eng = engine;
-
- litTokens = new FunctionalMap<>();
-
- litTokens.put("+", ADD);
- litTokens.put("-", SUBTRACT);
- litTokens.put("*", MULTIPLY);
- litTokens.put("/", DIVIDE);
- litTokens.put("//", IDIVIDE);
- litTokens.put("dg", DICEGROUP);
- litTokens.put("dc", DICECONCAT);
- litTokens.put("dl", DICELIST);
- litTokens.put("=>", LET);
- litTokens.put(":=", BIND);
- litTokens.put(",", GROUPSEP);
- litTokens.put("crc", COERCE);
- }
-
- public Token lexToken(String token, IMap<String, String> stringLts) {
- if(token.equals("")) return null;
-
- Token tk = Token.NIL_TOKEN;
-
- if(litTokens.containsKey(token)) {
- tk = new Token(litTokens.get(token));
- } else {
- switch(token.charAt(0)) {
- case '(':
- case ')':
- case '[':
- case ']':
- case '{':
- case '}':
- tk = tokenizeGrouping(token);
- break;
- default:
- tk = tokenizeLiteral(token, stringLts);
- }
- }
-
- return tk;
- }
-
- private Token tokenizeGrouping(String token) {
- Token tk = Token.NIL_TOKEN;
-
- if(StringUtils.containsOnly(token, "\\" + token.charAt(0))) {
- switch(token.charAt(0)) {
- case '(':
- tk = new Token(OPAREN, token.length());
- break;
- case ')':
- tk = new Token(CPAREN, token.length());
- break;
- case '[':
- tk = new Token(OBRACKET, token.length());
- break;
- case ']':
- tk = new Token(CBRACKET, token.length());
- break;
- case '{':
- tk = new Token(OBRACE, token.length());
- break;
- case '}':
- tk = new Token(CBRACE, token.length());
- break;
- default:
- Errors.inst.printError(EK_TOK_UNGROUP, token);
- break;
- }
- }
-
- return tk;
- }
-
- private Pattern intMatcher = Pattern.compile("\\A[\\-\\+]?\\d+\\Z");
- private Pattern hexadecimalMatcher = Pattern.compile("\\A[\\-\\+]?0x[0-9A-Fa-f]+\\Z");
- private Pattern flexadecimalMatcher = Pattern.compile("\\A[\\-\\+]?[0-9][0-9A-Za-z]+B\\d{1,2}\\Z");
- private Pattern stringLitMatcher = Pattern.compile("\\AstringLiteral(\\d+)\\Z");
-
- private Token tokenizeLiteral(String token, IMap<String, String> stringLts) {
- Token tk = Token.NIL_TOKEN;
-
- if(intMatcher.matcher(token).matches()) {
- tk = new Token(INT_LIT, Long.parseLong(token));
- } else if(hexadecimalMatcher.matcher(token).matches()) {
- String newToken = token.substring(0, 1) + token.substring(token.indexOf('x'));
-
- tk = new Token(INT_LIT, Long.parseLong(newToken.substring(2).toUpperCase(), 16));
- } else if(flexadecimalMatcher.matcher(token).matches()) {
- int parseBase = Integer.parseInt(token.substring(token.lastIndexOf('B') + 1));
-
- if(parseBase < Character.MIN_RADIX || parseBase > Character.MAX_RADIX) {
- Errors.inst.printError(EK_TOK_INVBASE, Integer.toString(parseBase));
- return Token.NIL_TOKEN;
- }
-
- String flexNum = token.substring(0, token.lastIndexOf('B'));
-
- try {
- tk = new Token(INT_LIT, Long.parseLong(flexNum, parseBase));
- } catch (NumberFormatException nfex) {
- Errors.inst.printError(EK_TOK_INVFLEX, flexNum, Integer.toString(parseBase));
- return Token.NIL_TOKEN;
- }
- } else if(DoubleMatcher.floatingLiteral.matcher(token).matches()) {
- tk = new Token(FLOAT_LIT, Double.parseDouble(token));
- } else if(DiceBox.isValidExpression(token)) {
- tk = new Token(DICE_LIT, DiceBox.parseExpression(token));
- } else {
- Matcher stringLit = stringLitMatcher.matcher(token);
-
- if(stringLit.matches()) {
- int litNum = Integer.parseInt(stringLit.group(1));
-
- eng.stringLits.put(litNum, stringLts.get(token));
- tk = new Token(STRING_LIT, litNum);
- } else {
- // @TODO define what a valid identifier is
- eng.symTable.put(nextSym++, token);
-
- tk = new Token(VREF, nextSym - 1);
- }
-
- // @TODO uncomment when we have a defn. for var names
- // System.out.printf("\tERROR: Unrecognized token:"
- // + "%s\n", token);
- }
-
- return tk;
- }
-}
diff --git a/dice-lang/src/bjc/dicelang/v2/dice/CompoundDie.java b/dice-lang/src/bjc/dicelang/v2/dice/CompoundDie.java
deleted file mode 100644
index a8186eb..0000000
--- a/dice-lang/src/bjc/dicelang/v2/dice/CompoundDie.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package bjc.dicelang.v2.dice;
-
-public class CompoundDie implements Die {
- private Die left;
- private Die right;
-
- public CompoundDie(Die lft, Die rght) {
- left = lft;
- right = rght;
- }
-
- public boolean canOptimize() {
- return left.canOptimize() && right.canOptimize();
- }
-
- public long optimize() {
- return Long.parseLong(left.optimize() + "" + right.optimize());
- }
-
- public long roll() {
- return Long.parseLong(left.roll() + "" + right.roll());
- }
-
- public long rollSingle() {
- return roll();
- }
-
- public String toString() {
- return left.toString() + "c" + right.toString();
- }
-} \ No newline at end of file
diff --git a/dice-lang/src/bjc/dicelang/v2/dice/CompoundingDie.java b/dice-lang/src/bjc/dicelang/v2/dice/CompoundingDie.java
deleted file mode 100644
index d5991ae..0000000
--- a/dice-lang/src/bjc/dicelang/v2/dice/CompoundingDie.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package bjc.dicelang.v2.dice;
-
-import java.util.function.Predicate;
-
-public class CompoundingDie implements Die {
- private Die source;
-
- private Predicate<Long> compoundOn;
- private String compoundPattern;
-
- public CompoundingDie(Die src, Predicate<Long> compound) {
- this(src, compound, null);
- }
-
- public CompoundingDie(Die src, Predicate<Long> compound, String patt) {
- source = src;
-
- compoundOn = compound;
- compoundPattern = patt;
- }
-
- public boolean canOptimize() {
- return source.canOptimize() && source.optimize() == 0;
- }
-
- public long optimize() {
- return 0;
- }
-
- public long roll() {
- long res = source.roll();
- long oldRes = res;
-
- while(compoundOn.test(oldRes)) {
- oldRes = source.rollSingle();
-
- res += oldRes;
- }
-
- return res;
- }
-
- public long rollSingle() {
- long res = source.rollSingle();
- long oldRes = res;
-
- while(compoundOn.test(oldRes)) {
- oldRes = source.rollSingle();
-
- res += oldRes;
- }
-
- return res;
- }
-
- public String toString() {
- if(compoundPattern == null) {
- return source + "!!";
- } else {
- return source + "!!" + compoundPattern;
- }
- }
-} \ No newline at end of file
diff --git a/dice-lang/src/bjc/dicelang/v2/dice/DiceBox.java b/dice-lang/src/bjc/dicelang/v2/dice/DiceBox.java
deleted file mode 100644
index 995c3bf..0000000
--- a/dice-lang/src/bjc/dicelang/v2/dice/DiceBox.java
+++ /dev/null
@@ -1,142 +0,0 @@
-package bjc.dicelang.v2.dice;
-
-import java.util.Random;
-import java.util.function.Predicate;
-import java.util.regex.Pattern;
-
-public class DiceBox {
- static final Random rng = new Random();
-
- public static DieExpression parseExpression(String exp) {
- if(!isValidExpression(exp)) return null;
-
- if(scalarDiePattern.matcher(exp).matches()) {
- Die scal = new ScalarDie(Long.parseLong(exp.substring(0, exp.indexOf('s'))));
-
- return new DieExpression(scal);
- } else if(simpleDiePattern.matcher(exp).matches()) {
- String[] dieParts = exp.split("d");
-
- long right = Long.parseLong(dieParts[1]);
- if(dieParts[0].equals("")) {
- Die scal = new SimpleDie(1, right);
- return new DieExpression(scal);
- } else {
- Die scal = new SimpleDie(Long.parseLong(dieParts[0]), right);
- return new DieExpression(scal);
- }
- } else if(fudgeDiePattern.matcher(exp).matches()) {
- String nDice = exp.substring(0, exp.indexOf('d'));
-
- return new DieExpression(new FudgeDie(Long.parseLong(nDice)));
- } else if(compoundDiePattern.matcher(exp).matches()) {
- String[] dieParts = exp.split("c");
-
- DieExpression left = parseExpression(dieParts[0]);
- DieExpression right = parseExpression(dieParts[1]);
-
- return new DieExpression(new CompoundDie(left.scalar, right.scalar));
- } else if(compoundingDiePattern.matcher(exp).matches()) {
- String[] dieParts = exp.split("!!");
-
- DieExpression left = parseExpression(dieParts[0]);
- Predicate<Long> right = deriveCond(dieParts[1]);
-
- Die scal = new CompoundingDie(left.scalar, right, dieParts[1]);
- return new DieExpression(scal);
- } else if(explodingDiePattern.matcher(exp).matches()) {
- String[] dieParts = exp.split("!");
-
- DieExpression left = parseExpression(dieParts[0]);
- Predicate<Long> right = deriveCond(dieParts[1]);
-
- DieList lst = new ExplodingDice(left.scalar, right, dieParts[1], false);
- return new DieExpression(lst);
- } else if(penetratingDiePattern.matcher(exp).matches()) {
- String[] dieParts = exp.split("p!");
-
- DieExpression left = parseExpression(dieParts[0]);
- Predicate<Long> right = deriveCond(dieParts[1]);
-
- DieList lst = new ExplodingDice(left.scalar, right, dieParts[1], true);
- return new DieExpression(lst);
- } else if(diceListPattern.matcher(exp).matches()) {
- String[] dieParts = exp.split("dl");
-
- DieExpression left = parseExpression(dieParts[0]);
- DieExpression right = parseExpression(dieParts[1]);
-
- DieList lst = new SimpleDieList(left.scalar, right.scalar);
- return new DieExpression(lst);
- }
-
- // @TODO give a specific error message
- return null;
- }
-
- private static final String comparePoint = "[<>=]\\d+";
-
- private static final String scalarDie = "[\\+\\-]?\\d+sd";
- private static final Pattern scalarDiePattern = Pattern.compile("\\A" + scalarDie + "\\Z");
-
- private static final String simpleDie = "(?:\\d+)?d\\d+";
- private static final Pattern simpleDiePattern = Pattern.compile("\\A" + simpleDie + "\\Z");
-
- private static final String fudgeDie = "(?:\\d+)?dF";
- private static final Pattern fudgeDiePattern = Pattern.compile("\\A" + fudgeDie + "\\Z");
-
- private static final String compoundDie = simpleDie + "c(?:(?:" + simpleDie + ")|(?:\\d+))";
- private static final Pattern compoundDiePattern = Pattern.compile("\\A" + compoundDie + "\\Z");
-
- private static final String compoundGroup = "(?:(?:" + scalarDie + ")|(?:" + simpleDie + ")|(?:"
- + compoundDie + ")|(?:" + fudgeDie +"))";
-
- private static final String compoundingDie = compoundGroup + "!!" + comparePoint;
- private static final Pattern compoundingDiePattern = Pattern.compile("\\A" + compoundingDie + "\\Z");
-
- private static final String explodingDie = compoundGroup + "!" + comparePoint;
- private static final Pattern explodingDiePattern = Pattern.compile("\\A" + explodingDie + "\\Z");
-
- private static final String penetratingDie = compoundGroup + "!" + comparePoint;
- private static final Pattern penetratingDiePattern = Pattern.compile("\\A" + penetratingDie + "\\Z");
-
- private static final String diceList = compoundGroup + "dl" + compoundGroup;
- private static final Pattern diceListPattern = Pattern.compile("\\A" + diceList + "\\Z");
-
- public static boolean isValidExpression(String exp) {
- if(scalarDiePattern.matcher(exp).matches()) {
- return true;
- } else if(simpleDiePattern.matcher(exp).matches()) {
- return true;
- } else if(fudgeDiePattern.matcher(exp).matches()) {
- return true;
- } else if(compoundDiePattern.matcher(exp).matches()) {
- return true;
- } else if(compoundingDiePattern.matcher(exp).matches()) {
- return true;
- } else if(explodingDiePattern.matcher(exp).matches()) {
- return true;
- } else if(penetratingDiePattern.matcher(exp).matches()) {
- return true;
- } else if (diceListPattern.matcher(exp).matches()) {
- return true;
- } else {
- return false;
- }
- }
-
- private static Predicate<Long> deriveCond(String patt) {
- long num = Long.parseLong(patt.substring(1));
-
- switch(patt.charAt(0)) {
- case '<':
- return (roll) -> roll < num;
- case '=':
- return (roll) -> roll == num;
- case '>':
- return (roll) -> roll > num;
- default:
- return (roll) -> false;
- }
- }
-}
diff --git a/dice-lang/src/bjc/dicelang/v2/dice/Die.java b/dice-lang/src/bjc/dicelang/v2/dice/Die.java
deleted file mode 100644
index 808d7fd..0000000
--- a/dice-lang/src/bjc/dicelang/v2/dice/Die.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package bjc.dicelang.v2.dice;
-
-public interface Die {
- boolean canOptimize();
- long optimize();
-
- long roll();
- long rollSingle();
-} \ No newline at end of file
diff --git a/dice-lang/src/bjc/dicelang/v2/dice/DieExpression.java b/dice-lang/src/bjc/dicelang/v2/dice/DieExpression.java
deleted file mode 100644
index 93fcbb9..0000000
--- a/dice-lang/src/bjc/dicelang/v2/dice/DieExpression.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package bjc.dicelang.v2.dice;
-
-import java.util.Arrays;
-
-public class DieExpression {
- public final boolean isList;
-
- public Die scalar;
- public DieList list;
-
- public DieExpression(Die scal) {
- isList = false;
- scalar = scal;
- }
-
- public DieExpression(DieList lst) {
- isList = true;
- list = lst;
- }
-
- public String toString() {
- if(isList) return list.toString();
- else return scalar.toString();
- }
-
- public String value() {
- if(isList) return Arrays.toString(list.roll());
- else return Long.toString(scalar.roll());
- }
-} \ No newline at end of file
diff --git a/dice-lang/src/bjc/dicelang/v2/dice/DieList.java b/dice-lang/src/bjc/dicelang/v2/dice/DieList.java
deleted file mode 100644
index ab3c7b7..0000000
--- a/dice-lang/src/bjc/dicelang/v2/dice/DieList.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package bjc.dicelang.v2.dice;
-
-public interface DieList {
- boolean canOptimize();
- long[] optimize();
-
- long[] roll();
-} \ No newline at end of file
diff --git a/dice-lang/src/bjc/dicelang/v2/dice/ExplodingDice.java b/dice-lang/src/bjc/dicelang/v2/dice/ExplodingDice.java
deleted file mode 100644
index 40ff1e0..0000000
--- a/dice-lang/src/bjc/dicelang/v2/dice/ExplodingDice.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package bjc.dicelang.v2.dice;
-
-import java.util.LinkedList;
-import java.util.List;
-import java.util.function.Predicate;
-
-public class ExplodingDice implements DieList {
- private Die source;
-
- private Predicate<Long> explodeOn;
- private String explodePattern;
- private boolean explodePenetrates;
-
- public ExplodingDice(Die src, Predicate<Long> explode) {
- this(src, explode, null, false);
- }
-
- public ExplodingDice(Die src, Predicate<Long> explode, boolean penetrate) {
- this(src, explode, null, penetrate);
- }
-
- public ExplodingDice(Die src, Predicate<Long> explode, String patt,
- boolean penetrate) {
- source = src;
- explodeOn = explode;
- explodePattern = patt;
- explodePenetrates = penetrate;
- }
-
- public boolean canOptimize() {
- return false;
- }
-
- public long[] optimize() {
- return new long[0];
- }
-
- public long[] roll() {
- long res = source.roll();
- long oldRes = res;
-
- List<Long> resList = new LinkedList<>();
-
- while(explodeOn.test(oldRes)) {
- oldRes = source.rollSingle();
-
- if(explodePenetrates) oldRes -= 1;
- resList.add(oldRes);
- }
-
- long[] newRes = new long[resList.size() + 1];
- newRes[0] = res;
-
- int i = 1;
- for(long rll : resList) {
- newRes[i] = rll;
- i += 1;
- }
-
- return newRes;
- }
-
- public String toString() {
- if(explodePattern == null) {
- return source + (explodePenetrates ? "p" : "") + "!";
- } else {
- return source + (explodePenetrates ? "p" : "") + "!" + explodePattern;
- }
- }
-} \ No newline at end of file
diff --git a/dice-lang/src/bjc/dicelang/v2/dice/FudgeDie.java b/dice-lang/src/bjc/dicelang/v2/dice/FudgeDie.java
deleted file mode 100644
index 4c8c52a..0000000
--- a/dice-lang/src/bjc/dicelang/v2/dice/FudgeDie.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package bjc.dicelang.v2.dice;
-
-public class FudgeDie implements Die {
- private Die numDice;
-
- public FudgeDie(long nDice) {
- numDice = new ScalarDie(nDice);
- }
-
- public boolean canOptimize() {
- return numDice.canOptimize() && numDice.optimize() == 0;
- }
-
- public long optimize() {
- return 0;
- }
-
- public long roll() {
- long res = 0;
-
- long nDice = numDice.roll();
-
- for(int i = 0; i < nDice; i++) {
- res += rollSingle();
- }
-
- return res;
- }
-
- public long rollSingle() {
- return DiceBox.rng.nextInt(3) - 1;
- }
-
- public String toString() {
- return numDice + "dF";
- }
-} \ No newline at end of file
diff --git a/dice-lang/src/bjc/dicelang/v2/dice/MathDie.java b/dice-lang/src/bjc/dicelang/v2/dice/MathDie.java
deleted file mode 100644
index 55e01f8..0000000
--- a/dice-lang/src/bjc/dicelang/v2/dice/MathDie.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package bjc.dicelang.v2.dice;
-
-public class MathDie implements Die {
- public static enum MathOp {
- ADD, SUBTRACT, MULTIPLY;
-
- public String toString() {
- switch(this) {
- case ADD:
- return "+";
- case SUBTRACT:
- return "-";
- case MULTIPLY:
- return "*";
- default:
- return this.name();
- }
- }
- }
-
- private MathDie.MathOp type;
-
- private Die left;
- private Die right;
-
- public MathDie(MathDie.MathOp op, Die lft, Die rght) {
- type = op;
-
- left = lft;
- right = rght;
- }
-
- public boolean canOptimize() {
- return left.canOptimize() && right.canOptimize();
- }
-
- private long performOp(long lft, long rght) {
- switch(type) {
- case ADD:
- return lft + rght;
- case SUBTRACT:
- return lft - rght;
- case MULTIPLY:
- return lft * rght;
- default:
- return 0;
- }
- }
-
- public long optimize() {
- long lft = left.optimize();
- long rght = right.optimize();
-
- return performOp(lft, rght);
- }
-
- public long roll() {
- long lft = left.roll();
- long rght = right.roll();
-
- return performOp(lft, rght);
- }
-
- public long rollSingle() {
- long lft = left.rollSingle();
- long rght = right.rollSingle();
-
- return performOp(lft, rght);
- }
-
- public String toString() {
- return left.toString() + " " + type.toString() + " " + right.toString();
- }
-} \ No newline at end of file
diff --git a/dice-lang/src/bjc/dicelang/v2/dice/ScalarDie.java b/dice-lang/src/bjc/dicelang/v2/dice/ScalarDie.java
deleted file mode 100644
index 17714ee..0000000
--- a/dice-lang/src/bjc/dicelang/v2/dice/ScalarDie.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package bjc.dicelang.v2.dice;
-
-public class ScalarDie implements Die {
- private long val;
-
- public ScalarDie(long vl) {
- val = vl;
- }
-
- public boolean canOptimize() {
- return true;
- }
-
- public long optimize() {
- return val;
- }
-
- public long roll() {
- return val;
- }
-
- public long rollSingle() {
- return val;
- }
-
- public String toString() {
- return Long.toString(val);
- }
-} \ No newline at end of file
diff --git a/dice-lang/src/bjc/dicelang/v2/dice/SimpleDie.java b/dice-lang/src/bjc/dicelang/v2/dice/SimpleDie.java
deleted file mode 100644
index f084822..0000000
--- a/dice-lang/src/bjc/dicelang/v2/dice/SimpleDie.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package bjc.dicelang.v2.dice;
-
-public class SimpleDie implements Die {
- private Die numDice;
- private Die diceSize;
-
- public SimpleDie(long nDice, long size) {
- numDice = new ScalarDie(nDice);
- diceSize = new ScalarDie(size);
- }
-
- public SimpleDie(Die nDice, long size) {
- numDice = nDice;
- diceSize = new ScalarDie(size);
- }
-
- public SimpleDie(long nDice, Die size) {
- numDice = new ScalarDie(nDice);
- diceSize = size;
- }
-
- public SimpleDie(Die nDice, Die size) {
- numDice = nDice;
- diceSize = size;
- }
-
- public boolean canOptimize() {
- if(diceSize.canOptimize() && (diceSize.optimize() <= 1)) {
- return numDice.canOptimize();
- } else return false;
- }
-
- public long optimize() {
- long optSize = diceSize.optimize();
-
- if(optSize == 0) return 0;
- else return numDice.optimize();
- }
-
- public long roll() {
- long total = 0;
-
- long nDice = numDice.roll();
- long dSize = diceSize.roll();
-
- for(int i = 0; i < nDice; i++) {
- total += (Math.abs(DiceBox.rng.nextLong()) % dSize) + 1;
- }
-
- return total;
- }
-
- public long rollSingle() {
- return (Math.abs(DiceBox.rng.nextLong()) % diceSize.roll()) + 1;
- }
-
- public String toString() {
- return numDice + "d" + diceSize;
- }
-} \ No newline at end of file
diff --git a/dice-lang/src/bjc/dicelang/v2/dice/SimpleDieList.java b/dice-lang/src/bjc/dicelang/v2/dice/SimpleDieList.java
deleted file mode 100644
index e5aef18..0000000
--- a/dice-lang/src/bjc/dicelang/v2/dice/SimpleDieList.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package bjc.dicelang.v2.dice;
-
-public class SimpleDieList implements DieList {
- private Die numDice;
- private Die size;
-
- public SimpleDieList(Die nDice, Die sze) {
- numDice = nDice;
- size = sze;
- }
-
- public boolean canOptimize() {
- if(size.canOptimize() && size.optimize() <= 1) {
- return numDice.canOptimize();
- } else {
- return false;
- }
- }
-
- public long[] optimize() {
- int sze = (int)numDice.optimize();
- long res = size.optimize();
-
- long[] ret = new long[sze];
-
- for(int i = 0; i < sze; i++) {
- ret[i] = res;
- }
-
- return ret;
- }
-
- public long[] roll() {
- int num = (int)numDice.roll();
-
- long[] ret = new long[num];
-
- for(int i = 0; i < num; i++) {
- ret[i] = size.roll();
- }
-
- return ret;
- }
-
- public String toString() {
- return numDice.toString() + "dl" + size.toString();
- }
-} \ No newline at end of file