anchor.diff:    ;
   
   primFormulaSuffix
  -  : '(' formulaArgs? ')'                                #FormulaApplySuffix
  -  | '.' ID '(' formulaArgs? ')'                         #FormulaMethodInvokeSuffix
  -  | '.' ID '(' formulaUpdates ')'                       #FormulaUpdatesSuffix
  +  : '(' formulaUpdates ')'                              #FormulaUpdatesSuffix
  +  |  typeArgs? '(' formulaArgs? ')'                     #FormulaApplySuffix
  +  | '.' ID typeArgs? '(' formulaArgs? ')'               #FormulaMethodInvokeSuffix
     | '.' ID                                              #FormulaAccessSuffix
     ;
   
  
positive.code:   ;
  
  traitDecl
    : 'sealed' 'trait' ID
    ;
  
  recordDecl
    : '@' ann=ID // t=="record" or t=="irecord"
      'case' 'class'
      id=ID '(' ( param ( ',' param )* )? ')'
      ( 'extends' superTrait=ID )?
    ;
  
  blockEnd
  
negative.code:       | 'N8' | 'N16' | 'N32' | 'N64'
        | 'S8' | 'S16' | 'S32' | 'S64'
        | 'U8' | 'U16' | 'U32' | 'U64' )
    ;
  
  typeArgs
    : '[' type ( ',' type )* ']'
    ;
  
  typeParams
    : '[' ID ( ',' ID )* ']'
    ;
  
  justification
  