diff --git a/src/main/java/org/sablecc/sablecc/parser/Parser.java b/src/main/java/org/sablecc/sablecc/parser/Parser.java index a5f017486eb7566db6f6dac4c1ef2384dde835f1..421759dc435183c3f709a3d871eec6910f441e10 100644 --- a/src/main/java/org/sablecc/sablecc/parser/Parser.java +++ b/src/main/java/org/sablecc/sablecc/parser/Parser.java @@ -6,12 +6,7 @@ import java.io.DataInputStream; import java.io.BufferedInputStream; import java.io.InputStream; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; +import java.util.*; import de.hhu.stups.sablecc.patch.IParser; import de.hhu.stups.sablecc.patch.IToken; @@ -28,7 +23,9 @@ public class Parser implements IParser protected List<Object> nodeList; private final Lexer lexer; - private final ListIterator<State> stack = new LinkedList<State>().listIterator(); + private final Deque<State> stackA = new ArrayDeque<>(); + private final Deque<State> stackB = new ArrayDeque<>(); + private int last_pos; private int last_line; private Token last_token; @@ -157,13 +154,14 @@ public class Parser implements IParser { this.nodeList = listNode; - if(!this.stack.hasNext()) + if(stackB.isEmpty()) { - this.stack.add(new State(numstate, this.nodeList)); + stackA.push(new State(numstate, this.nodeList)); return; } - State s = this.stack.next(); + State s = stackB.pop(); + stackA.push(s); s.state = numstate; s.nodes = this.nodeList; } @@ -199,14 +197,15 @@ public class Parser implements IParser private int state() { - State s = this.stack.previous(); - this.stack.next(); - return s.state; + return stackA.peek().state; + } private List<Object> pop() { - return this.stack.previous().nodes; + State s = stackA.pop(); + stackB.push(s); + return s.nodes; } private int index(Switchable token) diff --git a/src/main/resources/org/sablecc/sablecc/parser.txt b/src/main/resources/org/sablecc/sablecc/parser.txt index f5b39aa373c285e46bb9aca3de684250dac8d7dd..a4d012022a9062ad9513cac3a5009ec1223a2daf 100644 --- a/src/main/resources/org/sablecc/sablecc/parser.txt +++ b/src/main/resources/org/sablecc/sablecc/parser.txt @@ -14,12 +14,7 @@ import java.io.DataInputStream; import java.io.BufferedInputStream; import java.io.InputStream; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; +import java.util.*; import de.hhu.stups.sablecc.patch.IParser; import de.hhu.stups.sablecc.patch.IToken; @@ -36,7 +31,9 @@ public class Parser implements IParser protected List<Object> nodeList; private final Lexer lexer; - private final ListIterator<State> stack = new LinkedList<State>().listIterator(); + private final Deque<State> stackA = new ArrayDeque<>(); + private final Deque<State> stackB = new ArrayDeque<>(); + private int last_pos; private int last_line; private Token last_token; @@ -191,13 +188,14 @@ Macro:ParserNoInliningPushHeader $ Macro:ParserCommon - if(!this.stack.hasNext()) + if(stackB.isEmpty()) { - this.stack.add(new State(numstate, this.nodeList)); + stackA.push(new State(numstate, this.nodeList)); return; } - State s = this.stack.next(); + State s = stackB.pop(); + stackA.push(s); s.state = numstate; s.nodes = this.nodeList; } @@ -233,14 +231,15 @@ Macro:ParserCommon private int state() { - State s = this.stack.previous(); - this.stack.next(); - return s.state; + return stackA.peek().state; + } private List<Object> pop() { - return this.stack.previous().nodes; + State s = stackA.pop(); + stackB.push(s); + return s.nodes; } private int index(Switchable token)