docs: function(rule) {
        var ans = arguments[1] !== undefined ? [arguments[1]] : [],
            state;
        while (true) {
          state = this.bt.current_state();
          try { ans.push(rule.call(this)) } 
          catch (f) {
            this.bt.catch_mismatch(f);
            this.bt.restore(state);
            break;
          }
        }
        return ans
      }