anchor.diff:      return semicolon.next;
     }
   
  +  /// tryStatement:
  +  ///   'try' block (onPart+ finallyPart? | finallyPart)
  +  /// ;
  +  ///
  +  /// onPart:
  +  ///   catchPart block |
  +  ///   'on' type catchPart? block
  +  /// ;
  +  ///
  +  /// catchPart:
  +  ///   'catch' '(' identifier (',' identifier)? ')'
  +  /// ;
  +  ///
  +  /// finallyPart:
  +  ///   'finally' block
  +  /// ;
     Token parseTryStatement(Token token) {
       assert(optional('try', token));
       Token tryKeyword = token;
  
positive.code:     return semicolon.next;
    }
  
    Token parseAssert(Token token, Assert kind) {
      listener.beginAssert(token, kind);
      Token assertKeyword = token;
      Token commaToken = null;
  
negative.code: 
    /// Parse a group of labels, cases and possibly a default keyword and the
    /// statements that they select.
    ///
    /// switchCase:
    ///   label* 'case' expression ‘:’ statements
    /// ;
    ///
    /// defaultCase:
    ///   label* 'default' ‘:’ statements
    /// ;
    Token parseSwitchCase(Token token) {
      Token begin = token;
      Token defaultKeyword = null;
  