anchor.diff:  	 |  expr (GT | GTE | LT | LTE) expr       #comparisonExpr
   	 |  expr ( EQ | NEQ ) expr                #equalityExpr
   	 |  fullyQualifiedType                    #typeExpr
  +	 |  anonymousRef                          #anonRefExpr
   	 |  funcCall                              #inlineFuncCall
   	 |  path                                  #pathExpr
  +	 |  listLiteral                           #listExpr
   	 |	NUMBER 								  #numExpr
   	 |  BOOLEAN_LITERAL						  #boolExpr
   	 |  STRING_LITERAL                        #stringExpr
  
positive.code:     |   funcDeclInit NEWLINE
      |   funcDecl NEWLINE
      |   anonExpr
      ;
  
  expr : '(' expr ')'						      #parensExpr
  
negative.code:         END
      ;
  
  namedRef
      :   name=IDENT reference
      ;
  
  anonymousRef
      :   reference
      ;
  
  reference
      :   REF funcCall outputSelector
      ;
  
  outputSelector
      :   (LSQUARE selectedOutput=IDENT RSQUARE)?
      ;
  
  funcDeclInit
      :   name=IDENT fullyQualifiedType ( LSQUARE activeObject=IDENT RSQUARE )? ('(' arguments? ')')
      ;
  
  funcCall : fullyQualifiedType ( LSQUARE activeObject=IDENT RSQUARE )? ('(' arguments? ')')?;
  
  funcDecl
      :   name=IDENT fullyQualifiedType ( LSQUARE activeObject=IDENT RSQUARE )?
  