diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g index 088d2706aaa6c98ab10f7f3623ddc688191d37f6..beab75531fb73493b4e1dc24ed3870c3e1c38b65 100644 --- a/libwccl/parser/grammar.g +++ b/libwccl/parser/grammar.g @@ -46,6 +46,11 @@ header { #include <libwccl/ops/functions/position/relativeposition.h> + #include <libwccl/ops/functions/bool/iterations/only.h> + #include <libwccl/ops/functions/bool/iterations/atleast.h> + #include <libwccl/ops/functions/bool/iterations/leftlook.h> + #include <libwccl/ops/functions/bool/iterations/rightlook.h> + // Unicode String #include <unicode/uniset.h> #include <unicode/unistr.h> @@ -802,6 +807,8 @@ bool_operator | ret = equal_operator [tagset, vars] | ret = in_operator [tagset, vars] | ret = inter_operator [tagset, vars] + // iterations + | ret = bool_iteration [tagset, vars] // | LPAREN ret = bool_operator [tagset, vars] RPAREN ; @@ -1042,6 +1049,53 @@ inter_operator RPAREN ; +// ---------------------------------------------------------------------------- +// Iterations: +bool_iteration + [const Corpus2::Tagset& tagset, Variables& vars] + returns [boost::shared_ptr<Function<Bool> > ret] +{ + int min_match = 0; + boost::shared_ptr<Function<Bool> > expr; + boost::shared_ptr<Function<Position> > lpos, rpos; + boost::shared_ptr<VariableAccessor<Position> > pacc; +} + : "only" LPAREN + lpos = position_operator [tagset, vars] COMMA + rpos = position_operator [tagset, vars] COMMA + pacc = position_variable_acc [vars] COMMA + expr = bool_operator [tagset, vars] + RPAREN { + ret.reset(new Only(lpos, rpos, *pacc, expr)); + } + + | "atleast" LPAREN + lpos = position_operator [tagset, vars] COMMA + rpos = position_operator [tagset, vars] COMMA + pacc = position_variable_acc [vars] COMMA + expr = bool_operator [tagset, vars] COMMA + min_match = number + RPAREN { + ret.reset(new AtLeast(lpos, rpos, *pacc, expr, min_match)); + } + | "llook" LPAREN + lpos = position_operator [tagset, vars] COMMA + rpos = position_operator [tagset, vars] COMMA + pacc = position_variable_acc [vars] COMMA + expr = bool_operator [tagset, vars] + RPAREN { + ret.reset(new LeftLook(lpos, rpos, *pacc, expr)); + } + | "rlook" LPAREN + lpos = position_operator [tagset, vars] COMMA + rpos = position_operator [tagset, vars] COMMA + pacc = position_variable_acc [vars] COMMA + expr = bool_operator [tagset, vars] + RPAREN { + ret.reset(new RightLook(lpos, rpos, *pacc, expr)); + } +; + // ---------------------------------------------------------------------------- // Setvar operator // Returns boost::shared_ptr<Function<Bool> >