コード例 #1
0
ファイル: AutomatBase.cs プロジェクト: Serpen/Serpen.Uni
        protected (uint[], string[], uint[]) RemovedStateTranslateTables(params uint[] keepStates)
        {
            bool[] fromStartReachable = ReachableStates(keepStates);

            uint[] translate = new uint[fromStartReachable.Count((b) => b)];
            for (uint i = 0; i < translate.Length; i++)
            {
                uint j = i;
                if (i > 0)
                {
                    j = System.Math.Max(i, translate[i - 1] + 1);
                }
                while (!fromStartReachable[j])
                {
                    j++;
                }
                translate[i] = j;
            }

            if (translate.ArrayIndex(StartState) > this.StatesCount)
            {
                throw new Uni.Automat.StateException(StartState, "removed with too high start state");
            }

            string[] names = new string[translate.Length];
            for (int i = 0; i < translate.Length; i++)
            {
                names[i] = translate[i].ToString();
            }

            var astates = new List <uint>(AcceptedStates.Length);

            foreach (var accept in AcceptedStates)
            {
                if (translate.Contains(accept))
                {
                    astates.Add(translate.ArrayIndex(accept));
                }
            }


            return(translate, names, astates.ToArray());
        }