anchor.diff:     )
      ;
   structPatternEtCetera: outerAttribute* '..';
  -tupleStructPattern
  -   : pathInExpression '(' tupleStructItems? ')'
  -   ;
  +tupleStructPattern: pathInExpression '(' tupleStructItems? ')';
   tupleStructItems: pattern (',' pattern)* ','?;
   tuplePattern: '(' tuplePatternItems? ')';
  -tuplePatternItems
  -   : pattern ','
  -   | restPattern
  -   | pattern (',' pattern)+ ','?
  -   ;
  +tuplePatternItems: pattern ',' | restPattern | pattern (',' pattern)+ ','?;
   groupedPattern: '(' pattern ')';
   slicePattern: '[' slicePatternItems ']';
   slicePatternItems: pattern (',' pattern)* ','?;
  -pathPattern
  -   : pathInExpression
  -   | qualifiedPathInExpression
  -   ;
  -
  -type
  -   : typeNoBounds
  -   | implTraitType
  -   | traitObjectType
  -   ;
  +pathPattern: pathInExpression | qualifiedPathInExpression;
  +
  +type: typeNoBounds | implTraitType | traitObjectType;
   typeNoBounds
      : parenthesizedType
      | implTraitTypeOneBound
  
positive.code:    | macroInvocationSemi
     ;
  
  letStatement
     : outerAttribute* 'let' pattern (':' type)?
     (
        '=' expression
     )? ';'
     ;
  expressionStatement
     : expressionWithoutBlock ';'
     | expressionWithBlock ';'?
     ;
  expression
     : expressionWithoutBlock
     | expressionWithBlock
     ;
  
  expressionWithoutBlock
     : outerAttribute*
     (
        literalExpression
        | pathExpression
        | operatorExpression
        | groupedExpression
        | arrayExpression
        | awaitExpression
        | indexExpression
        | tupleExpression
        | tupleIndexingExpression
        | structExpression
        | enumerationVariantExpression
        | callExpression
        | methodCallExpression
        | fieldExpression
        | closureExpression
        | continueExpression
        | breakExpression
        | rangeExpression
        | returnExpression
        | macroInvocation
     )
     ;
  expressionWithBlock
     : outerAttribute*
     (
        blockExpression
        | asyncBlockExpression
        | unsafeBlockExpression
        | loopExpression
        | ifExpression
        | ifLetExpression
        | matchExpression
     )
     ;
  
  literalExpression
  
negative.code: enumItemStruct: '{' structFields? '}';
  enumItemDiscriminant: '=' expression;
  
  union: 'union' identifier generics? whereClause? '{' structFields '}';
  
  constantItem: 'const' (identifier | '_') ':' type '=' expression;
  staticItem: 'static' 'mut'? identifier ':' type '=' expression;
  
  trait
     : 'unsafe'? 'trait' identifier generics? (':' typeParamBounds?)? whereClause? '{' innerAttribute* traitItem* '}'
     ;
  
  traitItem
  