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
public static void InitAutomat() { logger.ConditionalDebug("InitAutomat"); AutomRule.InitAutomat(); }