Пример #1
0
        private List <NVExpression> ParseNVActualParams()
        {
            // NVActualParams -> "(" [ NVExpression { "," NVExpression } ] ")".

            List <NVExpression> actuals = new List <NVExpression>();

            MatchToken(TokenType.NVLParen);
            if (CurrentTokenType != TokenType.NVRParen)
            {
                NVExpression expr = ParseNVExpression();
                if (expr != null)
                {
                    actuals.Add(expr);
                }

                while (CurrentTokenType == TokenType.NVComma)
                {
                    _scanner.GetToken();
                    expr = ParseNVExpression();
                    if (expr != null)
                    {
                        actuals.Add(expr);
                    }
                }
            }
            MatchToken(TokenType.NVRParen);

            return(actuals);
        }
Пример #2
0
        private NVExpression ParseNVStringLiteralOrDictionary()
        {
            // NVStringLiteralOrDictionary -> { nvText | NVReference }
            //                             -> "%" "{" [ NVDictionaryItem { "," NVDictionaryItem } ] "}".

            NVExpression expr = null;

            if (CurrentTokenType == TokenType.NVDictionaryPercent)
            {
                _scanner.GetToken();

                MatchToken(TokenType.NVDictionaryLCurly);

                if (CurrentTokenType == TokenType.NVDictionaryKey)
                {
                    ParseNVDictionaryItem();

                    while (CurrentTokenType == TokenType.NVComma)
                    {
                        _scanner.GetToken();

                        ParseNVDictionaryItem();
                    }
                }

                MatchToken(TokenType.NVDictionaryRCurly);

                //TODO: Change to DictionaryExpression, this is just a
                expr          = new NVBoolExpression(false);
                expr.Position = new Position(GetCurrentTokenPosition());
            }
            else
            {
                //TODO: { nvText | NVReference }
                while (CurrentTokenType != TokenType.NVDoubleQuote)
                {
                    if (CurrentTokenType == TokenType.NVStringLiteral)
                    {
                        expr          = new NVStringExpression(_scanner.CurrentToken.Image);
                        expr.Position = new Position(GetCurrentTokenPosition());
                    }
                    //TODO make only work in intellisense mode
                    else if (CurrentTokenType == TokenType.Error)
                    {
                        //TODO: check if this is causing CVSI to lock up
                        return(new NVStringExpression(""));
                    }
                    else
                    {
                        AddError(string.Format("Unexpected token type '{0}'", CurrentTokenType));
                        break;
                    }
                    _scanner.GetToken();
                }
            }

            return(expr);
        }
Пример #3
0
        private NVExpression ParseNVTerm()
        {
            // NVTerm -> NVFactor { NVMulOp NVFactor }.

            NVExpression expr = ParseNVFactor();

            while (CurrentTokenIn(TokenType.NVMul, TokenType.NVDiv, TokenType.NVMod))
            {
                expr          = new NVBinaryExpression(ParseNVMulOp(), expr, ParseNVFactor());
                expr.Position = new Position((NVBinaryExpression)expr);
            }

            return(expr);
        }
Пример #4
0
        private NVExpression ParseNVSimpleExpression()
        {
            // NVSimpleExpression -> NVTerm { NVAddOp NVTerm }.

            NVExpression expr = ParseNVTerm();

            while (CurrentTokenIn(TokenType.NVPlus, TokenType.NVMinus))
            {
                expr          = new NVBinaryExpression(ParseNVAddOp(), expr, ParseNVTerm());
                expr.Position = new Position((NVBinaryExpression)expr);
            }

            return(expr);
        }
Пример #5
0
        private NVExpression ParseNVRelExpression()
        {
            // NVRelExpression -> NVSimpleExpression [ NVRelOp NVSimpleExpression ].

            NVExpression expr = ParseNVSimpleExpression();

            if (CurrentTokenIn(TokenType.NVLte, TokenType.NVLt, TokenType.NVGt, TokenType.NVGte,
                               TokenType.NVEqEq, TokenType.NVNeq))
            {
                expr          = new NVBinaryExpression(ParseNVRelOp(), expr, ParseNVSimpleExpression());
                expr.Position = new Position((NVBinaryExpression)expr);
            }

            return(expr);
        }
Пример #6
0
        private NVExpression ParseNVAndExpression()
        {
            // NVAndExpression -> NVRelExpression { ( "&&" | "and" ) NVRelExpression }.

            NVExpression expr = ParseNVRelExpression();

            while (CurrentTokenType == TokenType.NVAnd)
            {
                _scanner.GetToken();
                expr          = new NVBinaryExpression(Operator.And, expr, ParseNVRelExpression());
                expr.Position = new Position((NVBinaryExpression)expr);
            }

            return(expr);
        }
Пример #7
0
 public NVBinaryExpression(Operator op, NVExpression lhs, NVExpression rhs)
 {
     _op = op;
     _rhs = rhs;
     _lhs = lhs;
 }
Пример #8
0
        private NVExpression ParseNVPrimary()
        {
            // NVPrimary -> NVReference
            //           -> "(" NVExpression ")"
            //           -> "true"
            //           -> "false"
            //           -> nvIntegerLiteral
            //           -> "'" nvStringLiteral "'"
            //           -> "\"" NVStringLiteralOrDictionary "\""
            //           -> "[" [ NVExpression NVRangeOrArray ] "]".

            NVExpression expr = null;

            if (CurrentTokenType == TokenType.NVDollar)
            {
                //TODO: Change to ParseNVDesignatorExpression
                ParseNVReference();

                expr          = new NVBoolExpression(false);
                expr.Position = new Position(GetCurrentTokenPosition());
            }
            else if (CurrentTokenType == TokenType.NVLParen)
            {
                _scanner.GetToken();

                expr = ParseNVExpression();

                MatchToken(TokenType.NVRParen);
            }
            else if (CurrentTokenType == TokenType.NVTrue)
            {
                expr          = new NVBoolExpression(true);
                expr.Position = new Position(GetCurrentTokenPosition());
                _scanner.GetToken();
            }
            else if (CurrentTokenType == TokenType.NVFalse)
            {
                expr          = new NVBoolExpression(false);
                expr.Position = new Position(GetCurrentTokenPosition());
                _scanner.GetToken();
            }
            else if (CurrentTokenType == TokenType.NVIntegerLiteral)
            {
                expr          = new NVNumExpression(int.Parse(_scanner.CurrentToken.Image));
                expr.Position = new Position(GetCurrentTokenPosition());
                _scanner.GetToken();
            }
            else if (CurrentTokenType == TokenType.NVSingleQuote)
            {
                _scanner.GetToken();

                if (CurrentTokenType == TokenType.NVStringLiteral)
                {
                    expr          = new NVStringExpression(_scanner.CurrentToken.Image);
                    expr.Position = new Position(GetCurrentTokenPosition());
                    _scanner.GetToken();
                }

                if (CurrentTokenType == TokenType.NVSingleQuote)
                {
                    _scanner.GetToken();
                }
                else
                {
                    AddError("Expected single quote for closing string literal");
                }
            }
            else if (CurrentTokenType == TokenType.NVDoubleQuote)
            {
                _scanner.GetToken();

                expr = ParseNVStringLiteralOrDictionary();

                MatchToken(TokenType.NVDoubleQuote);
            }
            else if (CurrentTokenType == TokenType.NVLBrack)
            {
                _scanner.GetToken();

                if (CurrentTokenType != TokenType.NVRBrack)
                {
                    ParseNVExpression();
                    expr = ParseNVRangeOrArray();
                }
                else
                {
                    //TODO: replace with an empty NVArrayExpression
                    expr          = new NVBoolExpression(false);
                    expr.Position = new Position(GetCurrentTokenPosition());
                }

                MatchToken(TokenType.NVRBrack);
            }
            else
            {
                AddError(string.Format("Expected expression, was '{0}'", CurrentTokenType));
            }

            return(expr);
        }
Пример #9
0
 public NVBinaryExpression(Operator op, NVExpression lhs, NVExpression rhs)
 {
     _op  = op;
     _rhs = rhs;
     _lhs = lhs;
 }