docs: public Object evaluateUntilLast(Context ctx){
  		
  		if (attributes.length == 0)
  		{
  			//不可能发生，除非beetl写错了，先放在着
  			throw new RuntimeException();
  		}
  		Result ret = this.getValue(ctx);
  		Object value = ret.value;
  		if (value == null)
  		{
  			BeetlException ex = new BeetlException(BeetlException.NULL);
  			ex.pushToken(this.firstToken);
  			throw ex;
  		}
  
  	
  		for (int i = 0; i < attributes.length-1; i++)
  		{
  
  			VarAttribute attr = attributes[i];
  			if (value == null)
  			{
  				
  					BeetlException be = new BeetlException(BeetlException.NULL, "空指针");
  					if (i == 0)
  					{
  						be.pushToken(this.firstToken);
  					}
  					else
  					{
  						be.pushToken(attributes[i - 1].token);
  					}
  
  					throw be;
  
  			}
  
  			try
  			{
  				value = attr.evaluate(ctx, value);
  			}
  			catch (BeetlException ex)
  			{
  				ex.pushToken(attr.token);
  				throw ex;
  
  			}
  			catch (RuntimeException ex)
  			{
  				BeetlException be = new BeetlException(BeetlException.ATTRIBUTE_INVALID, "属性访问出错", ex);
  				be.pushToken(attr.token);
  				throw be;
  			}
  
  		}
  
  		return value ;
  	}