private static void Diagram(
            this StringBuilder builder,
            SymbolResult symbolResult,
            ParseResult parseResult)
        {
            if (parseResult.Errors.Any(e => e.SymbolResult == symbolResult))
            {
                builder.Append("!");
            }

            if (symbolResult is OptionResult option &&
                option.IsImplicit)
            {
                builder.Append("*");
            }

            builder.Append("[ ");

            builder.Append(symbolResult.Token);

            foreach (var child in symbolResult.Children)
            {
                builder.Append(" ");
                builder.Diagram(child, parseResult);
            }

            if (symbolResult.Arguments.Count > 0)
            {
                foreach (var arg in symbolResult.Arguments)
                {
                    builder.Append(" <");
                    builder.Append(arg);
                    builder.Append(">");
                }
            }
            else
            {
                var result = symbolResult.ArgumentResult;
                if (result is SuccessfulArgumentResult _)
                {
                    var value = symbolResult.GetValueOrDefault();

                    switch (value)
                    {
                    case null:
                    case IReadOnlyCollection <string> a when a.Count == 0:
                        break;

                    default:
                        builder.Append(" <");
                        builder.Append(value);
                        builder.Append(">");
                        break;
                    }
                }
            }

            builder.Append(" ]");
        }
 public static object GetValueOrDefault(this SymbolResult symbolResult)
 {
     return(symbolResult.GetValueOrDefault <object>());
 }