anchor.diff:      : expression | existsCondition | nonemptyCondition | isCondition
       ;
   
  -// Backtracking here is needed for exactly the same reason as localOrStatement.
   existsCondition
  -    : 'exists' ( (variableStart) => variable specifier | expression )
  -    -> ^(EXISTS_EXPR variable? specifier? expression?)
  +    : 'exists' controlVariableOrExpression
  +    -> ^(EXISTS_EXPR controlVariableOrExpression)
       ;
       
   nonemptyCondition
  -    : 'nonempty' ( (variableStart) => variable specifier | expression )
  -    -> ^(NONEMPTY_EXPR variable? specifier? expression?)
  -    ;
  -    
  +    : 'nonempty' controlVariableOrExpression
  +    -> ^(NONEMPTY_EXPR controlVariableOrExpression)
  +    ;
  +
   isCondition
       : 'is' type ( (memberName '=') => memberName specifier | expression )
       -> ^(IS_EXPR type memberName? specifier? expression?)
  
positive.code: //of '?' and 'exists'/'nonempty'?
  defaultExpression
      : existenceEmptinessExpression 
        ('?' defaultExpression)?
      ;
  
  /*
  
negative.code: 
  //special rule for syntactic predicate
  variableStart
      : variable ('in'|'=')
      ;
  
  // Lexer
  
  fragment
  Digits
      : ('0'..'9')+
      ;
  
  fragment 
  Exponent    
      :   ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ 
      ;
  
  fragment FLOATLITERAL :;
  fragment ELLIPSIS :;
  fragment RANGE :;
  fragment DOT :;
  NATURALLITERAL
      : Digits 
        ( { input.LA(2) != '.' }? => '.' Digits Exponent? { $type = FLOATLITERAL; } )?
      | '.' ( '..' { $type = ELLIPSIS; } | '.'  { $type = RANGE; } | { $type = DOT; } )
      ;
  
  CHARLITERAL
  