コード例 #1
0
ファイル: AutomLetter.cs プロジェクト: paColor/Colorization
        public AutomLetter(string s, ref int pos)
            : base(s, pos)
        {
            logger.ConditionalTrace("AutomLetter(string s, ref int pos)");

            /*
             * An AutomLetter has the Syntax:
             * 'letter' : [[list of rulenames], {List of AutomRules}]
             */

            // Let's skip possible leading spaces
            pos = GetNextChar(pos);
            // The char at pos must be an '
            Debug.Assert(s[pos] == '\'', String.Format(ConfigBase.cultF,
                                                       "AutomLetter: on attend un \''\' en début de lettre. {0}", ErrorExcerpt(pos, Letter.ToString())));
            // Let's find the letter
            pos    = GetNextChar(pos + 1);
            Letter = s[pos];
            // Let's find the closing '
            pos = GetNextChar(pos + 1);
            Debug.Assert(s[pos] == '\'', string.Format(ConfigBase.cultF,
                                                       "AutomLetter: on attend un \''\' en fin de lettre. {0}", ErrorExcerpt(pos, Letter.ToString())));
            // Let's find the :
            pos = GetNextChar(pos + 1);
            Debug.Assert(s[pos] == ':', string.Format(ConfigBase.cultF, "" +
                                                      "AutomLetter: on attend un \':\' après la lettre {0}", ErrorExcerpt(pos, Letter.ToString())));
            // let's find the first [
            pos = GetNextChar(pos + 1);
            Debug.Assert(s[pos] == '[', string.Format(ConfigBase.cultF,
                                                      "AutomLetter, on attend un \'[\' après le \':\'. {0}", ErrorExcerpt(pos, Letter.ToString())));
            // let's find the second [
            pos = GetNextChar(pos + 1);
            Debug.Assert(s[pos] == '[', string.Format(ConfigBase.cultF,
                                                      "AutomLetter: on attend un \'[\' après le premier \'[\'. {0}", ErrorExcerpt(pos, Letter.ToString())));

            //Let's load the list of rule names
            pos       = GetNextChar(pos + 1);
            ruleOrder = new List <string>();
            while (s[pos] != ']')
            {
                // The char at pos must be an '
                Debug.Assert(s[pos] == '\'', String.Format(ConfigBase.cultF,
                                                           "AutomLetter: on attend un \''\' en début de nom de règle. {0}", ErrorExcerpt(pos, Letter.ToString())));
                // the rulename must end with a '
                pos = GetNextChar(pos + 1);
                int endOfRuleNameApostrophyPos = s.IndexOf('\'', pos);
                Debug.Assert(endOfRuleNameApostrophyPos > pos, String.Format(ConfigBase.cultF,
                                                                             "AutomLetter: on attend un \''\' en fin de nom de règle.{0}", ErrorExcerpt(pos, Letter.ToString())));
                string theRuleName = s.Substring(pos, endOfRuleNameApostrophyPos - pos);
                ruleOrder.Add(theRuleName);
                pos = GetNextChar(endOfRuleNameApostrophyPos + 1);
                // it is either ',' or ']'
                Debug.Assert(((s[pos] == ',') || (s[pos] == ']')), string.Format(ConfigBase.cultF,
                                                                                 "AutomLetter, on attend une \',\' ou un \']\'.{0}", ErrorExcerpt(pos, Letter.ToString())));
                if (s[pos] == ',')
                {
                    pos = GetNextChar(pos + 1);
                }
            } // while

            // Let's find the ,
            pos = GetNextChar(pos + 1);
            Debug.Assert(s[pos] == ',', string.Format(ConfigBase.cultF,
                                                      "AutomLetter: on attend une \',\' avant les règles. {0}", ErrorExcerpt(pos, Letter.ToString())));

            // Let's load the rules
            pos = GetNextChar(pos + 1);
            Debug.Assert(s[pos] == '{', string.Format(ConfigBase.cultF,
                                                      "AutomLetter: on attend une \'{{\' avant la liste de règles. {0}", ErrorExcerpt(pos, Letter.ToString())));
            List <string> sortedRuleNames = new List <string>(ruleOrder);

            sortedRuleNames.Sort();
            // Find the first character of the rule
            pos   = GetNextChar(pos + 1);
            rules = new Dictionary <string, AutomRule>(ruleOrder.Count);
            while (s[pos] != '}')
            {
                AutomRule ar = new AutomRule(s, ref pos, sortedRuleNames);
                rules.Add(ar.RuleName, ar);
                pos = GetNextChar(pos + 1);
                // it is either ',' or '}'
                Debug.Assert(((s[pos] == ',') || (s[pos] == '}')), string.Format(ConfigBase.cultF,
                                                                                 "AutomLetter: on attend une \',\' ou un \'}}\' après une règle. {0}", ErrorExcerpt(pos, Letter.ToString())));
                if (s[pos] == ',')
                {
                    pos = GetNextChar(pos + 1);
                }
            } // while

            // Let's Find the closing ]
            pos = GetNextChar(pos + 1);
            Debug.Assert(s[pos] == ']', string.Format(ConfigBase.cultF,
                                                      "AutomLetter: on attend un \']\' après la liste des règles. {0}", ErrorExcerpt(pos, Letter.ToString())));

            end = pos;
        } // Constructor
コード例 #2
0
ファイル: AutomLetter.cs プロジェクト: paColor/Colorization
 public static void InitAutomat()
 {
     logger.ConditionalDebug("InitAutomat");
     AutomRule.InitAutomat();
 }