protected static ArgumentBuilder CreateArgumentBuilder(Type type, ParameterInfo parameterInfo, ParserEntryData flatEntryData)
                {
                    var parserEntry = flatEntryData.ParserEntry;

                    return(parserEntry switch
                    {
                        IParserPredicate parserPredicateEntry => CreatePredicateArgumentBuilder(type, parserPredicateEntry),
                        ParserSetMatchEntry parserSetMatchEntry => CreateLexerArgumentBuilder(type, null, parserSetMatchEntry),
                        ParserSingleMatchEntry parserSingleMatchEntry => CreateLexerArgumentBuilder(type, null, parserSingleMatchEntry),
                        ParserStateEntry parserStateEntry => CreateParserArgumentBuilder(type),

                        _ => throw new ArgumentOutOfRangeException(nameof(parserEntry))
                    });
                private static ArgumentBuilder CreatePredicateArgumentBuilder(Type type, IParserPredicate parserPredicateEntry)
                {
                    if (parserPredicateEntry.PredicateKind == ParserPredicateKind.SubParser)
                    {
                        return(CreateParserArgumentBuilder(type));
                    }

                    if (parserPredicateEntry.PredicateKind == ParserPredicateKind.SubLexer)
                    {
                        var tokenType = parserPredicateEntry.GetType().GetGenericArguments().Last().GetGenericArguments().Single();

                        return(CreateSubLexerArgumentBuilder(tokenType, type));
                    }

                    throw new ArgumentOutOfRangeException();
                }