summaryrefslogtreecommitdiff
path: root/dice-lang/src/bjc/dicelang/Parser.java
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2017-07-23 22:58:58 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2017-07-23 22:58:58 -0300
commitc74cb8eaf454d9243b75e3770001d8d128356b28 (patch)
tree899197afc0b7c382aa37c778053357e0e9b56c26 /dice-lang/src/bjc/dicelang/Parser.java
parent57f9a3bfdad20bead5b35ee540e8790e80a6b9a4 (diff)
Format
Diffstat (limited to 'dice-lang/src/bjc/dicelang/Parser.java')
-rw-r--r--dice-lang/src/bjc/dicelang/Parser.java22
1 files changed, 20 insertions, 2 deletions
diff --git a/dice-lang/src/bjc/dicelang/Parser.java b/dice-lang/src/bjc/dicelang/Parser.java
index 1029943..7e48f43 100644
--- a/dice-lang/src/bjc/dicelang/Parser.java
+++ b/dice-lang/src/bjc/dicelang/Parser.java
@@ -45,7 +45,8 @@ public class Parser {
*
* @return Whether or not the parse was successful.
*/
- public static boolean parseTokens(final IList<Token> tokens, final IList<ITree<Node>> results) {
+ public static boolean parseTokens(final IList<Token> tokens,
+ final IList<ITree<Node>> results) {
final Deque<ITree<Node>> working = new LinkedList<>();
for (final Token tk : tokens) {
@@ -54,11 +55,15 @@ public class Parser {
case OBRACE:
working.push(new Tree<>(new Node(OGROUP, tk)));
break;
+
case CBRACKET:
case CBRACE:
final boolean sc = parseClosingGrouper(working, tk);
+
if (!sc) return false;
+
break;
+
case MULTIPLY:
case DIVIDE:
case IDIVIDE:
@@ -76,6 +81,7 @@ public class Parser {
handleBinaryNode(working, tk);
break;
+
case ADD:
case SUBTRACT:
if (working.size() == 0) {
@@ -92,7 +98,9 @@ public class Parser {
} else {
handleBinaryNode(working, tk);
}
+
break;
+
case COERCE:
case DICESCALAR:
case DICEFUDGE:
@@ -106,7 +114,9 @@ public class Parser {
working.push(opNode);
}
+
break;
+
case INT_LIT:
case FLOAT_LIT:
case STRING_LIT:
@@ -114,6 +124,7 @@ public class Parser {
case DICE_LIT:
working.push(new Tree<>(new Node(TOKREF, tk)));
break;
+
default:
Errors.inst.printError(EK_PARSE_INVTOKEN, tk.type.toString());
return false;
@@ -139,26 +150,31 @@ public class Parser {
working.push(opNode);
}
- private static boolean parseClosingGrouper(final Deque<ITree<Node>> working, final Token tk) {
+ private static boolean parseClosingGrouper(final Deque<ITree<Node>> working,
+ final Token tk) {
if (working.size() == 0) {
Errors.inst.printError(EK_PARSE_NOCLOSE);
return false;
}
ITree<Node> groupNode = null;
+
switch (tk.type) {
case CBRACE:
groupNode = new Tree<>(new Node(GROUP, Node.GroupType.CODE));
break;
+
case CBRACKET:
groupNode = new Tree<>(new Node(GROUP, Node.GroupType.ARRAY));
break;
+
default:
Errors.inst.printError(EK_PARSE_UNCLOSE, tk.type.toString());
return false;
}
Token matching = null;
+
if (tk.type == CBRACKET) {
matching = new Token(Token.Type.OBRACKET, tk.intValue);
} else if (tk.type == CBRACE) {
@@ -166,12 +182,14 @@ public class Parser {
}
final ITree<Node> matchNode = new Tree<>(new Node(OGROUP, matching));
+
if (!working.contains(matchNode)) {
Errors.inst.printError(EK_PARSE_UNCLOSE, tk.toString(), matchNode.toString());
System.out.println("\tCurrent forest is: ");
int treeNo = 1;
+
for (final ITree<Node> ast : working) {
System.out.println("Tree " + treeNo++ + ": " + ast.toString());
}