anchor.diff:  
   primary_expr :
        literal
  -  |  LPAREN FILLER? expr RPAREN
  +  |  lparen FILLER? expr FILLER? rparen
     |  matrix
     |  cell_array
     |  access
  
positive.code:   ;
  
  access :
       cell_access (FILLER? LPAREN FILLER? (arg_list FILLER?)? RPAREN)?
    ;
  
  cell_access :
       (var_access) (LCURLY FILLER? arg_list FILLER? RCURLY)*
    |  name FILLER? AT FILLER? name
    ;
    
  var_access :
       (name) (FILLER? DOT FILLER? name)*
    ;
  
  arg_list :	
       (arg) (FILLER? COMMA FILLER? arg)*
    ;
    
  
negative.code: 
  name :
       IDENTIFIER
    ;
  
  lparen :
       LPAREN { bracketStack.push(LPAREN); }
    ;
  
  rparen :
       RPAREN { bracketStack.pop(); }
    ;
  
  lsquare :
       LSQUARE { bracketStack.push(LSQUARE); }
    ;
  
  rsquare :
       RSQUARE { bracketStack.pop(); }
    ;
  
  lcurly :
       LCURLY { bracketStack.push(LCURLY); }
    ;
  
  rcurly :
       RCURLY { bracketStack.pop(); }
    ;
  
  //NB: not distinguishing between identifiers and keywords at this level - everything is an ID
  