Beispiel #1
0
        internal static int NumberOfPseudoDeadStates(this IDfa <char> dfa)
        {
            int number = 0;
            Queue <IDfaState <char> >          Q     = new Queue <IDfaState <char> >();
            Dictionary <IDfaState <char>, int> color = new Dictionary <IDfaState <char>, int>();

            Q.Enqueue(dfa.Start);

            while (Q.Count > 0)
            {
                IDfaState <char> current_state = Q.Dequeue();
                if (!color.ContainsKey(current_state))
                {
                    color[current_state] = 1;
                    if (current_state.IsPseudoDead())
                    {
                        number++;
                    }
                    foreach (var transition in current_state.Transitions)
                    {
                        if (!color.ContainsKey(transition.Value))
                        {
                            Q.Enqueue(transition.Value);
                        }
                    }
                }
            }
            return(number);
        }
Beispiel #2
0
 public DfaLexeme(IDfaLexerRule dfaLexerRule, int position)
 {
     LexerRule      = dfaLexerRule;
     Position       = position;
     _stringBuilder = SharedPools.Default <StringBuilder>().AllocateAndClear();
     _currentState  = dfaLexerRule.Start;
 }
Beispiel #3
0
        static NumberLexerRule()
        {
            var states = new DfaState[5];

            for (int i = 0; i < states.Length; i++)
            {
                states[i] = new DfaState(i == 4 || i == 2);
            }

            var zeroThroughNine = new RangeTerminal('0', '9');

            var plusOrMinusTo1     = new DfaTransition(new SetTerminal('+', '-'), states[1]);
            var dotTo3             = new DfaTransition(new CharacterTerminal('.'), states[3]);
            var zeroThroughNineTo2 = new DfaTransition(zeroThroughNine, states[2]);
            var zeroThroughNineTo4 = new DfaTransition(zeroThroughNine, states[4]);

            states[0].AddTransition(dotTo3);
            states[0].AddTransition(plusOrMinusTo1);
            states[0].AddTransition(zeroThroughNineTo2);

            states[1].AddTransition(dotTo3);
            states[1].AddTransition(zeroThroughNineTo2);

            states[2].AddTransition(zeroThroughNineTo2);
            states[2].AddTransition(dotTo3);

            states[3].AddTransition(zeroThroughNineTo4);

            states[4].AddTransition(zeroThroughNineTo4);

            _start = states[0];
        }
Beispiel #4
0
        static NumberLexerRule()
        {
            var states = new DfaState[5];
            for (int i = 0; i < states.Length; i++)
                states[i] = new DfaState(i==4 || i== 2);

            var zeroThroughNine = new RangeTerminal('0', '9');

            var plusOrMinusTo1 = new DfaTransition(new SetTerminal('+', '-'), states[1]);
            var dotTo3 = new DfaTransition(new CharacterTerminal('.'), states[3]);
            var zeroThroughNineTo2 = new DfaTransition(zeroThroughNine, states[2]);
            var zeroThroughNineTo4 = new DfaTransition(zeroThroughNine, states[4]);

            states[0].AddTransition(dotTo3);
            states[0].AddTransition(plusOrMinusTo1);
            states[0].AddTransition(zeroThroughNineTo2);

            states[1].AddTransition(dotTo3);
            states[1].AddTransition(zeroThroughNineTo2);

            states[2].AddTransition(zeroThroughNineTo2);
            states[2].AddTransition(dotTo3);

            states[3].AddTransition(zeroThroughNineTo4);

            states[4].AddTransition(zeroThroughNineTo4);

            _start = states[0];
        }
Beispiel #5
0
 public void Reset(IDfaLexerRule dfaLexerRule)
 {
     _capture = null;
     if(IsStringBuilderAllocated())
         _stringBuilder.Clear();
     _currentState = dfaLexerRule.Start;
     LexerRule = dfaLexerRule;
 }
Beispiel #6
0
 public override void Reset()
 {
     _capture = null;
     if (IsStringBuilderAllocated())
     {
         _stringBuilder.Clear();
     }
     _currentState = ConcreteLexerRule.Start;
 }
        internal static bool IsPseudoDead(this IDfaState <char> state)
        {
            Dictionary <IDfaState <char>, int> color = new Dictionary <IDfaState <char>, int>();

            if (!FindAcceptingState(state, color))
            {
                return(true);
            }
            return(false);
        }
Beispiel #8
0
 public void Reset(IDfaLexerRule dfaLexerRule)
 {
     _capture = null;
     if (IsStringBuilderAllocated())
     {
         _stringBuilder.Clear();
     }
     _currentState = dfaLexerRule.Start;
     LexerRule     = dfaLexerRule;
 }
 static WhitespaceLexerRule()
 {
     _start = new DfaState();
     var end = new DfaState(isFinal: true);
     var transition = new DfaTransition(
         new WhitespaceTerminal(),
         end);
     _start.AddTransition(transition);
     end.AddTransition(transition);
 }
Beispiel #10
0
        static WordLexerRule()
        {
            _start = new DfaState();
            var end        = new DfaState(isFinal: true);
            var transition = new DfaTransition(
                new WordTerminal(),
                end);

            _start.AddTransition(transition);
            end.AddTransition(transition);
        }
Beispiel #11
0
 public bool Scan(char c)
 {
     foreach (var edge in _currentState.Edges)
     {
         if (edge.Terminal.IsMatch(c))
         {
             _currentState = edge.Target;
             _capture.Append(c);
             return true;
         }
     }
     return false;
 }
Beispiel #12
0
 public bool Scan(char c)
 {
     for(var e = 0; e<_currentState.Transitions.Count; e++)
     {
         var edge = _currentState.Transitions[e];
         if (edge.Terminal.IsMatch(c))
         {
             if (!IsStringBuilderAllocated())
                 ReallocateStringBuilderFromCapture();
             _currentState = edge.Target;
             _stringBuilder.Append(c);
             return true;
         }
     }
     return false;
 }
Beispiel #13
0
 public override bool Scan(char c)
 {
     for (var e = 0; e < _currentState.Transitions.Count; e++)
     {
         var edge = _currentState.Transitions[e];
         if (edge.Terminal.IsMatch(c))
         {
             if (!IsStringBuilderAllocated())
             {
                 ReallocateStringBuilderFromCapture();
             }
             _currentState = edge.Target;
             _stringBuilder.Append(c);
             return(true);
         }
     }
     return(false);
 }
Beispiel #14
0
        public override bool Scan()
        {
            if (!Capture.Peek(out char c))
            {
                return(false);
            }

            for (var e = 0; e < _currentState.Transitions.Count; e++)
            {
                var edge = _currentState.Transitions[e];

                if (edge.Terminal.IsMatch(c))
                {
                    _currentState = edge.Target;
                    return(Capture.Grow());
                }
            }
            return(false);
        }
Beispiel #15
0
 private void Check(IDfaState <TSymbol> state)
 {
     if (state == null)
     {
         Debug.Fail("Found null state in DFA");
     }
     if (_visitedStates.Contains(state))
     {
         return;
     }
     _visitedStates.Add(state);
     Debug.Assert(state.Transitions != null);
     Debug.Assert(state.Transitions.Count > 0);
     for (var i = 1; i < state.Transitions.Count; i++)
     {
         Debug.Assert(state.Transitions[i - 1].Key.CompareTo(state.Transitions[i].Key) < 0);
     }
     foreach (var transition in state.Transitions)
     {
         Check(transition.Value);
     }
 }
        static SingleQuoteStringLexerRule()
        {
            var states = new DfaState[3];

            for (var i = 0; i < states.Length; i++)
            {
                states[i] = new DfaState(i == 2);
            }

            var quote    = new CharacterTerminal('\'');
            var notQuote = new NegationTerminal(quote);

            var quoteToNotQuote    = new DfaTransition(quote, states[1]);
            var notQuoteToNotQuote = new DfaTransition(notQuote, states[1]);
            var notQuoteToQuote    = new DfaTransition(quote, states[2]);

            states[0].AddTransition(quoteToNotQuote);
            states[1].AddTransition(notQuoteToNotQuote);
            states[1].AddTransition(notQuoteToQuote);

            _start = states[0];
        }
        static bool FindAcceptingState(IDfaState <char> state, Dictionary <IDfaState <char>, int> color)
        {
            if (state.Accepting != 0)
            {
                return(true);
            }
            color[state] = 1;

            foreach (var transition in state.Transitions)
            {
                if (!color.ContainsKey(transition.Value))
                {
                    if (FindAcceptingState(transition.Value, color))
                    {
                        return(true);
                    }
                }
            }

            color[state] = 2;
            return(false);
        }
Beispiel #18
0
 public DfaTransition(ITerminal terminal, IDfaState target)
 {
     Target = target;
     Terminal = terminal;
 }
Beispiel #19
0
 public DfaLexeme(IDfaLexerRule dfaLexerRule)
 {
     LexerRule = dfaLexerRule;
     _stringBuilder = SharedPools.Default<StringBuilder>().AllocateAndClear();
     _currentState = dfaLexerRule.Start;
 }
Beispiel #20
0
 public void AddTransition(ITerminal terminal, IDfaState node)
 {
     AddTransition(new DfaTransition(terminal, node));
 }
Beispiel #21
0
 internal static bool IsAccepting <TSymbol>(this IDfaState <TSymbol> state)
     where TSymbol : IComparable <TSymbol>, IEquatable <TSymbol>
 {
     return(state.Accepting != 0);
 }
Beispiel #22
0
 public DfaLexeme(IDfaState dfaState, TokenType tokenType)
 {
     _capture = new StringBuilder();
     _currentState = dfaState;
     TokenType = tokenType;
 }
Beispiel #23
0
 public override void Reset()
 {
     _currentState = ConcreteLexerRule.Start;
 }
Beispiel #24
0
 public DfaLexeme(IDfaLexerRule dfaLexerRule, ICapture <char> segment, int offset)
     : base(dfaLexerRule, segment, offset)
 {
     _currentState = dfaLexerRule.Start;
 }
Beispiel #25
0
 public DfaLexerRule(IDfaState state, TokenType tokenType)
     : base(DfaLexerRuleType, tokenType)
 {
     Start = state;
 }
Beispiel #26
0
 public DfaEdge(ITerminal terminal, IDfaState target)
 {
     Target = target;
     Terminal = terminal;
 }
Beispiel #27
0
 public DfaLexerRule(IDfaState state, string tokenType)
     : this(state, new TokenType(tokenType))
 {
 }
Beispiel #28
0
 public DfaTransition(ITerminal terminal, IDfaState target)
 {
     Target   = target;
     Terminal = terminal;
 }
Beispiel #29
0
 public DfaLexerRule(IDfaState state, TokenType tokenType)
 {
     Start = state;
     TokenType = tokenType;
 }
Beispiel #30
0
 public DfaLexerRule(IDfaState state, TokenType tokenType)
     : base(DfaLexerRuleType, tokenType)
 {
     Start     = state;
     _hashCode = ComputeHashCode(DfaLexerRuleType, tokenType);
 }
Beispiel #31
0
 public DfaLexerRule(IDfaState state, string tokenType)
     : this(state, new TokenType(tokenType))
 {
 }