diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g index 3fe31155ab795f51cd4890dae3b495c752730676..9628c693cc8524ca85f61be7cc63fe60f4945370 100644 --- a/libwccl/parser/grammar.g +++ b/libwccl/parser/grammar.g @@ -19,33 +19,31 @@ header { #include <libwccl/sentencecontext.h> // operators + #include <libwccl/ops/functions/constant.h> + #include <libwccl/ops/functions/vargetter.h> + #include <libwccl/ops/functions/conditional.h> + #include <libwccl/ops/functions/bool/predicates/or.h> #include <libwccl/ops/functions/bool/predicates/nor.h> #include <libwccl/ops/functions/bool/predicates/and.h> #include <libwccl/ops/functions/bool/predicates/regex.h> - #include <libwccl/ops/functions/bool/predicates/equals.h> - #include <libwccl/ops/functions/bool/varsetter.h> + #include <libwccl/ops/functions/bool/predicates/intersects.h> + #include <libwccl/ops/functions/bool/predicates/issubsetof.h> + #include <libwccl/ops/functions/bool/predicates/isinside.h> + #include <libwccl/ops/functions/bool/predicates/isoutside.h> + #include <libwccl/ops/functions/bool/predicates/equals.h> #include <libwccl/ops/functions/strset/affix.h> #include <libwccl/ops/functions/strset/getorth.h> #include <libwccl/ops/functions/strset/toupper.h> #include <libwccl/ops/functions/strset/tolower.h> #include <libwccl/ops/functions/strset/getlemmas.h> - - #include <libwccl/ops/functions/constant.h> - #include <libwccl/ops/functions/vargetter.h> - - #include <libwccl/ops/functions/bool/predicates/intersects.h> - #include <libwccl/ops/functions/bool/predicates/issubsetof.h> - - #include <libwccl/ops/functions/bool/predicates/isinside.h> - #include <libwccl/ops/functions/bool/predicates/isoutside.h> + + #include <libwccl/ops/functions/tset/getsymbols.h> #include <libwccl/ops/functions/position/relativeposition.h> - #include <libwccl/ops/functions/conditional.h> - // Unicode String #include <unicode/uniset.h> #include <unicode/unistr.h> @@ -487,8 +485,9 @@ bool_variable symset_operator [const Corpus2::Tagset& tagset, Variables& vars] returns [boost::shared_ptr<Function<TSet> > ret] - : ret = symset_var_val [tagset, vars] - | ret = symset_condition [tagset, vars] + : (symset_condition[tagset, vars]) => (ret = symset_condition [tagset, vars]) + | (symset_getsymbol[tagset, vars]) => (ret = symset_getsymbol [tagset, vars]) + | (symset_var_val [tagset, vars]) => (ret = symset_var_val [tagset, vars]) // | LPAREN ret = symset_operator [tagset, vars] RPAREN ; @@ -532,6 +531,28 @@ symset_condition } ; +// ---------------------------------------------------------------------------- +// GetSymbol operator may be cas, m1, f, sg... +// WARNING! This rule can throw ParserException! Be careful! +symset_getsymbol + [const Corpus2::Tagset& tagset, Variables& vars] + returns [boost::shared_ptr<Function<TSet> > op] +{ + Corpus2::Tag tag; + boost::shared_ptr<Wccl::Function<Position> > position; +} + : t: SYMBOL LBRACKET position = position_operator [tagset, vars] RBRACKET { + try { + tag = tagset.parse_symbol(str_token_rem_grav(t)); + } + catch(Corpus2::TagParseError &e) { + throw(ParserException(e.info())); + } + + op.reset(new Wccl::GetSymbols(tag, position)); + } +; + /////////////////////////////////////////////////////////////////////////////// // Position operator // Returns boost::shared_ptr<Function<Position> >