From 438a23c696283dc17a0d5fd1a3e12513deac9030 Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Tue, 26 Jan 2016 11:31:45 -0500 Subject: Added dice roller --- .../java/bjc/utils/dice/DiceExpressionParser.java | 57 ++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 BJC-Utils2/src/main/java/bjc/utils/dice/DiceExpressionParser.java (limited to 'BJC-Utils2/src/main/java/bjc/utils/dice/DiceExpressionParser.java') diff --git a/BJC-Utils2/src/main/java/bjc/utils/dice/DiceExpressionParser.java b/BJC-Utils2/src/main/java/bjc/utils/dice/DiceExpressionParser.java new file mode 100644 index 0000000..3be56e4 --- /dev/null +++ b/BJC-Utils2/src/main/java/bjc/utils/dice/DiceExpressionParser.java @@ -0,0 +1,57 @@ +package bjc.utils.dice; + +import java.util.Stack; + +import bjc.utils.funcdata.FunctionalList; +import bjc.utils.funcdata.FunctionalStringTokenizer; +import bjc.utils.parserutils.ShuntingYard; + +public class DiceExpressionParser { + public DiceExpression parse(String exp) { + FunctionalStringTokenizer fst = new FunctionalStringTokenizer(exp); + + ShuntingYard yard = new ShuntingYard<>(); + + FunctionalList ls = yard.postfix(fst.toList(s -> s), + s -> s); + + Stack dexps = new Stack<>(); + + ls.forEach((tok) -> { + if (tok.contains("d")) { + dexps.push(Dice.fromString(tok)); + } else { + try { + dexps.push(new ScalarDie(Integer.parseInt(tok))); + } catch (NumberFormatException nfex) { + + DiceExpression l = dexps.pop(); + DiceExpression r = dexps.pop(); + + switch (tok) { + case "+": + dexps.push(new CompoundDiceExpression(l, r, + DiceExpressionType.ADD)); + break; + case "-": + dexps.push(new CompoundDiceExpression(l, r, + DiceExpressionType.SUBTRACT)); + break; + case "*": + dexps.push(new CompoundDiceExpression(l, r, + DiceExpressionType.MULTIPLY)); + break; + case "/": + dexps.push(new CompoundDiceExpression(l, r, + DiceExpressionType.DIVIDE)); + break; + default: + throw new IllegalStateException("Detected invalid operator " + tok); + } + } + } + }); + + return dexps.pop(); + } +} -- cgit v1.2.3