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)