anchor.diff:  booleanParen returns [BooleanValue retval]
   options {backtrack=true;}	
   	: LPAREN o=booleanExpr RPAREN			{retval = $o.retval;}
  -	| f=booleanVal					{retval = $f.retval;}
  +	| b=booleanVal					{retval = $b.retval;}
   	;
   
   booleanVal returns [BooleanValue retval]
  
positive.code: 	| i=integerLiteral				{retval = $i.retval;}
  	| b=booleanAtom					{retval = $b.retval;}
  	| keyNULL					{retval = new StringNullLiteral();}
  	| o=booleanExpr 				{retval = $o.retval;}
  	;
  
  booleanAtom returns [ValueExpr retval]
  	: b=booleanLiteral				{retval = $b.retval;}
  	| v=varRef					{retval = this.getVariableRef($v.text);}
  	| p=paramRef
  	;
  									
  // Literals		
  stringLiteral returns [StringValue retval]
  	: v=QUOTED 					{retval = new StringLiteral($v.text);};
  
negative.code: 	| b=booleanAtom					{retval = new BooleanExpr($b.retval);}
  	;
  	
  booleanAtom returns [ValueExpr retval]
  	: b=booleanLiteral				{retval = $b.retval;}
  	| v=varRef					{retval = this.getVariableRef($v.text);}
  	| p=paramRef
  	;
  									
  booleanFuncs returns [BooleanValue retval]
  options {backtrack=true;}	
  	: s1=valueExpr keyCONTAINS s2=valueExpr		{retval = new BooleanFunction(FunctionType.CONTAINS, $s1.retval, $s2.retval);}
  