diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g index bf12dd5d617a814ae56f5889bb307af6f9b4d2c1..444b379dc1bc5b656ad79e604d99a915dce8e4f9 100644 --- a/libwccl/parser/grammar.g +++ b/libwccl/parser/grammar.g @@ -42,6 +42,7 @@ header { #include <libwccl/ops/functions/tset/getsymbols.h> #include <libwccl/ops/functions/tset/getwordclass.h> + #include <libwccl/ops/functions/tset/getsymbolsinrange.h> #include <libwccl/ops/functions/position/relativeposition.h> @@ -490,6 +491,7 @@ symset_operator | (symset_getsymbol[tagset, vars]) => (ret = symset_getsymbol [tagset, vars]) | (symset_var_val [tagset, vars]) => (ret = symset_var_val [tagset, vars]) | (symset_class [tagset, vars]) => (ret = symset_class [tagset, vars]) + | (symset_range [tagset, vars]) => (ret = symset_range [tagset, vars]) // | LPAREN ret = symset_operator [tagset, vars] RPAREN ; @@ -568,6 +570,36 @@ symset_class } ; +// ---------------------------------------------------------------------------- +// Range operator +// WARNING! This rule can throw ParserException! Be careful! +symset_range + [const Corpus2::Tagset& tagset, Variables& vars] + returns [boost::shared_ptr<Function<TSet> > ret] +{ + Corpus2::Tag tag; + 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] + RPAREN { + if (tag_sym) { + try { + tag = tagset.parse_symbol(str_token_rem_grav(tag_sym)); + } + catch(Corpus2::TagParseError &e) { + throw(ParserException(e.info())); + } + } + else { + tag = Corpus2::Tag(-1); + } + + ret.reset(new GetSymbolsInRange(tag, p1, p2)); + } +; + /////////////////////////////////////////////////////////////////////////////// // Position operator // Returns boost::shared_ptr<Function<Position> >