Ejemplo n.º 1
0
        private static void WriteIgnoreCaseBDD(StreamWriter sw)
        {
            sw.WriteLine("        /// <summary>Serialized BDD for mapping characters to their case-ignoring equivalence classes in the default (en-US) culture.</summary>");

            var solver = new CharSetSolver();
            Dictionary <char, BDD> ignoreCase = ComputeIgnoreCaseDictionary(solver, new CultureInfo(DefaultCultureName));
            BDD ignorecase = solver.False;

            foreach (KeyValuePair <char, BDD> kv in ignoreCase)
            {
                BDD a = solver.CreateCharSetFromRange(kv.Key, kv.Key);
                BDD b = kv.Value;
                ignorecase = solver.Or(ignorecase, solver.And(solver.ShiftLeft(a, 16), b));
            }

            sw.Write("        public static readonly long[] IgnoreCaseEnUsSerializedBDD = ");
            GeneratorHelper.WriteInt64ArrayInitSyntax(sw, ignorecase.Serialize());
            sw.WriteLine(";");
        }
        private static void WriteSerializedBDDs(StreamWriter sw)
        {
            int maxChar = 0xFFFF;
            var catMap  = new Dictionary <UnicodeCategory, Ranges>();

            foreach (UnicodeCategory c in Enum.GetValues <UnicodeCategory>())
            {
                catMap[c] = new Ranges();
            }

            Ranges whitespace      = new Ranges();
            Ranges wordcharacter   = new Ranges();
            Regex  whitespaceRegex = new(@"\s");
            Regex  wordcharRegex   = new(@"\w");

            for (int i = 0; i <= maxChar; i++)
            {
                char ch = (char)i;
                catMap[char.GetUnicodeCategory(ch)].Add(i);

                if (whitespaceRegex.IsMatch(ch.ToString()))
                {
                    whitespace.Add(i);
                }

                if (wordcharRegex.IsMatch(ch.ToString()))
                {
                    wordcharacter.Add(i);
                }
            }

            //generate bdd reprs for each of the category ranges
            BDD[]         catBDDs = new BDD[catMap.Count];
            CharSetSolver bddb    = new CharSetSolver();

            for (int c = 0; c < catBDDs.Length; c++)
            {
                catBDDs[c] = bddb.CreateBddForIntRanges(catMap[(UnicodeCategory)c].ranges);
            }

            BDD whitespaceBdd = bddb.CreateBddForIntRanges(whitespace.ranges);

            BDD wordCharBdd = bddb.CreateBddForIntRanges(wordcharacter.ranges);

            sw.WriteLine("        /// <summary>Serialized BDD representations of all the Unicode categories.</summary>");
            sw.WriteLine("        public static readonly long[][] AllCategoriesSerializedBDD = new long[][]");
            sw.WriteLine("        {");
            for (int i = 0; i < catBDDs.Length; i++)
            {
                sw.WriteLine("            // {0}({1}):", (UnicodeCategory)i, i);
                sw.Write("            ");
                GeneratorHelper.WriteInt64ArrayInitSyntax(sw, catBDDs[i].Serialize());
                sw.WriteLine(",");
            }
            sw.WriteLine("        };");
            sw.WriteLine();

            sw.WriteLine("        /// <summary>Serialized BDD representation of the set of all whitespace characters.</summary>");
            sw.Write($"        public static readonly long[] WhitespaceSerializedBDD = ");
            GeneratorHelper.WriteInt64ArrayInitSyntax(sw, whitespaceBdd.Serialize());
            sw.WriteLine(";");
            sw.WriteLine();

            sw.WriteLine("        /// <summary>Serialized BDD representation of the set of all word characters</summary>");
            sw.Write($"        public static readonly long[] WordCharactersSerializedBDD = ");
            GeneratorHelper.WriteInt64ArrayInitSyntax(sw, wordCharBdd.Serialize());
            sw.WriteLine(";");
        }