Exemplo n.º 1
0
 /// <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))
 {
 }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 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));
     }
 }
Exemplo n.º 4
0
 /// <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));
 }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
 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));
     }
 }
Exemplo n.º 7
0
        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;
        }
Exemplo n.º 8
0
 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;
 }
Exemplo n.º 9
0
 /// <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);
 }
Exemplo n.º 10
0
 /// <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))
 {
 }