code: Expr assign() {
  		Tok idTok = peek();
  		if (idTok.sym != Sym.ID) {
  			return ternary();
  		}
  		
  		int begin = forward;
  		// ID = expr
  		if (move().sym == Sym.ASSIGN) {
  			move();
  			return new Assign(idTok.value(), expr(), location);
  		}
  		
  		// array、map 赋值：ID [ expr ] = expr
  		if (peek().sym == Sym.LBRACK) {
  			move();
  			Expr index = expr();
  			match(Sym.RBRACK);
  			if (peek().sym == Sym.ASSIGN) {
  				move();
  				return new Assign(idTok.value(), index, expr(), location);	// 右结合无限连
  			}
  		}
  		
  		resetForward(begin);
  		return ternary();
  	}
docs: assign : <assoc=right> ID ( '[' expr ']' )? '=' expr