Esempio n. 1
0
 private IAutomaton Factor()
 {
     if (MayConsume('('))
     {
         var result = Exec();
         Consumes(')');
         return(result);
     }
     else if (MayConsume('['))
     {
         var negate = MayConsume('^');
         var chars  = CharSet.Empty;
         while (!MayConsume(']'))
         {
             var set = CharRange();
             chars = chars.Union(set);
         }
         if (negate)
         {
             chars = chars.Negate();
         }
         return(ConstructionKit.Consume(chars));
     }
     else
     {
         var ch = CharRange();
         return(ConstructionKit.Consume(ch));
     }
 }
Esempio n. 2
0
            private IAutomaton PrimaryExpression()
            {
                var operand = Factor();

                switch (Lookahead)
                {
                case '*': index++; return(ConstructionKit.Repeat(operand));

                case '+': index++; return(ConstructionKit.Repeat(operand, 1));

                case '?': index++; return(ConstructionKit.Repeat(operand, 0, 1));

                case '{':
                    index++;
                    var min = Number();
                    if (MayConsume(','))
                    {
                        var max = Number();
                        Consumes('}');
                        return(ConstructionKit.Repeat(operand, min, max));
                    }
                    else
                    {
                        Consumes('}');
                        return(ConstructionKit.Repeat(operand, min, min));
                    }
                }
                return(operand);
            }
Esempio n. 3
0
        public void StepConcatenation()
        {
            var A         = ConstructionKit.Consume(new CharSet('a'));
            var B         = ConstructionKit.Consume(new CharSet('b'));
            var automaton = ConstructionKit.Concat(new[] { A, B });

            automaton.Accepts("ab");
            automaton.Rejects("ba");
        }
Esempio n. 4
0
        public void StepCharacter()
        {
            var automaton = ConstructionKit.Consume(new CharSet('a', 'b', 'c'));

            automaton.Accepts("a");
            automaton.Accepts("b");
            automaton.Accepts("c");
            automaton.Rejects("d");
        }
Esempio n. 5
0
        public void StepRepetition()
        {
            var A         = ConstructionKit.Consume(new CharSet('a'));
            var automaton = ConstructionKit.Repeat(A);

            automaton.Accepts("");
            automaton.Accepts("a");
            automaton.Accepts("aa");
            automaton.Accepts("aaa");
            automaton.Rejects("b");
        }
Esempio n. 6
0
        public void StepAlternation()
        {
            var A         = ConstructionKit.Consume(new CharSet('a'));
            var B         = ConstructionKit.Consume(new CharSet('b'));
            var AA        = ConstructionKit.Concat(new[] { A, A });
            var automaton = ConstructionKit.Alternate(new[] { AA, B });

            automaton.Accepts("b");
            automaton.Accepts("aa");
            automaton.Rejects("bb");
            automaton.Rejects("a");
        }
Esempio n. 7
0
            private IAutomaton ConcatExpression()
            {
                var lhs = PrimaryExpression();

                while (Lookahead != '|' && Lookahead != Eos && Lookahead != ')')
                {
                    var rhs = PrimaryExpression();
                    lhs = ConstructionKit.Concat(new[]
                    {
                        lhs, rhs
                    });
                }
                return(lhs);
            }
Esempio n. 8
0
            public IAutomaton Exec()
            {
                var lhs = ConcatExpression();

                while (Lookahead == '|')
                {
                    index++;
                    var rhs = ConcatExpression();
                    lhs = ConstructionKit.Alternate(new[]
                    {
                        lhs, rhs
                    });
                }
                return(lhs);
            }
Esempio n. 9
0
        public void StepDeterminize()
        {
            var A         = ConstructionKit.Consume(new CharSet('a'));
            var B         = ConstructionKit.Consume(new CharSet('b'));
            var AA        = ConstructionKit.Concat(new[] { A, A });
            var AAorB     = ConstructionKit.Alternate(new[] { AA, B });
            var automaton = ConstructionKit.Repeat(AAorB)
                            .Determinize();

            automaton.Accepts("");
            automaton.Accepts("aa");
            automaton.Accepts("aa");
            automaton.Accepts("aaaa");
            automaton.Accepts("baab");
            automaton.Accepts("baabaabb");
            automaton.Rejects("a");
            automaton.Rejects("aaa");
        }