private IExpression ParseOptions() { var enabled = GroupRegexOptions.None; while (index != regex.Length && TryGetOption(out var option)) { enabled |= option; ++index; } if (index == regex.Length || (regex[index] != '-' && regex[index] != ':' && regex[index] != ')')) { // The Regex constructor should prevent this throw new InvalidOperationException(); } var disabled = GroupRegexOptions.None; if (regex[index] == '-') { ++index; while (index != regex.Length && TryGetOption(out var option)) { disabled |= option; ++index; } if (index == regex.Length || (regex[index] != ':' && regex[index] != ')')) { // The Regex constructor should prevent this throw new InvalidOperationException(); } } var currentOptions = options.Pop(); currentOptions |= enabled; currentOptions &= ~disabled; options.Push(currentOptions); if (regex[index] == ':') { ++index; // swallow ':' var item = Parse(); return(OptionsGroup.Of(enabled, disabled, item)); } else { return(InlineOptions.For(enabled, disabled)); } }
/// <summary> /// Creates a group that can enable or disable options for its subexpressions. /// </summary> /// <param name="enabled">The options to enable.</param> /// <param name="disabled">The options to disable.</param> /// <returns>The options group.</returns> public static IOptionsGroup From(GroupRegexOptions enabled, GroupRegexOptions disabled, IEnumerable <IExpression> members) { if (members == null) { throw new ArgumentNullException(nameof(members)); } ValidateRegexOptions(nameof(enabled), enabled); ValidateRegexOptions(nameof(disabled), disabled); var group = new OptionsGroup() { EnabledOptions = enabled, DisabledOptions = disabled }; foreach (var member in members) { group.Add(member); } return(group); }