diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g
index c9add9feddd428dcc4929a0dee4764ac7f231640..e310b46c1e976e2bd9b066593e6ce2964ed276e5 100644
--- a/libwccl/parser/grammar.g
+++ b/libwccl/parser/grammar.g
@@ -578,32 +578,25 @@ symset_class
 ;
 
 // ----------------------------------------------------------------------------
-// Range operator
-// WARNING! This rule can throw ParserException! Be careful!
+// Range operator: range(class, begin, end) or range({...}, begin, end)
 symset_range
 	[const Corpus2::Tagset& tagset, Variables& vars]
 	returns [boost::shared_ptr<Function<TSet> > ret]
 {
-	Corpus2::Tag tag;
+	boost::shared_ptr<TSet> tset;
 	boost::shared_ptr<Function<Position> > p1, p2;
 }
-	: "range" LPAREN (tag_sym: SYMBOL | tag_class: "class")  COMMA 
-			p1 = position_operator [tagset, vars] COMMA 
-			p2 = position_operator [tagset, vars] 
+	: "range" LPAREN
+			(tset = symset_literal [tagset] | tag_class: "class") COMMA
+			p1  = position_operator [tagset, vars] COMMA 
+			p2  = position_operator [tagset, vars] 
 		RPAREN {
-			if (tag_sym) {
-				try {
-					tag = tagset.parse_symbol(str_token_rem_grav(tag_sym));
-				}
-				catch(Corpus2::TagParseError &e) {
-					throw(ParserException(e.info()));
-				}
+			if (tag_class) {
+				ret.reset(new GetSymbolsInRange(Corpus2::Tag(-1), p1, p2));
 			}
 			else {
-				tag = Corpus2::Tag(-1);
+		 		ret.reset(new GetSymbolsInRange(tset->get_value(), p1, p2));
 			}
-
-			ret.reset(new GetSymbolsInRange(tag, p1, p2));
 		}
 ;