diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g
index a4ac6c4a554ad3f4da89b82cacbb7a519c7d2f92..49c60a52d61bc14bf9ba91604a5a22993fbdc2bf 100644
--- a/libwccl/parser/grammar.g
+++ b/libwccl/parser/grammar.g
@@ -40,6 +40,7 @@ header {
 	#include <libwccl/ops/functions/strset/tolower.h>
 	#include <libwccl/ops/functions/strset/getlemmas.h>
 	
+  #include <libwccl/ops/functions/tset/catfilter.h>
 	#include <libwccl/ops/functions/tset/getsymbols.h>
 	#include <libwccl/ops/functions/tset/getwordclass.h>
 	#include <libwccl/ops/functions/tset/getsymbolsinrange.h>
@@ -497,6 +498,7 @@ symset_operator
 	| ret = symset_var_val   [tagset, vars]
 	| ret = symset_class     [tagset, vars]
 	| ret = symset_range     [tagset, vars]
+	| ret = symset_catflt    [tagset, vars]
 	//
 	| LPAREN ret = symset_operator [tagset, vars] RPAREN
 ;
@@ -605,6 +607,24 @@ symset_range
 		}
 ;
 
+// ----------------------------------------------------------------------------
+// Catflt operator
+symset_catflt
+  [const Corpus2::Tagset& tagset, Variables& vars]
+  returns [boost::shared_ptr<Function<TSet> > ret]
+{
+  boost::shared_ptr<Function<TSet> > selector, mask;
+  boost::shared_ptr<Function<Position> > position;
+}
+  : "catflt" LPAREN 
+			position = position_operator [tagset, vars] COMMA
+			selector = symset_operator   [tagset, vars] COMMA
+			mask    = symset_operator    [tagset, vars] 
+  	RPAREN {
+  	  ret.reset(new CatFilter(position, selector, mask));
+  	}
+;
+
 ///////////////////////////////////////////////////////////////////////////////
 // Position operator
 // Returns boost::shared_ptr<Function<Position> >