anchor.diff:  
   type
     : baseType ( '[' type ( ',' type )+ ']' )?
  -  | t=( 'S' | 'IS' ) '[' i=intType ',' v=type  ']'
  +  | t=( 'MS' | 'IS' ) '[' i=intType ',' v=type ']'
     ;
   
   baseType
  
positive.code:       '.' ID                                            #TypeAccess
        // ID in { "Min", "Max", "random" }
    | ( t='ZS'
      | t=( 'S' | 'IS' ) '[' i=intType ',' v=type ']' )
      '(' ( formula ( ',' formula )* )? ')'               #Seq
    | ( t='ZS' '.' id=ID
      | t=( 'S' | 'IS' )
        '.' id=ID '[' i=intType ',' v=type ']' )
      // id == "create"
      '(' ( formula ( ',' formula )* )? ')'               #SeqCreate
  
negative.code:   : '=' e=formula ',' NL* 'if' c=formula '(' ID ')'
    ;
  
  with
    : 'with' withDef ( NL+ withDef ) NL+
    ;
  
  withDef
    : ID ':' type '=' NL? exp
    ;
  
  funDefSimple
    : '=' e=formula
    ;
  