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)); } ;