예제 #1
0
        public IDfaSet Read()
        {
            var map = this.reader.ReadInt32Array();

            var setsCount = this.reader.ReadInt32();
            var sets      = new Set[setsCount];

            for (var s = 0; s < sets.Length; ++s)
            {
                var intervalCount = this.reader.ReadInt32();
                var intervals     = new Interval[intervalCount];
                for (var i = 0; i < intervalCount; ++i)
                {
                    var min = this.reader.ReadInt32();
                    var max = this.reader.ReadInt32();
                    intervals[i] = new Interval(min, max);
                }
                sets[s] = new Set(intervals);
            }

            var dfaCount = this.reader.ReadInt32();
            var dfas     = new Dfa[dfaCount];

            for (var d = 0; d < dfaCount; ++d)
            {
                var stateCount = this.reader.ReadInt32();
                var states     = new DfaState[stateCount];
                for (var s = 0; s < stateCount; ++s)
                {
                    var final   = this.reader.ReadBool();
                    var payload = this.reader.ReadInt32() - 1;
                    states[s] = new DfaState(s, final, payload);
                }
                for (var s = 0; s < stateCount; ++s)
                {
                    var transitionCount = this.reader.ReadInt32();
                    var transitions     = new DfaTrans[transitionCount];
                    for (var t = 0; t < transitionCount; ++t)
                    {
                        var setId    = this.reader.ReadInt32();
                        var targetId = this.reader.ReadInt32();
                        Debug.Assert(targetId < stateCount);
                        transitions[t] = new DfaTrans(states[targetId], sets[setId]);
                    }
                    states[s].Transitions = transitions;
                }
                dfas[d] = new Dfa(states);
            }

            return(new DfaSet(dfas, map, dfas.Last()));
        }