summaryrefslogtreecommitdiff
path: root/dice-lang/src/bjc/dicelang/expr/Parser.java
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2017-10-09 16:02:10 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2017-10-09 16:02:10 -0300
commitf028ea6dc555fc5192a96b00b8e96e90dbf6de55 (patch)
tree4b2a28ecbeb30095b50e6e9e8ac8b98fa8ddc79e /dice-lang/src/bjc/dicelang/expr/Parser.java
parentbe4675f9512060aa85b1e0a4f223208b51b55812 (diff)
TODO tagging
Diffstat (limited to 'dice-lang/src/bjc/dicelang/expr/Parser.java')
-rw-r--r--dice-lang/src/bjc/dicelang/expr/Parser.java108
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
+}