code: function StateGenerator(_, Token, TreeNode) {
    this._ = _;
    this.Token = Token; // The Token class injected in
    this.TreeNode = TreeNode;
  
    this._lexicon = [];
  
    // Represents all of the lexeme patterns (and possible state paths)
    this._lexemePatternTree = new this.TreeNode();
    this._lexemePatternTree.setAttribute('stateName', this._ROOT_STATE);
    this._lexemePatternTree.setAttribute('isRoot', true);
  
    // After the call to generate states, this will be populated with the FSM states
    this._states = {};
    this._treeIndex = 0;
  
    // The lexeme that matches when nothing else does
    this._defaultLexeme = null;
    this._partialMatchHandler = null;
    this._defaultHandler = null;
  }
docs: The state generator collects Lexemes within the lexicon and generates a
  tree, which will eventually be used to generate a state diagram for the
  [awesome-automata](https://github.com/loverly/awesome-automata) state
  machine.  All of the leaves are functions representing the return value
  generators for the state machine.
  
  TODO: Create an actual tree object that has flags for terminal nodes and for
  TODO: various metadata.  It's essentially a linked list with multiple child
  TODO: nodes.
  
  The lexicon will be transformed into the a tree structure with each node
  representing some transition.  The nodes are actual TreeNode instances with
  metadata about what that node contains.