/// <summary> /// Creates a message for the parse result. /// </summary> /// <remarks>Displays where the parsing succeeded or failed, as well as any named failures if the parsing failed.</remarks> public static string ToMessage(this IParseResult result) { if (result.Success) { return(string.Format(CultureInfo.InvariantCulture, "success at {0}", result.NextPosition.GetLineColumn())); } else { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendFormat(CultureInfo.InvariantCulture, "failure at {0}", result.NextPosition.GetLineColumn()); foreach (var namedFailureGroup in result.GetNamedFailures().Distinct() .GroupBy(x => x.Position.GetLineColumn()) .OrderByDescending(x => x.Key.LineNumber).ThenByDescending(x => x.Key.ColumnNumber) .Select(x => new { Position = x.Key, Names = x.Select(y => y.Name).Distinct().ToArray() })) { stringBuilder.AppendFormat(CultureInfo.InvariantCulture, "; expected {0} at {1}", string.Join(" or ", namedFailureGroup.Names), namedFailureGroup.Position); } return(stringBuilder.ToString()); } }