Expr HandleLet() { var multi = new List <Expr>(); do { string name = _parser.ReadIdentifier(); if (name == null) { return(new SyntaxErrorExpr(_parser.Location, "Expected identifier (variable name).")); } Expr e = _scope.Declare(name, new AccessorLetExpr(_parser.PrevNonCommentLocation, name)); if (_parser.Match(JSTokenizerToken.Assign)) { e = HandleAssign(e, true); } multi.Add(e); if (e is SyntaxErrorExpr) { break; } }while(_parser.Match(JSTokenizerToken.Comma)); if (multi.Count == 1) { return(multi[0]); } return(new ListOfExpr(multi)); }
Expr HandleLet() { List <AccessorLetExpr> decl = null; List <Expr> multi = null; for ( ;;) { string name = _parser.ReadIdentifier(); if (name == null) { return(new SyntaxErrorExpr(_parser.Location, "Expected identifier (variable name).")); } var v = new AccessorLetExpr(_parser.PrevNonCommentLocation, name); Expr e = _parser.IsAssignOperator ? HandleAssign(v, _scope.Find(name), name) : v; Debug.Assert(!(e is SyntaxErrorExpr)); if (_parser.Match(TokenizerToken.Comma)) { if (multi == null) { multi = new List <Expr>(); decl = new List <AccessorLetExpr>(); } multi.Add(e); decl.Add(v); } else { Expr reg = _scope.Declare(v); if (reg is SyntaxErrorExpr) { return(reg); } if (multi == null) { return(e); } foreach (var var in decl) { reg = _scope.Declare(var); if (reg is SyntaxErrorExpr) { return(reg); } } multi.Add(e); return(new ListOfExpr(multi)); } } }