public static OnpOnpStringFindResult FirstNextIndex( IList <Char> Source, Int32 StartIndex, IList <Char[][]> ItemsToFind, Boolean Insensitive, Char StringChar = '\'') { if (ItemsToFind == null || ItemsToFind.Count == 0) { return(null); } OnpOnpStringFindResult minResult = null; foreach (Char[][] items in ItemsToFind) { OnpOnpStringFindResult findResult = NextIndex(Source, items, StringChar, StartIndex, Insensitive); if (findResult != null) { if (minResult == null || findResult.Index < minResult.Index) { minResult = findResult; } } } return(minResult); }
/// <summary> /// Zwraca kolejny token /// </summary> public static ExpressionToken GetNextToken(IList <Char> Chars, Int32 StartIndex, ExpressionToken PrevToken) { // szukanie operatórw porównania Char[] foundCompareOperator = StringHelper.StrEquals(Chars, PainLanguageSymbols.CompareOperators, StartIndex, false); if (foundCompareOperator != null) { return(new ExpressionToken(foundCompareOperator, TokenType.OPERATOR)); } // szukanie nawiasu START Char[] foundBracketBegin = StringHelper.StrEquals(Chars, PainLanguageSymbols.BracketBegin, StartIndex, false); if (foundBracketBegin != null) { return(new ExpressionToken(foundBracketBegin, TokenType.BRACKET_BEGIN)); } // szukanie nawiasu END Char[] foundBracketEnd = StringHelper.StrEquals(Chars, PainLanguageSymbols.BracketEnd, StartIndex, false); if (foundBracketEnd != null) { return(new ExpressionToken(foundBracketEnd, TokenType.BRACKET_END)); } // szukanie indexera START Char[] foundIndexerBegin = StringHelper.StrEquals(Chars, PainLanguageSymbols.IndexerBegin, StartIndex, false); if (foundIndexerBegin != null) { return(new ExpressionToken(foundIndexerBegin, TokenType.INDEXER_BEGIN)); } // szukanie indexera END Char[] foundIndexerEnd = StringHelper.StrEquals(Chars, PainLanguageSymbols.IndexerEnd, StartIndex, false); if (foundIndexerEnd != null) { return(new ExpressionToken(foundIndexerEnd, TokenType.INDEXER_END)); } // szukanie operatora równości Char[] foundEqualOperator = StringHelper.StrEquals(Chars, PainLanguageSymbols.EqualOperator, StartIndex, false); if (foundEqualOperator != null) { return(new ExpressionToken(foundEqualOperator, TokenType.EQUAL_OPERATOR)); } // szukanie operatora Char[] foundOperator = StringHelper.StrEquals(Chars, PainLanguageSymbols.Operators, StartIndex, false); if (foundOperator != null) { return(new ExpressionToken(foundOperator, TokenType.OPERATOR)); } // szukanie operatorów logicznych Char[] foundLogicalOperator = StringHelper.StrEquals(Chars, PainLanguageSymbols.LogicalOperators, StartIndex, true); if (foundLogicalOperator != null) { Char?prevChar = StartIndex > 0 ? (Char?)Chars[StartIndex - 1] : null; Char?nextChar = StartIndex + foundLogicalOperator.Length < Chars.Count ? (Char?)Chars[StartIndex + foundLogicalOperator.Length] : null; if (!(prevChar != null && Char.IsLetterOrDigit(prevChar.Value) && Char.IsLetterOrDigit(foundLogicalOperator[0])) && !(nextChar != null && Char.IsLetterOrDigit(nextChar.Value) && Char.IsLetterOrDigit(foundLogicalOperator[foundLogicalOperator.Length - 1]))) { return(new ExpressionToken(foundLogicalOperator, TokenType.OPERATOR)); } else { prevChar = prevChar; } } // szukanie białych znaków Char[] foundWhitespaces = StringHelper.StrEquals(Chars, PainLanguageSymbols.Whitespaces, StartIndex, false); if (foundWhitespaces != null) { return(new ExpressionToken(foundWhitespaces, TokenType.WHITESPACE)); } // szukanie przecinka Char[] foundSeparator = StringHelper.StrEquals(Chars, PainLanguageSymbols.Separators, StartIndex, false); if (foundSeparator != null) { return(new ExpressionToken(foundSeparator, TokenType.SEPARATOR)); } TokenType tokenType = TokenType.VARIABLE; Int32 nextIndex = -1; List <Char> chars = new List <Char>(); OnpOnpStringFindResult firstNext = StringHelper.FirstNextIndex( Chars, StartIndex, new[] { PainLanguageSymbols.IndexerBegin, PainLanguageSymbols.IndexerEnd, PainLanguageSymbols.BracketBegin, PainLanguageSymbols.BracketEnd, PainLanguageSymbols.OperatorsAndPropertyAndBrackets, PainLanguageSymbols.Separators }, true); if (firstNext == null || firstNext.Index < 0) { for (Int32 j = StartIndex; j < Chars.Count; j++) { chars.Add(Chars[j]); } } else { int len = firstNext.Index; for (Int32 j = StartIndex; j < len; j++) { chars.Add(Chars[j]); } nextIndex = firstNext.Index; } if (nextIndex < 0) { nextIndex = Chars.Count; } chars.Trim(); if (chars.Count != 0) { if (StringHelper.IsValue(chars)) { tokenType = TokenType.VALUE; } //if (tokenType == TokenType.VARIABLE) // for (var i = 0; i < chars.Count; i++) // chars[i] = Char.ToUpper(chars[i]); return (new ExpressionToken(chars, tokenType) { TokenLength = (nextIndex - StartIndex) }); } return(null); }