anchor.diff:  stmts: stmt? ( NL+ stmt? )* ;
   
   stmt
  -  : modifier=( 'var' | 'val' ) ID ':' type '=' NL? exp  #VarDeclStmt
  +  : '@' ann=ID // ann=='native'
  +    modifier=( 'var' | 'val' ) ID ':' type '='
  +    ( '???' | NL? exp )                                 #VarDeclStmt
     | ID '=' NL? exp                                      #AssignVarStmt
     | 'assume' '(' exp ')'                                #AssumeStmt
     | 'assert' '(' exp ')'                                #AssertStmt
  
positive.code:   ;
  
  primExpSuffix
    : '(' expArgs? ')'                                    #ExpApplySuffix
    | '.' ID '(' expArgs? ')'                             #ExpMethodInvokeSuffix
    | '.' ID '(' expUpdates ')'                           #ExpUpdatesSuffix
    | '.' ID                                              #ExpAccessSuffix
    ;
  
  
negative.code:     qf=formula
    ;
  
  name
    : ID ( '.' ID )*
    ;
  
  type
    : baseType ( '[' type ( ',' type )+ ']' )?
    | t=( 'S' | 'IS' ) '[' i=intType ',' v=type  ']'
    ;
  
  baseType
    : t=( 'B' | 'R' | 'F32' | 'F64' | 'ZS' )
    | intType
    | name
    ;
  
  intType
  