예제 #1
0
        public override EpsilonNfa Apply(AlternativeExpression expression, Automaton param)
        {
            var nfa = new EpsilonNfa(param);
            var a   = Invoke(expression.Left, param);
            var b   = Invoke(expression.Right, param);

            param.AddTransition(nfa.Start, a.Start, Transition.Type.Epsilon);
            param.AddTransition(nfa.Start, b.Start, Transition.Type.Epsilon);
            param.AddTransition(a.End, nfa.End, Transition.Type.Epsilon);
            param.AddTransition(b.End, nfa.End, Transition.Type.Epsilon);
            return(nfa);
        }
예제 #2
0
 public Expression ParseAlternate()
 {
     var left = ParseJoin();
     while(true)
     {
         if (_sourceWindow.AdvanceIfMatches('|'))
         {
             var right = ParseJoin();
             if (right == null)
             {
                 throw new ArgumentException("Expect expression after |.");
             }
             var seq = new AlternativeExpression(left, right);
             left = seq;
         }
         else break;
     }
     return left;
 }
예제 #3
0
        public Expression ParseAlternate()
        {
            var left = ParseJoin();

            while (true)
            {
                if (_sourceWindow.AdvanceIfMatches('|'))
                {
                    var right = ParseJoin();
                    if (right == null)
                    {
                        throw new ArgumentException("Expect expression after |.");
                    }
                    var seq = new AlternativeExpression(left, right);
                    left = seq;
                }
                else
                {
                    break;
                }
            }
            return(left);
        }
예제 #4
0
 public override Expression Apply(AlternativeExpression expression, MergeParameter param)
 {
     return(new AlternativeExpression(
                Invoke(expression.Left, param),
                Invoke(expression.Right, param)));
 }
예제 #5
0
        public static RegexNode operator |(RegexNode node1, RegexNode node2)
        {
            var expression = new AlternativeExpression(node1.Exp, node2.Exp);

            return(new RegexNode(expression));
        }
예제 #6
0
 public bool Equals(AlternativeExpression obj)
 {
     return(Left.Equals(obj.Left) &&
            Right.Equals(obj.Right));
 }
예제 #7
0
 public void Visit(AlternativeExpression expression)
 {
     _returnValue = this.Apply(expression, _paramValue);
 }
예제 #8
0
 public abstract ReturnT Apply(AlternativeExpression expression, ParamT param);
예제 #9
0
 public static RegexNode operator |(RegexNode node1,RegexNode node2)
 {
     var expression = new AlternativeExpression(node1.Exp, node2.Exp);
     return new RegexNode(expression);
 }
예제 #10
0
 public bool Equals(AlternativeExpression obj)
 {
     return Left.Equals(obj.Left) &&
         Right.Equals(obj.Right);
 }