diff --git a/lib/nearley.js b/lib/nearley.js
index <HASH>..<HASH> 100644
--- a/lib/nearley.js
+++ b/lib/nearley.js
@@ -38,8 +38,11 @@ State.prototype.toString = function() {
 
 State.prototype.nextState = function(data) {
     var state = new State(this.rule, this.dot + 1, this.reference, this.wantedBy);
-    state.data = this.data.slice(0);  // make a cheap copy of currentState's data
-    state.data.push(data);            // append the passed data
+    state.left = this;
+    state.right = data;
+    if (state.isComplete) {
+        state.data = state.build();
+    }
     return state;
 };
 
@@ -59,6 +62,17 @@ State.prototype.consumeTerminal = function(inp) {
     return val;
 };
 
+State.prototype.build = function() {
+    var children = [];
+    var node = this;
+    do {
+        children.push(node.right);
+        node = node.left;
+    } while (node.left);
+    children.reverse();
+    return children;
+};
+
 State.prototype.finish = function() {
     if (this.rule.postprocess) {
         this.data = this.rule.postprocess(this.data, this.reference, Parser.fail);
Store node data as linked list! :D

(sort of.)

This is a really big deal. Currently slice() in `nextState` is really hurting
us. Avoiding it brings exciting perf improvements (~2-3x faster).