anchor.diff:  	: c1=selectElem {retval.add($c1.retval);} (COMMA c2=selectElem {retval.add($c2.retval);})*;
   
   selectElem returns [SelectElement retval]
  -	: c=valExpr (keyAS i=ID)?			{$selectElem.retval = ExprSelectElement.newExprElement($c.retval, $i.text);}
  +	: c=valExpr (keyAS i=simpleName)?		{$selectElem.retval = ExprSelectElement.newExprElement($c.retval, $i.text);}
   	| f=familyRef					{$selectElem.retval = FamilySelectElement.newFamilyElement($f.text);}
   	;
   
  
positive.code: 	: (a1=defineAttrib {retval.add($a1.retval);} (COMMA a2=defineAttrib {retval.add($a2.retval);})*)?;
  	
  defineAttrib returns [ColumnDescription retval]
  	: c=varRef type=ID (b=LBRACE RBRACE)? m=keyMAP? (keyALIAS a=ID)?	
  							{retval = ColumnDescription.newColumn($c.text, $a.text, $m.text!=null, false, $type.text, $b.text!=null);}
  	| f=familyRef (keyALIAS a=ID)?			{retval = ColumnDescription.newFamilyDefault($f.text, $a.text);}
  	;
  
  
  deleteStmt  returns [DeleteCmd retval]
  	: keyDELETE keyFROM t=ID w=whereValue?			
  	  						{retval = new DeleteCmd($t.text, $w.retval);};
  
  selectStmt returns [QueryArgs retval]
  	: keySELECT c=selectElems keyFROM t=ID w=whereValue?			
  							{retval = new QueryArgs($c.retval, $t.text, $w.retval);};
  
  selectElems returns [List<SelectElement> retval]
  
negative.code: 							{retval = new DelegateBetweenStmt($s1.retval, ($n.text != null), $s2.retval, $s3.retval);}
  	| s1=valExpr n=keyNOT? keyIN LPAREN l=valueItemList RPAREN			
  							{retval = new DelegateInStmt($s1.retval, ($n.text != null), $l.retval);} 
  	| s1=valExpr keyIS (n=keyNOT)? keyNULL		{retval = new DelegateNullCompare(($n.text != null), $s1.retval);}	
  	;
  
  valueItemList returns [List<GenericValue> retval]
  