Esempio n. 1
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();
                }
            }
        }
Esempio n. 2
0
        /// <summary>
        /// zastapienie ciagu tokenków zmienną i podpiecie nowego wyrazenia do zmiennej
        /// </summary>
        public void CorrectQueueExpression(
            Expression Expression,
            ParserSettings ParserSettings,
            ExpressionGroup ExpressionGroup)
        {
            if (Expression == null)
            {
                return;
            }

            if (Expression.Tokens == null || Expression.Tokens.Count <= 0)
            {
                return;
            }

            for (var i = 0; i < Expression.Tokens.Count; i++)
            {
                ExpressionToken token      = Expression.Tokens[i];
                ExpressionToken token_next = i + 1 < Expression.Tokens.Count ? Expression.Tokens[i + 1] : null;
                ExpressionToken token_prev = i - 1 >= 0 ? Expression.Tokens[i - 1] : null;

                ExpressionTokens functionCallTokens = new ExpressionTokens(
                    GetNextTokensOnSameLevel(Expression.Tokens, i));

                if (functionCallTokens.Count > 1)
                {
                    // generowanie expressions dla wnętrz funkcji
                    IList <ExpressionTokens> functionParameters = SplitTokensIntoFunctionParameters(functionCallTokens).ToList();
                    foreach (ExpressionTokens functionParameter in functionParameters)
                    {
                        // generowanie expression z wyrażenia z parametru
                        if (functionParameter.Count > 1)
                        {
                            Expression functionExpression = new Expression();
                            functionExpression.Tokens         = new ExpressionTokens(functionParameter);
                            functionExpression.IsOnpExecution = true;

                            ExpressionGroup.Expressions[functionExpression.ID] =
                                functionExpression;

                            new Tokenizer().PrepareExpressions(
                                functionExpression,
                                ParserSettings,
                                ExpressionGroup);

                            ExpressionToken functionParameterToken = new ExpressionToken(
                                functionExpression.ID.ToCharArray(),
                                TokenType.VARIABLE);

                            Int32 index = Expression.Tokens.
                                          RemoveSequence(functionParameter);

                            Expression.Tokens.Insert(
                                index,
                                functionParameterToken);

                            i = index;
                        }
                        // gdy pojedyncze wyrażenie w fukncji
                        else
                        {
                            Int32 index = Expression.Tokens.
                                          IndexOfSequence(functionParameter);

                            i = index;
                        }
                    }

                    // dla operatora @ ustalenie liczby parametrów
                    if (token_prev != null &&
                        token_prev.TokenType == TokenType.OPERATOR &&
                        (OnpOnpTokenHelper.IsFunctionOperatorToken(token_prev)))
                    {
                        token_prev.TokenData = new OnpTokenData();
                        token_prev.TokenData.FunctionParametersCount = functionParameters.Count;
                    }
                }
                else
                {
                    // zamiana typu zmiennej na property_name jeśli nie jest to pierwsza zmienna
                    if (i > 0 && (token.TokenType == TokenType.VARIABLE || token.TokenType == TokenType.VALUE))
                    {
                        if (token_next == null || !OnpOnpTokenHelper.IsFunctionOperatorToken(token_next))
                        {
                            token.TokenType = TokenType.PROPERTY_NAME;
                        }
                    }
                    // usunięcie operatorów typu 'get property' ('.')

                    /*else if (OnpOnpTokenHelper.IsPropertyOperatorToken(token) )
                     * {
                     *  queueTokens.RemoveAt(i);
                     *  i--;
                     * }*/
                }
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Odszukanie ciągów QUEUE w wyrażeniu
        /// </summary>
        public void PrepareQueueExpressions(
            IList <ExpressionToken> Tokens,
            ParserSettings ParserSettings,
            ExpressionGroup ExpressionGroup)
        {
            ExpressionTokens outTokens    = new ExpressionTokens();
            ExpressionTokens queueTokens  = null;
            Boolean          queueStarted = false;
            Int32            startIndex   = -1;
            Int32            endIndex     = -1;

            for (var i = 0; i < Tokens.Count; i++)
            {
                ExpressionToken token = Tokens[i];

                // rozpoczecie sekwencji queue
                if (token != null &&
                    queueStarted == false &&
                    (OnpOnpTokenHelper.IsPropertyOperatorToken(token) || OnpOnpTokenHelper.IsFunctionOperatorToken(token)))
                {
                    ExpressionTokens sequence = new ExpressionTokens(
                        GetNextTokensOnSameLevel(Tokens, i));

                    ExpressionTokens prevSequence = new ExpressionTokens(
                        GetPrevTokensOnSameLevel(Tokens, i - 1));

                    if (queueTokens == null)
                    {
                        queueTokens = new ExpressionTokens();
                    }

                    if (prevSequence == null)
                    {
                        throw new FormatException();
                    }

                    queueTokens.AddRange(prevSequence);
                    queueTokens.AddRange(sequence);

                    queueStarted = true;
                    startIndex   = i - prevSequence.Count;

                    i += sequence.Count - 1;
                }
                // zakończenie sekwencji queue
                else if (
                    token != null &&
                    queueStarted == true &&
                    (
                        token.TokenType == TokenType.BRACKET_END ||
                        token.TokenType == TokenType.OPERATOR &&
                        !OnpOnpTokenHelper.IsPropertyOperatorToken(token) &&
                        !OnpOnpTokenHelper.IsFunctionOperatorToken(token)
                    ))
                {
                    endIndex = i - 1;

                    // zastapienie ciagu tokenków zmienną i podpiecie nowego wyrazenia do zmiennej
                    if (queueTokens != null && queueTokens.Count > 0)
                    {
                        ExpressionToken newToken = CreateQueueExpression(
                            queueTokens,
                            ParserSettings,
                            ExpressionGroup);

                        for (var j = endIndex; j >= startIndex; j--)
                        {
                            Tokens.RemoveAt(j);
                            i--;
                        }
                        Tokens.Insert(startIndex, newToken);
                    }

                    queueTokens  = null;
                    endIndex     = -1;
                    startIndex   = -1;
                    queueStarted = false;
                }
                // kontynuacja sekwencji queue
                else if (queueStarted == true)
                {
                    ExpressionTokens sequence = new ExpressionTokens(
                        GetNextTokensOnSameLevel(Tokens, i));

                    queueTokens.AddRange(
                        sequence);

                    i += sequence.Count - 1;
                }
            }

            // zastapienie ciagu tokenków zmienną i podpiecie nowego wyrazenia do zmiennej
            if (queueTokens != null && queueTokens.Count > 0)
            {
                endIndex = Tokens.Count - 1;

                ExpressionToken newToken = CreateQueueExpression(
                    queueTokens,
                    ParserSettings,
                    ExpressionGroup);

                for (var j = endIndex; j >= startIndex; j--)
                {
                    Tokens.RemoveAt(j);
                }

                Tokens.Insert(startIndex, newToken);
            }

            queueTokens = null;
            endIndex    = -1;
            startIndex  = -1;
        }
Esempio n. 4
0
        private static void ValidateTokens(
            ExpressionTokens tokens)
        {
            Int32 equalOperators = 0;
            Int32 beginBrackets  = 0;
            Int32 endBrackets    = 0;

            for (int i = 0; i < tokens.Count; i++)
            {
                ExpressionToken prevToken    = i > 0 ? tokens[i - 1] : null;
                ExpressionToken currentToken = tokens[i];
                ExpressionToken nextToken    = i < tokens.Count - 1 ? tokens[i + 1] : null;

                Boolean isStringOrNumber =
                    /* currentToken.TokenType == TokenType.FUNCTION_CALL ||*/
                    currentToken.TokenType == TokenType.VARIABLE ||
                    currentToken.TokenType == TokenType.VALUE ||
                    currentToken.TokenType == TokenType.PROPERTY_NAME;

                Boolean isOperator =
                    currentToken.TokenType == TokenType.OPERATOR;

                // przecinki moga wystepowac tylko w nawiasach i przy wolaniu funkcji
                if (currentToken.TokenType == TokenType.SEPARATOR)
                {
                    Boolean functionCallFound = false;
                    Int32   innerBrackets     = 0;
                    for (var j = i - 1; j >= 0; j--)
                    {
                        ExpressionToken token = tokens[j];
                        if (token.TokenType == TokenType.BRACKET_END)
                        {
                            innerBrackets++;
                        }
                        else if (token.TokenType == TokenType.BRACKET_BEGIN)
                        {
                            innerBrackets--;
                        }
                        else if (token.TokenType == TokenType.OPERATOR &&
                                 OnpOnpTokenHelper.IsFunctionOperatorToken(token))
                        {
                            if (innerBrackets == -1)
                            {
                                functionCallFound = true;
                                break;
                            }
                        }
                    }

                    if (!functionCallFound)
                    {
                        throw new PainIncorrectExpressionFormatException("Invalid function call");
                    }
                }

                if (currentToken.TokenType == TokenType.EQUAL_OPERATOR)
                {
                    equalOperators++;
                }

                if (nextToken != null)
                {
                    if (isOperator &&
                        (nextToken.TokenType == TokenType.OPERATOR ||
                         nextToken.TokenType == TokenType.BRACKET_END))
                    {
                        throw new PainIncorrectExpressionFormatException("Incorrect symbol '" + nextToken.TokenName + "' after operator '" + currentToken.TokenName + "'");
                    }
                    else if (currentToken.TokenType == TokenType.BRACKET_BEGIN &&
                             !OnpOnpTokenHelper.IsFunctionOperatorToken(prevToken) &&
                             (nextToken.TokenType == TokenType.OPERATOR ||
                              nextToken.TokenType == TokenType.BRACKET_END ||
                              nextToken.TokenType == TokenType.EQUAL_OPERATOR))
                    {
                        throw new PainIncorrectExpressionFormatException("Incorrect symbol '" + nextToken.TokenName + "' after operator '('");
                    }
                    else if (
                        currentToken.TokenType == TokenType.BRACKET_END &&
                        nextToken.TokenType != TokenType.OPERATOR &&
                        nextToken.TokenType != TokenType.EQUAL_OPERATOR &&
                        nextToken.TokenType != TokenType.BRACKET_END &&
                        nextToken.TokenType != TokenType.SEPARATOR)
                    {
                        throw new PainIncorrectExpressionFormatException("Incorrect symbol '" + nextToken.TokenName + "' after operator ')'");
                    }
                }

                if (currentToken.TokenType == TokenType.BRACKET_BEGIN)
                {
                    beginBrackets++;
                }
                else if (currentToken.TokenType == TokenType.BRACKET_END)
                {
                    endBrackets++;
                }
            }

            if (beginBrackets != endBrackets)
            {
                throw new PainIncorrectExpressionFormatException("Number of opening brackets is not equal with number of ending brackets");
            }
        }