/// <summary> /// Comprueba una regla delimitada /// </summary> private void CheckRuleDelimited(RuleDelimited rule, TokenCollection tokens, ref bool found) { string startRule = GetStartRule(rule.Starts); if (!string.IsNullOrWhiteSpace(startRule)) { // Añade la palabra tokens.Add(ReadWord(startRule, rule)); // Indica que se ha encontrado found = true; } }
/// <summary> /// Lee una palabra hasta que se encuentran los separadores /// </summary> private Token ReadWord(string startRule, RuleDelimited rule) { Token token = new Token(rule.Type, rule.SubType, CharSeparator.Row, CharSeparator.Column, ""); // Obtiene la cadena de inicio if (rule.IncludeStart) { token.Value = CharSeparator.GetChars(startRule.Length); } else // ... se salta el inicio { CharSeparator.GetChars(startRule.Length); } // Busca hasta el final if (rule.ToEndLine) { token.Value += CharSeparator.GetCharsToEndLine(); } else if (rule.ToFirstSpace || rule.Ends == null || rule.Ends.Length == 0) { token.Value += CharSeparator.GetCharsToSpace(); } else { bool end = false; while (!CharSeparator.IsEof && !end) { string actualRule = GetStartRule(rule.Ends); // Comprueba si se ha terminado con la palabra ... if (!string.IsNullOrWhiteSpace(actualRule)) // ... si coincide con una de las reglas de fin { if (rule.IncludeEnd) { token.Value += CharSeparator.GetChars(actualRule.Length); } else { CharSeparator.GetChars(actualRule.Length); } end = true; } else if (rule.ToFirstSpace && CharSeparator.IsSpace) { end = true; } else { token.Value += CharSeparator.GetNextChar(); } } } // Limpia la palabra if (rule.MustTrim && !string.IsNullOrWhiteSpace(token.Value)) { token.Value = token.Value.Trim(); } // Devuelve la palabra return(token); }