diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g index b6178c68132013d2398dd528d8428931f63bcc36..d53ddd453636811b1d0c34d4e7ced37b4caf3e8a 100644 --- a/libwccl/parser/grammar.g +++ b/libwccl/parser/grammar.g @@ -538,11 +538,16 @@ symset_condition position_operator [const Corpus2::Tagset& tagset, Variables& vars] returns [boost::shared_ptr<Function<Position> > ret] - : ret = position_var_val [vars] - | ret = position_relpos [tagset, vars] + : + ( ret = position_var_val [vars] | ret = position_condition [tagset, vars] - // | LPAREN ret = position_operator [tagset, vars] RPAREN + ) + ( // if there is SIGNED_INT after the position, it is actually a relative position + i: SIGNED_INT { + ret.reset(new RelativePosition(ret, token_ref_to_int(i))); + } + )? ; // ---------------------------------------------------------------------------- @@ -554,21 +559,6 @@ position_var_val | ret = position_variable [vars] ; -// ---------------------------------------------------------------------------- -// Realtive position operator. -// TODO 2+2, actually relative gets position is possible only as relpos(...,...) -position_relpos - [const Corpus2::Tagset& tagset, Variables& vars] - returns [boost::shared_ptr<Function<Position> > ret] -{ - int n = 0; - boost::shared_ptr<Function<Position> > pos; -} - : "relpos" LPAREN pos = position_operator [tagset, vars] COMMA n = number RPAREN { - ret.reset(new RelativePosition(pos, n)); - } -; - // ---------------------------------------------------------------------------- // Condition of the position value // if (Bool, Position, Position)