diff --git a/libwccl/parser/Parser.cpp b/libwccl/parser/Parser.cpp
index b713ae67c32644d43116adc4161e2baeffd28930..86389a32f0ec313a00b416f233ff695bd3a21767 100644
--- a/libwccl/parser/Parser.cpp
+++ b/libwccl/parser/Parser.cpp
@@ -4,6 +4,7 @@
 
 #include <antlr/NoViableAltException.hpp>
 #include <antlr/MismatchedTokenException.hpp>
+#include <antlr/TokenStreamRecognitionException.hpp>
 
 namespace Wccl {
 
@@ -190,6 +191,11 @@ boost::shared_ptr<ANTLRParserResultBase> Parser::parseAnyOperator(
 					<< "(as tset    ) "
 					<< e.getFileLineColumnString()
 					<< " " << e.getMessage();
+		} catch(antlr::TokenStreamRecognitionException &e) {
+			errors << std::endl
+					<< "(as tset    ) "
+					<< e.getLine() << ":" << e.getColumn()
+					<< " " << e.getMessage();
 		} catch (antlr::ANTLRException& e) {
 			errors << std::endl
 					<< "(as tset    ) " << e.getMessage();
@@ -213,6 +219,11 @@ boost::shared_ptr<ANTLRParserResultBase> Parser::parseAnyOperator(
 					<< "(as strset  ) "
 					<< e.getFileLineColumnString()
 					<< " " << e.getMessage();
+		} catch(antlr::TokenStreamRecognitionException &e) {
+			errors << std::endl
+					<< "(as strset  ) "
+					<< e.getLine() << ":" << e.getColumn()
+					<< " " << e.getMessage();
 		} catch (antlr::ANTLRException& e) {
 			errors << std::endl
 					<< "(as strset  ) " << e.getMessage();
@@ -236,6 +247,11 @@ boost::shared_ptr<ANTLRParserResultBase> Parser::parseAnyOperator(
 					<< "(as bool    ) "
 					<< e.getFileLineColumnString()
 					<< " " << e.getMessage();
+		} catch(antlr::TokenStreamRecognitionException &e) {
+			errors << std::endl
+					<< "(as bool    ) "
+					<< e.getLine() << ":" << e.getColumn()
+					<< " " << e.getMessage();
 		} catch (antlr::ANTLRException& e) {
 			errors << std::endl
 					<< "(as bool    ) " << e.getMessage();
@@ -254,6 +270,11 @@ boost::shared_ptr<ANTLRParserResultBase> Parser::parseAnyOperator(
 					<< "(as position) "
 					<< e.getFileLineColumnString()
 					<< " " << e.getMessage() << std::endl;
+		} catch(antlr::TokenStreamRecognitionException &e) {
+			errors << std::endl
+					<< "(as position) "
+					<< e.getLine() << ":" << e.getColumn()
+					<< " " << e.getMessage();
 		} catch(antlr::NoViableAltException &e) {
 			errors << std::endl
 					<< "(as position) "
diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g
index c0f08ca068f06e5412f16bf79ec77c5608bc2ce6..d4ee973a0ad697c0d99c78ee1c0491fd9f4480ca 100644
--- a/libwccl/parser/grammar.g
+++ b/libwccl/parser/grammar.g
@@ -43,6 +43,7 @@ header {
 	#include <libwccl/ops/functions/strset/tolower.h>
 	#include <libwccl/ops/functions/strset/getlemmas.h>
 	
+	#include <libwccl/ops/functions/tset/agrfilter.h>
   #include <libwccl/ops/functions/tset/catfilter.h>
 	#include <libwccl/ops/functions/tset/getsymbols.h>
 	#include <libwccl/ops/functions/tset/getwordclass.h>
@@ -498,10 +499,11 @@ symset_operator
 	returns [boost::shared_ptr<Function<TSet> > ret]
 	: ret = symset_condition [tagset, vars]
 	| (SYMBOL LBRACKET) => (ret = symset_getsymbol [tagset, vars])
-	| ret = symset_var_val   [tagset, vars]
-	| ret = symset_class     [tagset, vars]
-	| ret = symset_range     [tagset, vars]
-	| ret = symset_catflt    [tagset, vars]
+	| ret = symset_var_val [tagset, vars]
+	| ret = symset_class   [tagset, vars]
+	| ret = symset_range   [tagset, vars]
+	| ret = symset_catflt  [tagset, vars]
+	| ret = symset_agrflt  [tagset, vars]
 	//
 	| LPAREN ret = symset_operator [tagset, vars] RPAREN
 ;
@@ -621,6 +623,26 @@ symset_catflt
   	}
 ;
 
+// ----------------------------------------------------------------------------
+// Agrflt operator
+symset_agrflt
+  [const Corpus2::Tagset& tagset, Variables& vars]
+  returns [boost::shared_ptr<Function<TSet> > ret]
+{
+  boost::shared_ptr<Function<TSet> > attr, mask;
+  boost::shared_ptr<Function<Position> > lpos, rpos;
+}
+  : "agrflt" LPAREN 
+			lpos = position_operator [tagset, vars] COMMA
+			rpos = position_operator [tagset, vars] COMMA
+			attr = symset_operator   [tagset, vars] COMMA
+			mask = symset_operator   [tagset, vars] 
+  	RPAREN {
+  	  ret.reset(new AgrFilter(lpos, rpos, attr, mask, tagset));
+  	}
+;
+
+
 ///////////////////////////////////////////////////////////////////////////////
 // Position operator
 // Returns boost::shared_ptr<Function<Position> >
diff --git a/wcclparser/bool_main.cpp b/wcclparser/bool_main.cpp
index c1570b0192c50eeb7b63dc657797a782d51b54a4..05c842797d63463530c98d4bcd7bbd73253ea714 100644
--- a/wcclparser/bool_main.cpp
+++ b/wcclparser/bool_main.cpp
@@ -2,8 +2,10 @@
 #include <libwccl/values/bool.h>
 #include <libwccl/parser/Parser.h>
 #include <libwccl/parser/ANTLRParserResult.h>
+
 #include <antlr/NoViableAltException.hpp>
 #include <antlr/MismatchedTokenException.hpp>
+#include <antlr/TokenStreamRecognitionException.hpp>
 
 // ----------------------------------------------------------------------------
 
@@ -68,11 +70,15 @@ int main()
 			} catch(antlr::NoViableAltException &e) {
 				std::cerr << e.getFileLineColumnString()
 						<< " " << e.getMessage() << std::endl;
+			} catch(antlr::TokenStreamRecognitionException &e) {
+				std::cerr << e.getLine() << ":" << e.getColumn()
+						<< " " << e.getMessage() << std::endl;
 			} catch (Wccl::InvalidVariableName &e) {
 				std::cerr << "Wccl::InvalidVariableName" << std::endl;
 			} catch (Wccl::VariableTypeMismatch &e) {
 				std::cerr << "Wccl::VariableTypeMismatch" << std::endl;
-			} catch (...) {
+			}
+			 catch (...) {
 				std::cerr << "[N] Syntax error!" << std::endl;
 			}
 		}
diff --git a/wcclparser/strop_main.cpp b/wcclparser/strop_main.cpp
index 13be60bd501fb89d186cdf3eb22b8f514ad2467f..aaf4c97f401a4113af38a9892c7285f1dbb54f59 100644
--- a/wcclparser/strop_main.cpp
+++ b/wcclparser/strop_main.cpp
@@ -4,6 +4,7 @@
 #include <libwccl/parser/ANTLRParserResult.h>
 #include <antlr/NoViableAltException.hpp>
 #include <antlr/MismatchedTokenException.hpp>
+#include <antlr/TokenStreamRecognitionException.hpp>
 
 // ----------------------------------------------------------------------------
 
@@ -67,6 +68,9 @@ int main()
 			} catch(antlr::NoViableAltException &e) {
 				std::cerr << e.getFileLineColumnString()
 						<< " " << e.getMessage() << std::endl;
+			} catch(antlr::TokenStreamRecognitionException &e) {
+				std::cerr << e.getLine() << ":" << e.getColumn()
+						<< " " << e.getMessage() << std::endl;
 			} catch (Wccl::InvalidVariableName &e) {
 				std::cerr << "Wccl::InvalidVariableName" << std::endl;
 			} catch (Wccl::VariableTypeMismatch &e) {
diff --git a/wcclparser/tagset_main.cpp b/wcclparser/tagset_main.cpp
index ddfaaa49af18a7f0eb313866e500b4f4f2ca5fc9..94f84f9bef84294f45e86595f28fb3a80ec1f614 100644
--- a/wcclparser/tagset_main.cpp
+++ b/wcclparser/tagset_main.cpp
@@ -4,6 +4,7 @@
 #include <libwccl/parser/ANTLRParserResult.h>
 #include <antlr/NoViableAltException.hpp>
 #include <antlr/MismatchedTokenException.hpp>
+#include <antlr/TokenStreamRecognitionException.hpp>
 
 #include <libcorpus2/tagsetmanager.h>
 
@@ -69,6 +70,9 @@ int main()
 			} catch(antlr::NoViableAltException &e) {
 				std::cerr << e.getFileLineColumnString()
 						<< " " << e.getMessage() << std::endl;
+			} catch(antlr::TokenStreamRecognitionException &e) {
+				std::cerr << e.getLine() << ":" << e.getColumn()
+						<< " " << e.getMessage() << std::endl;
 			} catch (Wccl::InvalidVariableName &e) {
 				std::cerr << "Wccl::InvalidVariableName" << std::endl;
 			} catch (Wccl::VariableTypeMismatch &e) {