/// <summary> /// Constructs a query for terms matching <code>term</code>. /// </summary> /// <param name="term"> regular expression. </param> /// <param name="flags"> optional RegExp features from <seealso cref="RegExp"/> </param> /// <param name="provider"> custom AutomatonProvider for named automata </param> public RegexpQuery(Term term, int flags, AutomatonProvider provider) : base(term, (new RegExp(term.Text(), flags)).ToAutomaton(provider)) { }
private Automaton ToAutomaton(IDictionary <string, Automaton> automata, AutomatonProvider automaton_provider) { IList <Automaton> list; Automaton a = null; switch (kind) { case Kind.REGEXP_UNION: list = new List <Automaton>(); FindLeaves(Exp1, Kind.REGEXP_UNION, list, automata, automaton_provider); FindLeaves(Exp2, Kind.REGEXP_UNION, list, automata, automaton_provider); a = BasicOperations.Union(list); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_CONCATENATION: list = new List <Automaton>(); FindLeaves(Exp1, Kind.REGEXP_CONCATENATION, list, automata, automaton_provider); FindLeaves(Exp2, Kind.REGEXP_CONCATENATION, list, automata, automaton_provider); a = BasicOperations.Concatenate(list); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_INTERSECTION: a = Exp1.ToAutomaton(automata, automaton_provider).Intersection(Exp2.ToAutomaton(automata, automaton_provider)); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_OPTIONAL: a = Exp1.ToAutomaton(automata, automaton_provider).Optional(); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_REPEAT: a = Exp1.ToAutomaton(automata, automaton_provider).Repeat(); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_REPEAT_MIN: a = Exp1.ToAutomaton(automata, automaton_provider).Repeat(Min); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_REPEAT_MINMAX: a = Exp1.ToAutomaton(automata, automaton_provider).Repeat(Min, Max); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_COMPLEMENT: a = Exp1.ToAutomaton(automata, automaton_provider).Complement(); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_CHAR: a = BasicAutomata.MakeChar(c); break; case Kind.REGEXP_CHAR_RANGE: a = BasicAutomata.MakeCharRange(From, To); break; case Kind.REGEXP_ANYCHAR: a = BasicAutomata.MakeAnyChar(); break; case Kind.REGEXP_EMPTY: a = BasicAutomata.MakeEmpty(); break; case Kind.REGEXP_STRING: a = BasicAutomata.MakeString(s); break; case Kind.REGEXP_ANYSTRING: a = BasicAutomata.MakeAnyString(); break; case Kind.REGEXP_AUTOMATON: Automaton aa = null; if (automata != null) { aa = automata[s]; } if (aa == null && automaton_provider != null) { try { aa = automaton_provider.GetAutomaton(s); } catch (System.IO.IOException e) { throw new System.ArgumentException(e.Message, e); } } if (aa == null) { throw new System.ArgumentException("'" + s + "' not found"); } a = (Automaton)aa.Clone(); // always clone here (ignore allow_mutate) break; case Kind.REGEXP_INTERVAL: a = BasicAutomata.MakeInterval(Min, Max, Digits); break; } return(a); }
private void FindLeaves(RegExp exp, Kind kind, IList <Automaton> list, IDictionary <string, Automaton> automata, AutomatonProvider automaton_provider) { if (exp.kind == kind) { FindLeaves(exp.Exp1, kind, list, automata, automaton_provider); FindLeaves(exp.Exp2, kind, list, automata, automaton_provider); } else { list.Add(exp.ToAutomaton(automata, automaton_provider)); } }
/// <summary> /// Constructs new <code>Automaton</code> from this <code>RegExp</code>. The /// constructed automaton is minimal and deterministic and has no transitions /// to dead states. /// </summary> /// <param name="automaton_provider"> provider of automata for named identifiers </param> /// <exception cref="IllegalArgumentException"> if this regular expression uses a named /// identifier that is not available from the automaton provider </exception> public virtual Automaton ToAutomaton(AutomatonProvider automaton_provider) { return(ToAutomatonAllowMutate(null, automaton_provider)); }
private Automaton ToAutomatonAllowMutate(IDictionary <string, Automaton> automata, AutomatonProvider automaton_provider) { bool b = false; if (Allow_mutation) // thread unsafe { b = Automaton.SetAllowMutate(true); } Automaton a = ToAutomaton(automata, automaton_provider); if (Allow_mutation) { Automaton.AllowMutate = b; } return(a); }
private void FindLeaves(RegExp exp, Kind kind, IList<Automaton> list, IDictionary<string, Automaton> automata, AutomatonProvider automaton_provider) { if (exp.kind == kind) { FindLeaves(exp.Exp1, kind, list, automata, automaton_provider); FindLeaves(exp.Exp2, kind, list, automata, automaton_provider); } else { list.Add(exp.ToAutomaton(automata, automaton_provider)); } }
private Automaton ToAutomaton(IDictionary<string, Automaton> automata, AutomatonProvider automaton_provider) { IList<Automaton> list; Automaton a = null; switch (kind) { case Kind.REGEXP_UNION: list = new List<Automaton>(); FindLeaves(Exp1, Kind.REGEXP_UNION, list, automata, automaton_provider); FindLeaves(Exp2, Kind.REGEXP_UNION, list, automata, automaton_provider); a = BasicOperations.Union(list); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_CONCATENATION: list = new List<Automaton>(); FindLeaves(Exp1, Kind.REGEXP_CONCATENATION, list, automata, automaton_provider); FindLeaves(Exp2, Kind.REGEXP_CONCATENATION, list, automata, automaton_provider); a = BasicOperations.Concatenate(list); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_INTERSECTION: a = Exp1.ToAutomaton(automata, automaton_provider).Intersection(Exp2.ToAutomaton(automata, automaton_provider)); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_OPTIONAL: a = Exp1.ToAutomaton(automata, automaton_provider).Optional(); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_REPEAT: a = Exp1.ToAutomaton(automata, automaton_provider).Repeat(); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_REPEAT_MIN: a = Exp1.ToAutomaton(automata, automaton_provider).Repeat(Min); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_REPEAT_MINMAX: a = Exp1.ToAutomaton(automata, automaton_provider).Repeat(Min, Max); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_COMPLEMENT: a = Exp1.ToAutomaton(automata, automaton_provider).Complement(); MinimizationOperations.Minimize(a); break; case Kind.REGEXP_CHAR: a = BasicAutomata.MakeChar(c); break; case Kind.REGEXP_CHAR_RANGE: a = BasicAutomata.MakeCharRange(From, To); break; case Kind.REGEXP_ANYCHAR: a = BasicAutomata.MakeAnyChar(); break; case Kind.REGEXP_EMPTY: a = BasicAutomata.MakeEmpty(); break; case Kind.REGEXP_STRING: a = BasicAutomata.MakeString(s); break; case Kind.REGEXP_ANYSTRING: a = BasicAutomata.MakeAnyString(); break; case Kind.REGEXP_AUTOMATON: Automaton aa = null; if (automata != null) { aa = automata[s]; } if (aa == null && automaton_provider != null) { try { aa = automaton_provider.GetAutomaton(s); } catch (System.IO.IOException e) { throw new System.ArgumentException(e.Message, e); } } if (aa == null) { throw new System.ArgumentException("'" + s + "' not found"); } a = (Automaton)aa.Clone(); // always clone here (ignore allow_mutate) break; case Kind.REGEXP_INTERVAL: a = BasicAutomata.MakeInterval(Min, Max, Digits); break; } return a; }
private Automaton ToAutomatonAllowMutate(IDictionary<string, Automaton> automata, AutomatonProvider automaton_provider) { bool b = false; if (Allow_mutation) // thread unsafe { b = Automaton.SetAllowMutate(true); } Automaton a = ToAutomaton(automata, automaton_provider); if (Allow_mutation) { Automaton.AllowMutate = b; } return a; }
/// <summary> /// Constructs new <code>Automaton</code> from this <code>RegExp</code>. The /// constructed automaton is minimal and deterministic and has no transitions /// to dead states. /// </summary> /// <param name="automaton_provider"> provider of automata for named identifiers </param> /// <exception cref="IllegalArgumentException"> if this regular expression uses a named /// identifier that is not available from the automaton provider </exception> public virtual Automaton ToAutomaton(AutomatonProvider automaton_provider) { return ToAutomatonAllowMutate(null, automaton_provider); }
/// <summary> /// Constructs a query for terms matching <code>term</code>. /// </summary> /// <param name="term"> regular expression. </param> /// <param name="flags"> optional RegExp features from <seealso cref="RegExp"/> </param> /// <param name="provider"> custom AutomatonProvider for named automata </param> public RegexpQuery(Term term, int flags, AutomatonProvider provider) : base(term, (new RegExp(term.Text(), flags)).ToAutomaton(provider)) { }