private static RegExp MakeString(RegExp exp1, RegExp exp2) { var sb = new StringBuilder(); _ = exp1._Kind == Kind.RegexpString ? sb.Append(exp1._S) : sb.Append(exp1._C); _ = exp2._Kind == Kind.RegexpString ? sb.Append(exp2._S) : sb.Append(exp2._C); return(MakeString(sb.ToString())); }
private void FindLeaves( RegExp exp, Kind regExpKind, IList <Automaton> list, IDictionary <string, Automaton> automata, IAutomatonProvider automatonProvider, bool minimize) { if (exp._Kind == regExpKind) { FindLeaves(exp._Exp1, regExpKind, list, automata, automatonProvider, minimize); FindLeaves(exp._Exp2, regExpKind, list, automata, automatonProvider, minimize); } else { list.Add(exp.ToAutomaton(automata, automatonProvider, minimize)); } }
private static RegExp MakeUnion(RegExp exp1, RegExp exp2) => new RegExp { _Kind = Kind.RegexpUnion, _Exp1 = exp1, _Exp2 = exp2, };
private static RegExp MakeRepeat(RegExp exp, int min) => new RegExp { _Kind = Kind.RegexpRepeatMin, _Exp1 = exp, _Min = min, };
private static RegExp MakeRepeat(RegExp exp) => new RegExp { _Kind = Kind.RegexpRepeat, _Exp1 = exp, };
private static RegExp MakeOptional(RegExp exp) => new RegExp { _Kind = Kind.RegexpOptional, _Exp1 = exp, };
private static RegExp MakeIntersection(RegExp exp1, RegExp exp2) => new RegExp { _Kind = Kind.RegexpIntersection, _Exp1 = exp1, _Exp2 = exp2, };
private static RegExp MakeComplement(RegExp exp) => new RegExp { _Kind = Kind.RegexpComplement, _Exp1 = exp, };
private static RegExp ExcludeChars(RegExp exclusion, RegExp allChars) => MakeIntersection(allChars, MakeComplement(exclusion));