summaryrefslogtreecommitdiff
path: root/dice-lang/src/bjc/dicelang/expr/Shunter.java
diff options
context:
space:
mode:
Diffstat (limited to 'dice-lang/src/bjc/dicelang/expr/Shunter.java')
-rw-r--r--dice-lang/src/bjc/dicelang/expr/Shunter.java110
1 files changed, 0 insertions, 110 deletions
diff --git a/dice-lang/src/bjc/dicelang/expr/Shunter.java b/dice-lang/src/bjc/dicelang/expr/Shunter.java
deleted file mode 100644
index 213e473..0000000
--- a/dice-lang/src/bjc/dicelang/expr/Shunter.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package bjc.dicelang.expr;
-
-import java.util.ArrayList;
-import java.util.Deque;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Converts a infix series of tokens into a prefix series of tokens.
- *
- * @author Ben Culkin
- */
-public class Shunter {
- /*
- * @NOTE
- * Why does this method return an array, and not the list of
- * tokens?
- */
- /**
- * Convert a infix series of tokens to a postfix series of tokens.
- *
- * @param infixTokens
- * The tokens in infix order.
- *
- * @return The tokens in postfix order.
- */
- public static Token[] shuntTokens(final Token[] infixTokens) {
- /* The returned tokens. */
- final List<Token> postfixTokens = new ArrayList<>(infixTokens.length);
-
- /* The current stack of operators. */
- final Deque<Token> opStack = new LinkedList<>();
-
- /* Shunt each token. */
- for (final Token tok : infixTokens) {
- /* Handle operators. */
- if (tok.typ.isOperator) {
- Token curOp = opStack.peek();
-
- /*
- * Check if an operator is higher priority,
- * respecting their left associativity.
- *
- * @NOTE
- * Should this be factored out into a
- * method?
- */
- int leftPriority = tok.typ.operatorPriority;
- int rightPriority;
-
- if (curOp == null) {
- rightPriority = 0;
- } else {
- rightPriority = curOp.typ.operatorPriority;
- }
-
- boolean isHigherPrec = leftPriority >= rightPriority;
-
- /*
- * Pop all operators that are lower precedence
- * than us.
- */
- while (!opStack.isEmpty() && isHigherPrec) {
- postfixTokens.add(opStack.pop());
- curOp = opStack.peek();
-
- leftPriority = tok.typ.operatorPriority;
- if (curOp == null) {
- rightPriority = 0;
- } else {
- rightPriority = curOp.typ.operatorPriority;
- }
-
- isHigherPrec = leftPriority >= rightPriority;
- }
-
- opStack.push(tok);
- } else if (tok.typ == TokenType.OPAREN) {
- opStack.push(tok);
- } else if (tok.typ == TokenType.CPAREN) {
- Token curOp = opStack.peek();
-
- /*
- * Pop things until we find the matching
- * parenthesis.
- */
- while (curOp.typ != TokenType.OPAREN) {
- final Token tk = opStack.pop();
- postfixTokens.add(tk);
- curOp = opStack.peek();
- }
-
- if (!opStack.isEmpty()) {
- opStack.pop();
- }
- } else {
- postfixTokens.add(tok);
- }
- }
-
- /*
- * Flush remaining operators.
- */
- while (!opStack.isEmpty()) {
- postfixTokens.add(opStack.pop());
- }
-
- return postfixTokens.toArray(new Token[0]);
- }
-}