예제 #1
0
        private static void ConvertIndexersToFunctions(ExpressionTokens Tokens)
        {
            for (var i = 0; i < Tokens.Count; i++)
            {
                ExpressionToken token = Tokens[i];

                if (token.TokenType == TokenType.INDEXER_BEGIN)
                {
                    token.Set(".", false);
                    token.TokenType = TokenType.OPERATOR;

                    Tokens.Insert(
                        i + 1,
                        new ExpressionToken(ExtenderCollectionGetter.NameChars, TokenType.VARIABLE));

                    Tokens.Insert(
                        i + 2,
                        new ExpressionToken("@", TokenType.OPERATOR));

                    Tokens.Insert(
                        i + 3,
                        new ExpressionToken("(", TokenType.BRACKET_BEGIN));
                }
                else if (token.TokenType == TokenType.INDEXER_END)
                {
                    token.Set(")", false);
                    token.TokenType = TokenType.BRACKET_END;
                }
            }
        }
예제 #2
0
        ////////////////////////////

        private void CorrectSetExpression(
            Expression SetExpression,
            String ValueExpressionID,
            ParserSettings ParserSettings,
            ExpressionGroup ExpressionGroup)
        {
            if (SetExpression.Tokens.Count == 0)
            {
                return;
            }

            // jeśli tylko jeden symbol (podstawienie do zmiennej)
            else if (SetExpression.Tokens.Count == 1)
            {
                ExpressionToken firstToken = SetExpression.Tokens[0];

                if (firstToken.TokenType != TokenType.VARIABLE)
                {
                    throw new PainIncorrectExpressionFormatException("Incorrect setting value to type " + firstToken.TokenType + "");
                }

                if (firstToken.TokenName.Length == 0 || Char.IsDigit(firstToken.TokenName[0]))
                {
                    throw new PainIncorrectExpressionFormatException("Incorrect name of token '" + firstToken.TokenName + "'");
                }

                SetExpression.Tokens.Clear();
                SetExpression.Tokens.AddRange(
                    new[] {
                    new ExpressionToken(MethodSetValue.Name.ToUpper(), TokenType.VARIABLE),
                    new ExpressionToken(OperatorTypeHelper.op_methodcall, TokenType.OPERATOR),
                    new ExpressionToken('(', TokenType.BRACKET_BEGIN),
                    new ExpressionToken("'" + firstToken.TokenName + "'", TokenType.VALUE),
                    new ExpressionToken(',', TokenType.SEPARATOR),
                    new ExpressionToken(ValueExpressionID, TokenType.VARIABLE),
                    new ExpressionToken(')', TokenType.BRACKET_END)
                });
            }
            // jeśli przypisanie wyniku do elementu listy lub dictionary
            else
            {
                Int32 lastIndex = SetExpression.Tokens.Count - 1;

                ExpressionTokens sequence2 = new ExpressionTokens(
                    new TokenizerQueue().
                    GetPrevTokensOnSameLevel(
                        SetExpression.Tokens,
                        lastIndex));

                ExpressionTokens sequence1 = new ExpressionTokens(
                    new TokenizerQueue().
                    GetPrevTokensOnSameLevel(
                        SetExpression.Tokens,
                        lastIndex - sequence2.Count));

                ExpressionTokens sequence0 = new ExpressionTokens(
                    new TokenizerQueue().
                    GetPrevTokensOnSameLevel(
                        SetExpression.Tokens,
                        lastIndex - sequence2.Count - sequence1.Count));

                // a.get@(b).c = d   ========>   a.get@(b).set2@('c',d)
                if (sequence2.Count == 1 &&
                    sequence1.Count == 1 &&
                    OnpOnpTokenHelper.IsPropertyOperatorToken(sequence1[0]))
                {
                    ExpressionToken propertyOperatorToken = sequence1[0];
                    ExpressionToken propertyNameToken     = sequence2[0];

                    SetExpression.Tokens.Remove(propertyNameToken);
                    SetExpression.Tokens.AddRange(
                        new[] {
                        new ExpressionToken(ExtenderSetValue.Name.ToUpper().ToCharArray(), TokenType.VARIABLE),
                        new ExpressionToken(OperatorTypeHelper.op_methodcall, TokenType.OPERATOR),
                        new ExpressionToken('(', TokenType.BRACKET_BEGIN),
                        new ExpressionToken("'" + propertyNameToken.TokenName + "'", TokenType.VALUE),
                        new ExpressionToken(',', TokenType.SEPARATOR),
                        new ExpressionToken(ValueExpressionID, TokenType.VARIABLE),
                        new ExpressionToken(')', TokenType.BRACKET_END)
                    });
                }
                // a.get@(b).get@(d) = e   ========>   a.get@(b).set2@(d,e)
                else if (
                    sequence2.Count > 1 &&
                    sequence1.Count == 1 &&
                    OnpOnpTokenHelper.IsFunctionOperatorToken(sequence1[0]) &&
                    sequence0.Count == 1 &&
                    (sequence0[0].TokenType == TokenType.PROPERTY_NAME || sequence0[0].TokenType == TokenType.VARIABLE))
                {
                    ExpressionToken  functionNameToken     = sequence0[0];
                    ExpressionToken  functionOperatorToken = sequence1[0];
                    ExpressionTokens functionCallToken     = sequence2;

                    functionNameToken.Set(
                        ExtenderCollectionSetter.NameChars, false);

                    Int32 bracketBeginIndex = SetExpression.
                                              Tokens.
                                              IndexOf(functionCallToken[0]);

                    SetExpression.Tokens.Insert(
                        bracketBeginIndex + 1,
                        new ExpressionToken(ValueExpressionID, TokenType.VARIABLE));

                    SetExpression.Tokens.Insert(
                        bracketBeginIndex + 2,
                        new ExpressionToken(',', TokenType.SEPARATOR));
                }
                else
                {
                    throw new PainIncorrectExpressionFormatException();
                }
            }
        }
예제 #3
0
        private static void OptimizeTokens(
            ExpressionTokens tokens)
        {
            // usuwanie pustych nawiasów

            /*for (int i = 0; i < tokens.Count - 1; i++)
             * {
             *  ExpressionToken currentToken = tokens[i];
             *  ExpressionToken nextToken = tokens[i + 1];
             *
             *  // usuwanie pustych nawiasów
             *  if (currentToken.TokenType == TokenType.BRACKET_BEGIN &&
             *      nextToken.TokenType == TokenType.BRACKET_END)
             *  {
             *      tokens.Insert(i + 1, new ExpressionToken(OperatorTypeHelper.number_zero, TokenType.VALUE));
             *      i--;
             *  }
             * }*/

            // zamiana dwóch minusów na plus
            for (int i = 0; i < tokens.Count - 1; i++)
            {
                ExpressionToken currentToken = tokens[i];
                ExpressionToken nextToken    = tokens[i + 1];

                Boolean isMinus =
                    currentToken.TokenType == TokenType.OPERATOR &&
                    StringHelper.StartsWith(currentToken.TokenChars, DynLanuageSymbols.MinusChars, false);

                Boolean isNextMinus =
                    nextToken.TokenType == TokenType.OPERATOR &&
                    StringHelper.StartsWith(nextToken.TokenChars, DynLanuageSymbols.MinusChars, false);

                // zamiana dwóch minusów na plus
                if (isMinus && isNextMinus)
                {
                    currentToken.Set(DynLanuageSymbols.PlusChars);
                    tokens.RemoveAt(i + 1);
                    i--;
                }
            }

            // zamiana dwóch plusów na jeden plus

            /*for (int i = 0; i < tokens.Count - 1; i++)
             * {
             *  ExpressionToken currentToken = tokens[i];
             *  ExpressionToken nextToken = tokens[i + 1];
             *
             *  Boolean isPlus =
             *      currentToken.TokenType == TokenType.OPERATOR &&
             *      StringHelper.StartsWith(currentToken.TokenChars, DynLanuageSymbols.PlusChars, false);
             *
             *  Boolean isNextPlus =
             *      nextToken.TokenType == TokenType.OPERATOR &&
             *      StringHelper.StartsWith(nextToken.TokenChars, DynLanuageSymbols.PlusChars, false);
             *
             *  // zamiana dwóch plusów na jeden plus
             *  if (isPlus && isNextPlus)
             *  {
             *      tokens.RemoveAt(i + 1);
             *      i--;
             *  }
             * }*/
        }