code: private Stmt parseDoWhileStatement(EnclosingScope scope) {
  		int start = index;
  		match(Do);
  		match(Colon);
  		int end = index;
  		matchEndLine();
  		// match the block
  		Stmt.Block blk = parseBlock(scope, true);
  		// match while and condition
  		match(While);
  		Expr condition = parseLogicalExpression(scope, false);
  		// Parse the loop invariants
  		Tuple<Expr> invariant = parseInvariant(scope,Where);
  		matchEndLine();
  		return annotateSourceLocation(new Stmt.DoWhile(condition, invariant, new Tuple<>(), blk), start, end-1);
  	}
docs: Parse a do-while statement, which has the form:
  
  <pre>
  DoWhileStmt ::= "do" ':' NewLine Block "where" Expr ("where" Expr)*
  </pre>
  
  @see wyc.lang.Stmt.DoWhile
  
  @param scope
  The enclosing scope for this statement, which determines the
  set of visible (i.e. declared) variables and also the current
  indentation level.
  @return
  @author David J. Pearce