Beispiel #1
0
        /// <summary>
        /// 1. var name;
        /// 2. var age = 21;
        /// 3. canDrink = age >= 21;
        /// 4. canVote = CanVote(age);
        /// </summary>
        /// <returns></returns>
        public Expr ParseAssignment(bool expectVar, bool expectId, Expr varExp)
        {
            var initiatorToken = _tokenIt.NextToken;
            var declarations   = new List <AssignExpr>();

            if (expectVar)
            {
                _tokenIt.Expect(Tokens.Var);
            }
            if (expectId)
            {
                varExp = ParseVariable();
            }

            var assignToken = _tokenIt.NextToken;

            // Case 1: var name;
            if (_tokenIt.IsEndOfStmtOrBlock())
            {
                AddAssignment(expectVar, varExp, null, declarations, _tokenIt.NextToken);
                return(Exprs.AssignMulti(expectVar, declarations, initiatorToken));
            }

            // Case 2: var name = <expression>
            Expr valueExp = null;

            assignToken = _tokenIt.NextToken;
            if (_tokenIt.NextToken.Token == Tokens.Assignment)
            {
                _tokenIt.Advance();
                valueExp = _parser.ParseExpression(Terminators.ExpVarDeclarationEnd, passNewLine: false);
            }

            AddAssignment(expectVar, varExp, valueExp, declarations, assignToken);
            if (_tokenIt.IsEndOfStmtOrBlock() || _tokenIt.NextToken.Token.Kind == TokenKind.Keyword)
            {
                return(Exprs.AssignMulti(expectVar, declarations, initiatorToken));
            }

            // Case 3: Multiple var a,b,c; or var a = 1, b = 2, c = 3;
            _tokenIt.Expect(Tokens.Comma);

            while (true)
            {
                varExp      = ParseVariable();
                valueExp    = null;
                assignToken = _tokenIt.NextToken;

                // , or expression?
                if (_tokenIt.NextToken.Token == Tokens.Assignment)
                {
                    _tokenIt.Advance();
                    valueExp = _parser.ParseExpression(Terminators.ExpVarDeclarationEnd, passNewLine: false);
                }
                AddAssignment(expectVar, varExp, valueExp, declarations, assignToken);

                if (_tokenIt.IsEndOfStmtOrBlock())
                {
                    break;
                }

                _tokenIt.Expect(Tokens.Comma);
            }
            return(Exprs.AssignMulti(expectVar, declarations, initiatorToken));
        }