public ProductionInstanceBuilder(ParserProduction parserProduction, ProductionInstanceBuilderPool pool) { var binder = parserProduction.Binder; _pool = pool; _tryReturn = binder.TryReturn; if (binder.ConstValue != null) { Arguments = Array.Empty <Argument>(); _constValue = binder.ConstValue; _createInstanceDelegate = (builder, factory) => builder._constValue; } else { var template = binder.Template; Arguments = new Argument[template.Length]; ArgumentBuilders = binder.Template; for (var index = 0; index < template.Length; index++) { var argumentBuilder = template[index]; if (argumentBuilder == null) { continue; } Arguments[index] = argumentBuilder.CreateArgument(this, index); } var flatIndex = parserProduction.LeftRecursionEntry?.ParserEntryData.FlatIndex ?? -1; LeftRecursionArgument = flatIndex != -1 ? Arguments[flatIndex] : null; _createInstanceDelegate = binder.CreateInstanceDelegate; } }