diff options
| author | bculkin2442 <bjculkin@mix.wvu.edu> | 2016-01-26 11:31:45 -0500 |
|---|---|---|
| committer | bculkin2442 <bjculkin@mix.wvu.edu> | 2016-01-26 11:31:45 -0500 |
| commit | 438a23c696283dc17a0d5fd1a3e12513deac9030 (patch) | |
| tree | 361e8a7b660fea82a150685f830be7187f305a44 /BJC-Utils2/src/main/java/bjc/utils/dice/DiceExpressionParser.java | |
| parent | 5508eecfa7a7821cbaf650ae1f9a97633e1644b6 (diff) | |
Added dice roller
Diffstat (limited to 'BJC-Utils2/src/main/java/bjc/utils/dice/DiceExpressionParser.java')
| -rw-r--r-- | BJC-Utils2/src/main/java/bjc/utils/dice/DiceExpressionParser.java | 57 |
1 files changed, 57 insertions, 0 deletions
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<String> yard = new ShuntingYard<>(); + + FunctionalList<String> ls = yard.postfix(fst.toList(s -> s), + s -> s); + + Stack<DiceExpression> 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(); + } +} |
