anchor.diff:          ic.setVariable(v); }
         memberName
         { ic.getVariable().setIdentifier($memberName.identifier); }
  -      specifier
  -      { ic.getVariable().setSpecifierExpression($specifier.specifierExpression); }
  +      conditionSpecifier
  +      { ic.getVariable().setSpecifierExpression($conditionSpecifier.specifierExpression); }
       //-> ^(IS_CONDITION[$IS_OP] unionType ^(VARIABLE unionType memberName specifier))
  -    | booleanCondition
  -      { $condition=$booleanCondition.condition; }
  +    | //(NOT_OP? IS_OP type LIDENTIFIER (RPAREN|COMMA)) =>
  +      (n1=NOT_OP { not=true; })?
  +      i1=IS_OP
  +      { ic = new IsCondition($i1); 
  +        ic.setNot(not);
  +        $condition = ic; }
  +      t1=type
  +      { ic.setType($t1.type); }
  +      impliedVariable 
  +      { ic.setVariable($impliedVariable.variable); }
  +    //-> ^(IS_CONDITION[$IS_OP] unionType ^(VARIABLE SYNTHETIC_VARIABLE memberName ^(SPECIFIER_EXPRESSION ^(EXPRESSION ^(BASE_MEMBER_EXPRESSION memberName)))))
       ;
   
   satisfiesCondition returns [SatisfiesCondition condition]
  
positive.code:       )?
      ;
  
  variable returns [Variable variable]
      : compilerAnnotations
        var
  
negative.code:     
  existsCondition returns [Condition condition]
      @init { ExistsCondition ec = null; }
      : (EXISTS compilerAnnotations (declarationStart|specificationStart)) =>
        e2=EXISTS 
        { ec = new ExistsCondition($e2); 
          $condition = ec; }
        specifiedConditionVariable 
        { ec.setVariable($specifiedConditionVariable.variable); }
      //-> ^(EXISTS_CONDITION[$EXISTS] specifiedVariable2)
      | //(EXISTS LIDENTIFIER (RPAREN|COMMA)) =>
        e1=EXISTS
        { ec = new ExistsCondition($e1); 
          $condition = ec; }
        impliedVariable
        { ec.setVariable($impliedVariable.variable); }
      //-> ^(EXISTS_CONDITION[$EXISTS] impliedVariable)
      ;
      
  nonemptyCondition returns [Condition condition]
      @init { NonemptyCondition nc = null; }
      : (NONEMPTY compilerAnnotations (declarationStart|specificationStart)) =>
        n2=NONEMPTY 
        { nc = new NonemptyCondition($n2); 
          $condition = nc; }
        specifiedConditionVariable 
        { nc.setVariable($specifiedConditionVariable.variable); }
      //-> ^(NONEMPTY_CONDITION[$NONEMPTY] specifiedVariable2)
      | //(NONEMPTY LIDENTIFIER (RPAREN|COMMA)) =>
        n1=NONEMPTY 
        { nc = new NonemptyCondition($n1); 
          $condition = nc; }
        impliedVariable 
        { nc.setVariable($impliedVariable.variable); }
      //-> ^(NONEMPTY_CONDITION[$NONEMPTY] impliedVariable)
      ;
  
  isCondition returns [Condition condition]
      @init { IsCondition ic = null;
              boolean not = false; }
      : (NOT_OP? IS_OP type LIDENTIFIER SPECIFY) =>
        (n2=NOT_OP { not=true; })?
        i2=IS_OP 
        { ic = new IsCondition($i2);
          ic.setNot(not); 
  