anchor.diff:      push(ast.variableDeclarationStatement(
           ast.variableDeclarationList(
               comment, metadata, keyword, type, variables),
  -        endToken));
  +        semicolon));
     }
   
     void handleAssignmentExpression(Token token) {
  +    assert(token.type.isAssignmentOperator);
       debugEvent("AssignmentExpression");
  +
       Expression rhs = pop();
       Expression lhs = pop();
       push(ast.assignmentExpression(lhs, token, rhs));
     }
   
  -  void endBlock(int count, Token beginToken, Token endToken) {
  +  void endBlock(int count, Token leftBracket, Token rightBracket) {
  +    assert(optional('{', leftBracket));
  +    assert(optional('}', rightBracket));
       debugEvent("Block");
  +
       List<Statement> statements = popList(count) ?? <Statement>[];
       exitLocalScope();
  -    push(ast.block(beginToken, statements, endToken));
  +    push(ast.block(leftBracket, statements, rightBracket));
     }
   
     void endForStatement(Token forKeyword, Token leftParen, Token leftSeparator,
         int updateExpressionCount, Token endToken) {
  +    assert(optional('for', forKeyword));
  +    assert(optional('(', leftParen));
  +    assert(optional(';', leftSeparator));
       debugEvent("ForStatement");
  +
       Statement body = pop();
       List<Expression> updates = popList(updateExpressionCount);
       Statement conditionStatement = pop();
  
positive.code:   @override
    void endCompilationUnit(int count, Token endToken) {
      debugEvent("CompilationUnit");
      Token beginToken = pop();
      checkEmpty(endToken.charOffset);
  
  
negative.code:   @override
    void endDoWhileStatement(
        Token doKeyword, Token whileKeyword, Token semicolon) {
      assert(optional('do', doKeyword));
      assert(optional('while', whileKeyword));
      assert(optional(';', semicolon));
      debugEvent("DoWhileStatement");
  
      ParenthesizedExpression condition = pop();
      Statement body = pop();
      exitContinueTarget();
  