diff options
| author | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2017-10-09 16:02:10 -0300 |
|---|---|---|
| committer | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2017-10-09 16:02:10 -0300 |
| commit | f028ea6dc555fc5192a96b00b8e96e90dbf6de55 (patch) | |
| tree | 4b2a28ecbeb30095b50e6e9e8ac8b98fa8ddc79e /dice-lang/src/bjc/dicelang/expr/Parser.java | |
| parent | be4675f9512060aa85b1e0a4f223208b51b55812 (diff) | |
TODO tagging
Diffstat (limited to 'dice-lang/src/bjc/dicelang/expr/Parser.java')
| -rw-r--r-- | dice-lang/src/bjc/dicelang/expr/Parser.java | 108 |
1 files changed, 47 insertions, 61 deletions
diff --git a/dice-lang/src/bjc/dicelang/expr/Parser.java b/dice-lang/src/bjc/dicelang/expr/Parser.java index 6d34b96..5fa2d3d 100644 --- a/dice-lang/src/bjc/dicelang/expr/Parser.java +++ b/dice-lang/src/bjc/dicelang/expr/Parser.java @@ -13,6 +13,10 @@ import bjc.utils.parserutils.TreeConstructor; * @author Ben Culkin */ public class Parser { + /* + * @TODO 10/08/17 Ben Culkin :MainSeperation + * This main method should be moved to its own class. + */ /** * Main method. * @@ -20,100 +24,81 @@ public class Parser { * Unused CLI args. */ public static void main(final String[] args) { - /* - * Create our objects. - */ + /* Create our objects. */ final Tokens toks = new Tokens(); final Lexer lex = new Lexer(); - /* - * Prepare our input. - */ + /* Prepare our input source. */ final Scanner scan = new Scanner(System.in); - /* - * Read initial command. - */ + /* Read initial command. */ System.out.print("Enter a math expression (blank line to quit): "); String ln = scan.nextLine().trim(); - /* - * Enter REPL loop. - */ + /* Enter REPL loop. */ while (!ln.equals("")) { - /* - * Print raw command. - */ + /* Print raw command. */ System.out.println("Raw command: " + ln); System.out.println(); - /* - * Lex command to infix tokens. - */ + /* Lex command to infix tokens. */ final Token[] infixTokens = lex.lexString(ln, toks); System.out.println("Lexed tokens: "); - for (final Token tok : infixTokens) { System.out.println("\t" + tok); } - /* - * Print out infix expression. - */ + /* Print out infix expression. */ System.out.print("Lexed expression: "); - for (final Token tok : infixTokens) { System.out.print(tok.toExpr() + " "); } + /* Space stages. */ System.out.println(); System.out.println(); - /* - * Shunt infix tokens to postfix tokens. - */ + /* Shunt infix tokens to postfix tokens. */ final Token[] postfixTokens = Shunter.shuntTokens(infixTokens); System.out.println("Lexed tokens: "); - for (final Token tok : postfixTokens) { System.out.println("\t" + tok); } - /* - * Print out postfix tokens. - */ + /* Print out postfix tokens. */ System.out.print("Shunted expression: "); - for (final Token tok : postfixTokens) { System.out.print(tok.toExpr() + " "); } + /* Space stages. */ System.out.println(); System.out.println(); - final FunctionalList<Token> tokList = new FunctionalList<>(Arrays.asList(postfixTokens)); + /* Construct a list from the array of tokens. */ + final FunctionalList<Token> tokList = new FunctionalList<>( + Arrays.asList(postfixTokens)); + + /* Construct a tree from the list of postfixed tokens. */ final ITree<Token> ast = TreeConstructor.constructTree(tokList, - tok -> tok.typ.isOperator); + tok -> tok.typ.isOperator); - /* - * Print the tree, then the canonical expression for it. - */ + /* Print the tree, then the canonical expression for it. */ System.out.println("Parsed tree"); System.out.println(ast.toString()); System.out.println("\nCanonical expr: " + toCanonicalExpr(ast)); + /* Space stages. */ + System.out.println(); System.out.println(); - /* - * Prompt for a new expression. - */ + /* Prompt for a new expression. */ System.out.print("Enter a math expression (blank line to quit): "); + /* Read it. */ ln = scan.nextLine().trim(); } - /* - * Cleanup after ourselves. - */ + /* Cleanup after ourselves. */ scan.close(); } @@ -124,38 +109,39 @@ public class Parser { private static String toCanonicalExpr(final ITree<Token> ast) { final Token data = ast.getHead(); - if (ast.getChildrenCount() == 0) - /* - * Handle leaf nodes. - */ - { + if (ast.getChildrenCount() == 0) { + /* Handle leaf nodes. */ return data.toExpr(); } - final ITree<Token> left = ast.getChild(0); + /* The left/right children. */ + final ITree<Token> left = ast.getChild(0); final ITree<Token> right = ast.getChild(1); - String leftExpr = toCanonicalExpr(left); + /* Recursively canonicalize them. */ + String leftExpr = toCanonicalExpr(left); String rightExpr = toCanonicalExpr(right); - /* - * Add parens if the left was higher priority. - */ + /* Add parens if the left was higher priority. */ if (left.getChildrenCount() == 0) { - if (left.getHead().typ.operatorPriority >= data.typ.operatorPriority) { - leftExpr = "(" + leftExpr + ")"; + int leftPriority = left.getHead().typ.operatorPriority; + int dataPriority = data.typ.operatorPriority; + + if (leftPriority >= dataPriority) { + leftExpr = String.format("(%s)", leftExpr); } } - /* - * Add parens if the right was higher priority. - */ + /* Add parens if the right was higher priority. */ if (right.getChildrenCount() == 0) { - if (right.getHead().typ.operatorPriority >= data.typ.operatorPriority) { - rightExpr = "(" + rightExpr + ")"; + int rightPriority = right.getHead().typ.operatorPriority; + int dataPriority = data.typ.operatorPriority; + + if (rightPriority >= dataPriority) { + rightExpr = String.format("(%s)", rightExpr); } } - return leftExpr + " " + data.toExpr() + " " + rightExpr; + return String.format("%s %s %s", leftExpr, data.toExpr(), rightExpr); } -}
\ No newline at end of file +} |
