/// <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)); }