From c74cb8eaf454d9243b75e3770001d8d128356b28 Mon Sep 17 00:00:00 2001 From: "Benjamin J. Culkin" Date: Sun, 23 Jul 2017 22:58:58 -0300 Subject: Format --- dice-lang/src/bjc/dicelang/Parser.java | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'dice-lang/src/bjc/dicelang/Parser.java') 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 tokens, final IList> results) { + public static boolean parseTokens(final IList tokens, + final IList> results) { final Deque> 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> working, final Token tk) { + private static boolean parseClosingGrouper(final Deque> working, + final Token tk) { if (working.size() == 0) { Errors.inst.printError(EK_PARSE_NOCLOSE); return false; } ITree 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 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 ast : working) { System.out.println("Tree " + treeNo++ + ": " + ast.toString()); } -- cgit v1.2.3