public ElkhoundGlrParser(
            object context,
            BnfGrammar grammar,
            TransitionDelegate transition,
            GrammarActionDelegate grammarAction,
            int[]                 stateToPriorToken,
            int[]                   conflictActionsTable,
            Func <object, int, IReciever <Msg>, IReciever <Msg> > makeSwitch)
        {
            this.context              = context;
            this.grammar              = grammar;
            this.grammarAction        = grammarAction;
            this.transition           = transition;
            this.stateToPriorToken    = stateToPriorToken;
            this.conflictActionsTable = conflictActionsTable;
            this.gss = new Gss();

            gss.AddTopmost(0);
        }
        private RnGlrParser(
            RuntimeGrammar grammar,
            int[]               tokenComplexity,
            TransitionDelegate transition,
            int[]               stateToPriorToken,
            int[]               conflictActionsTable,
            IProducer <T> producer,
            ResourceAllocator allocator,
            ILogging logging,
            Gss <T> gss)
        {
            this.grammar              = grammar;
            this.tokenComplexity      = tokenComplexity;
            this.transition           = transition;
            this.stateToPriorToken    = stateToPriorToken;
            this.conflictActionsTable = conflictActionsTable;
            this.gss        = gss;
            this.nodeBuffer = new T[grammar.MaxRuleSize];
            this.producer   = producer;
            this.allocator  = allocator;
            this.logging    = logging;

            this.pendingReductions = new ModifiedReduction[grammar.Productions.Count];

            switch (producer.ReductionOrder)
            {
            case ReductionOrder.Unordered:
            {
                this.R = new ReductionQueue <T>();
                break;
            }

            case ReductionOrder.ByRuleDependency:
            {
                this.R = new ReductionPathQueue <T>(tokenComplexity, grammar);
                break;
            }
            }
        }