コード例 #1
0
ファイル: Parser.cs プロジェクト: KJTsanaktsidis/rx2
        private CharacterClass ParseeCClass()
        {
            //Throw away [ token
            if (_ts.NextToken().Type != TokenType.OPENCLASS)
                throw new ParseException("Expected [");

            var cClass = new CharacterClass();

            while (_ts.Peek().Type != TokenType.CLOSECLASS)
            {
                cClass.Elements.Add(ParseCClassElement());
            }

            //throw away ]
            _ts.NextToken();

            return cClass;
        }
コード例 #2
0
ファイル: NFAGraph.cs プロジェクト: KJTsanaktsidis/rx2
        public NFAGraph ToDFA()
        {
            //first, we need to know the alphabet
            var alphabet = new SortedSet<char>();
            foreach (var state in _adjList.Keys)
            {
                foreach (var link in _adjList[state].Where(l => !l.IsEmpty))
                {
                    alphabet.UnionWith(link.CharClass.CharSet());
                }
            }

            var dfa = new NFAGraph();
            var stateSetMap = new Dictionary<HashSet<NFAState>, NFAState>(HashSet<NFAState>.CreateSetComparer());
            var startStateSet = eClosure(_startState);
            dfa._startState = dfa.NewState();
            stateSetMap[startStateSet] = dfa._startState;

            //Follow the links of the start state
            var markedDFAStates = new HashSet<HashSet<NFAState>>(HashSet<NFAState>.CreateSetComparer());
            //Start at the start and continue whilst there are no unmarked states
            var DFAStateQueue = new Queue<HashSet<NFAState>>();
            DFAStateQueue.Enqueue(startStateSet);
            while (DFAStateQueue.Count > 0)
            {
                var thisstate = DFAStateQueue.Dequeue();
                var origdfastate = stateSetMap[thisstate];
                markedDFAStates.Add(thisstate);
                foreach (var c in alphabet)
                {
                    var cclass = new CharacterClass();
                    cclass.Elements.Add(new CharacterClassElement(c));
                    cclass.IsNegated = false;

                    var targetStates = new HashSet<NFAState>();
                    foreach (var nfastate in thisstate)
                    {
                        foreach (var link in _adjList[nfastate])
                        {
                            if (CanFollowLink(link, c))
                            {
                                targetStates.Add(link.Target);
                            }
                        }
                    }
                    var targetStateClosure = eClosure(targetStates);
                    NFAState ndfastate;
                    if (!markedDFAStates.Contains(targetStateClosure))
                    {
                        DFAStateQueue.Enqueue(targetStateClosure);

                        ndfastate = dfa.NewState();
                        stateSetMap[targetStateClosure] = ndfastate;
                        if (targetStateClosure.Any(s => _finishState.Contains(s)))
                            dfa._finishState.Add(ndfastate);
                    }
                    else
                    {
                        ndfastate = stateSetMap[targetStateClosure];
                    }

                    dfa._adjList[origdfastate].Add(new NFALink()
                    {
                        IsEmpty = false,
                        CharClass = cclass,
                        Target = ndfastate
                    });

                }
                //now check for . transitions
            }

            return dfa;
        }
コード例 #3
0
ファイル: NFAGraph.cs プロジェクト: KJTsanaktsidis/rx2
 public NFAGraph(CharacterClass CClass)
 {
     InstantiateFromCharClass(CClass);
 }
コード例 #4
0
ファイル: NFAGraph.cs プロジェクト: KJTsanaktsidis/rx2
 private void InstantiateFromSingleChar(SingleChar C)
 {
     var CClass = new CharacterClass();
     CClass.Elements.Add(new CharacterClassElement(C.Character));
     InstantiateFromCharClass(CClass);
 }
コード例 #5
0
ファイル: NFAGraph.cs プロジェクト: KJTsanaktsidis/rx2
 private void InstantiateFromCharClass(CharacterClass CClass)
 {
     _startState = NewState();
     _finishState.Add(NewState());
     var link = new NFALink();
     link.CharClass = CClass;
     link.Target = _finishState.Single();
     _adjList[_startState].Add(link);
 }