From 07d8b9547a654021d8c56021779f4cdaa5f03f1b Mon Sep 17 00:00:00 2001 From: bjculkin Date: Fri, 24 Feb 2017 10:50:53 -0500 Subject: Update --- dice-lang/src/bjc/dicelang/v2/Parser.java | 112 ++++++++++++++++-------------- 1 file changed, 59 insertions(+), 53 deletions(-) (limited to 'dice-lang/src/bjc/dicelang/v2/Parser.java') diff --git a/dice-lang/src/bjc/dicelang/v2/Parser.java b/dice-lang/src/bjc/dicelang/v2/Parser.java index 7151e0e..c939a8b 100644 --- a/dice-lang/src/bjc/dicelang/v2/Parser.java +++ b/dice-lang/src/bjc/dicelang/v2/Parser.java @@ -28,59 +28,8 @@ public class Parser { break; case CBRACKET: case CBRACE: - 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: - break; - } - Token matching = null; - - if(tk.type == CBRACKET) { - matching = new Token(Token.Type.OBRACKET, tk.intValue); - } else if(tk.type == CBRACE) { - matching = new Token(Token.Type.OBRACE, tk.intValue); - } - - 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(ITree ast : working) { - System.out.println("Tree " + treeNo++ + ": " + ast.toString()); - } - - return false; - } else { - Deque> childs = new LinkedList<>(); - - while(!working.peek().equals(matchNode)) { - childs.push(working.pop()); - } - - // Discard opener - working.pop(); - - for(ITree child : childs) { - groupNode.addChild(child); - } - - working.push(groupNode); - } + boolean sc = parseClosingGrouper(working, tk); + if(!sc) return false; break; case LET: case BIND: @@ -158,4 +107,61 @@ public class Parser { return true; } + + private boolean parseClosingGrouper(Deque> working, 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: + break; + } + + Token matching = null; + if(tk.type == CBRACKET) { + matching = new Token(Token.Type.OBRACKET, tk.intValue); + } else if(tk.type == CBRACE) { + matching = new Token(Token.Type.OBRACE, tk.intValue); + } + + 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(ITree ast : working) { + System.out.println("Tree " + treeNo++ + ": " + ast.toString()); + } + + return false; + } else { + Deque> childs = new LinkedList<>(); + + while(!working.peek().equals(matchNode)) { + childs.push(working.pop()); + } + + // Discard opener + working.pop(); + + for(ITree child : childs) { + groupNode.addChild(child); + } + + working.push(groupNode); + } + + return true; + } } -- cgit v1.2.3