private static void AppendPattern(ILinks <ulong> links, LinksConstants <ulong> constants, ulong start, ulong patternMarker, Dictionary <ulong, char> chars, ulong any, ulong @continue, StringBuilder sb, ulong initialPosition, RawNumberToAddressConverter <ulong> rawNumberToAddressConverter) { sb.Append('('); var alternatives = 0; links.Each(linkParts => { var link = new UInt64Link(linkParts); if (patternMarker == link.Target) { if (alternatives > 0) { sb.Append('|'); } alternatives++; } else if (!constants.IsExternalReference(link.Target)) { var charPosition = new UInt64Link(links.GetLink(link.Target)); if (constants.IsExternalReference(charPosition.Source) && chars.TryGetValue(charPosition.Target, out char targetSymbol)) { var position = rawNumberToAddressConverter.Convert(charPosition.Source) - 10; if (position == initialPosition) { if (alternatives > 0) { sb.Append('|'); } sb.Append(targetSymbol); AppendPattern(links, constants, link.Target, patternMarker, chars, any, @continue, sb, initialPosition + 1, rawNumberToAddressConverter); alternatives++; } } } return(@continue); }, new UInt64Link(any, start, any)); sb.Append(')'); }
private static string LinkToString(ILinks <ulong> links, LinksConstants <ulong> constants, ulong linkAddress, Dictionary <ulong, char> chars, RawNumberToAddressConverter <ulong> rawNumberToAddressConverter) { if (chars.TryGetValue(linkAddress, out char @char)) { return($"'{@char.ToString()}'"); } else if (constants.IsExternalReference(linkAddress)) { return(rawNumberToAddressConverter.Convert(linkAddress).ToString()); } else { var link = new UInt64Link(links.GetLink(linkAddress)); if (constants.IsExternalReference(link.Source) && chars.TryGetValue(link.Target, out char targetChar)) { return($"[{rawNumberToAddressConverter.Convert(link.Source)}]'{targetChar}'"); } else { return(linkAddress.ToString()); } } }