From 9b51ebe7e62a46c9b7c39818719920bb23949955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20K=C4=99dzia?= <pawel.kedzia@pwr.wroc.pl> Date: Mon, 22 Nov 2010 12:53:41 +0100 Subject: [PATCH] New operators: in, equal, inter, setvar --- libwccl/ops/equals.h | 2 +- libwccl/ops/intersects.h | 7 +- libwccl/ops/issubsetof.h | 5 +- libwccl/parser/grammar.g | 182 ++++++++++++++++++++++++--------------- 4 files changed, 121 insertions(+), 75 deletions(-) diff --git a/libwccl/ops/equals.h b/libwccl/ops/equals.h index 06bc4ad..fe57b00 100644 --- a/libwccl/ops/equals.h +++ b/libwccl/ops/equals.h @@ -83,7 +83,7 @@ public: * @returns Name of the function: "equals". */ std::string raw_name() const { - return "equals"; + return "equal"; } protected: diff --git a/libwccl/ops/intersects.h b/libwccl/ops/intersects.h index 82fdd3c..fda4bea 100644 --- a/libwccl/ops/intersects.h +++ b/libwccl/ops/intersects.h @@ -12,6 +12,8 @@ template <class T> class Intersects : public SetPredicate<T> { public: + typedef typename SetPredicate<T>::SetFunctionPtr SetFunctionPtr; + Intersects(const SetFunctionPtr& set1_expr, const SetFunctionPtr& set2_expr) : SetPredicate<T>(set1_expr, set2_expr) { @@ -25,13 +27,14 @@ public: } protected: + typedef FunctionBase::BaseRetValPtr BaseRetValPtr; /** * Take values for both sets and return True if they intersect, * False otherwise. */ BaseRetValPtr apply_internal(const FunExecContext& context) const { - boost::shared_ptr<T> set1 = this->set1_expr_->apply(context); - boost::shared_ptr<T> set2 = this->set2_expr_->apply(context); + const boost::shared_ptr<const T>& set1 = this->set1_expr_->apply(context); + const boost::shared_ptr<const T>& set2 = this->set2_expr_->apply(context); return Predicate::evaluate(set1->intersects(*set2), context); } diff --git a/libwccl/ops/issubsetof.h b/libwccl/ops/issubsetof.h index d8536de..0982611 100644 --- a/libwccl/ops/issubsetof.h +++ b/libwccl/ops/issubsetof.h @@ -28,6 +28,7 @@ public: } protected: + typedef FunctionBase::BaseRetValPtr BaseRetValPtr; /** * Take value of possible subset in question. If it is an empty set, return False. * Otherwise, take value of the set that is being compared to. @@ -36,10 +37,10 @@ protected: * set is considered not to be "in" any other set so False is returned. */ BaseRetValPtr apply_internal(const FunExecContext& context) const { - boost::shared_ptr<T> possible_subset = this->set1_expr_->apply(context); + const boost::shared_ptr<const T>& possible_subset = this->set1_expr_->apply(context); if(!possible_subset->empty()) { - boost::shared_ptr<T> set_compared_to = this->set2_expr_->apply(context); + const boost::shared_ptr<const T>& set_compared_to = this->set2_expr_->apply(context); return Predicate::evaluate(possible_subset->is_subset_of(*set_compared_to), context); } return Predicate::False(context); diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g index ba33c14..32b2d64 100644 --- a/libwccl/parser/grammar.g +++ b/libwccl/parser/grammar.g @@ -29,9 +29,14 @@ header { #include <libwccl/ops/functions.h> #include <libwccl/ops/vargetter.h> #include <libwccl/ops/varsetter.h> - // #include <libwccl/ops/intersects.h> - // #include <libwccl/ops/issubsetof.h> #include <libwccl/ops/logicalpredicate.h> + + #include <libwccl/ops/intersects.h> + #include <libwccl/ops/issubsetof.h> + #include <libwccl/ops/setpredicate.h> + + #include <libwccl/ops/isinside.h> + #include <libwccl/ops/isoutside.h> // Unicode String #include <unicode/uniset.h> @@ -72,15 +77,10 @@ private: } // TODO -// - nie mozna utworzyc in/inter/equal z operatorem? // - jak utworzyc TSet (dodac element do TSet) // - nie mozna utworzy Const::Value i na tym robic specjalizowany reset? // - base, orth -// -> Dodac do regul _variable podregule zwracajaca accessor, a nadregula -// powinna zwracac VarGetter. I wlasnie reguly zwracajace accessor podpiac -// do setvara - /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // "GLOBAL" RULES @@ -241,16 +241,28 @@ position_value /////////////////////////////////////////////////////////////////////////////// // Position: $name // ---------------------------------------------------------------------------- -position_variable +// returns accessor +position_variable_acc [Wccl::Variables& vars] - returns [boost::shared_ptr<Wccl::VarGetter<Wccl::Position> > op] + returns [boost::shared_ptr<Wccl::VariableAccesor<Wccl::Position> > pos_acc] : DOLLAR n: SYMBOL { - vars.get_put<Wccl::Position>(token_ref_to_std_string(n)); + vars.get_put<Wccl::Position>(token_ref_to_std_string(n)); Wccl::VariableAccesor<Wccl::Position> acc = vars.create_accesor<Wccl::Position>(token_ref_to_std_string(n)); - op.reset(new Wccl::VarGetter<Wccl::Position>(acc)); + pos_acc.reset(new Wccl::VariableAccesor<Wccl::Position>(acc)); + } +; +// returs vargetter +position_variable + [Wccl::Variables& vars] + returns [boost::shared_ptr<Wccl::VarGetter<Wccl::Position> > op] +{ + boost::shared_ptr<Wccl::VariableAccesor<Wccl::Position> > pos_acc; +} + : pos_acc = position_variable_acc [vars] { + op.reset(new Wccl::VarGetter<Wccl::Position>(*pos_acc.get())); } ; // ---------------------------------------------------------------------------- @@ -265,10 +277,10 @@ position_ref_variable // ---------------------------------------------------------------------------- // String set, call examples: $name, $sName, $s_name, $s_Name etc. // This expression gets variable of tyme StrSet from string-named variable -// Returns Wccl::VarGetter<Wccl::StrSet> from Set-variables -str_set_variable +// returns accessor +str_set_variable_acc [Wccl::Variables& vars] - returns [boost::shared_ptr<Wccl::VarGetter<Wccl::StrSet> > op] + returns [boost::shared_ptr<Wccl::VariableAccesor<Wccl::StrSet> > strset_acc] : DOLLAR STR_PREFIX n: SYMBOL { // get/put variable to variables vars.get_put<Wccl::StrSet>(token_ref_to_std_string(n)); @@ -277,35 +289,70 @@ str_set_variable Wccl::VariableAccesor<Wccl::StrSet> acc = vars.create_accesor<Wccl::StrSet>(token_ref_to_std_string(n)); - op.reset(new Wccl::VarGetter<Wccl::StrSet>(acc)); + strset_acc.reset(new Wccl::VariableAccesor<Wccl::StrSet>(acc)); + } +; +// vargetter +str_set_variable + [Wccl::Variables& vars] + returns [boost::shared_ptr<Wccl::VarGetter<Wccl::StrSet> > op] +{ + boost::shared_ptr<Wccl::VariableAccesor<Wccl::StrSet> > strset_acc; +} + : strset_acc = str_set_variable_acc [vars] { + op.reset(new Wccl::VarGetter<Wccl::StrSet>(*strset_acc.get())); } ; // ---------------------------------------------------------------------------- // Symbol set: $tName -sym_set_variable +// returns accessor +sym_set_variable_acc [Wccl::Variables& vars] - returns [boost::shared_ptr<Wccl::VarGetter<Wccl::TSet> > op] + returns [boost::shared_ptr<Wccl::VariableAccesor<Wccl::TSet> > symset_acc] : DOLLAR TST_PREFIX n: SYMBOL { vars.get_put<Wccl::TSet>(token_ref_to_std_string(n)); Wccl::VariableAccesor<Wccl::TSet> acc = vars.create_accesor<Wccl::TSet>(token_ref_to_std_string(n)); - op.reset(new Wccl::VarGetter<Wccl::TSet>(acc)); + symset_acc.reset(new Wccl::VariableAccesor<Wccl::TSet>(acc)); + } +; +// returns vargetter +sym_set_variable + [Wccl::Variables& vars] + returns [boost::shared_ptr<Wccl::VarGetter<Wccl::TSet> > op] +{ + boost::shared_ptr<Wccl::VariableAccesor<Wccl::TSet> > symset_acc; +} + : symset_acc = sym_set_variable_acc [vars] { + op.reset(new Wccl::VarGetter<Wccl::TSet>(*symset_acc.get())); } ; // ---------------------------------------------------------------------------- // Bool: $bName -boolean_variable +// returns accessor +boolean_variable_acc [Wccl::Variables& vars] - returns [boost::shared_ptr<Wccl::VarGetter<Wccl::Bool> > op] + returns [boost::shared_ptr<Wccl::VariableAccesor<Wccl::Bool> > bool_acc] : DOLLAR BOOL_PREFIX n: SYMBOL { vars.get_put<Wccl::Bool>(token_ref_to_std_string(n)); Wccl::VariableAccesor<Wccl::Bool> acc = vars.create_accesor<Wccl::Bool>(token_ref_to_std_string(n)); - op.reset(new Wccl::VarGetter<Wccl::Bool>(acc)); + bool_acc.reset(new Wccl::VariableAccesor<Wccl::Bool>(acc)); + } +; +// returns vargetter +boolean_variable + [Wccl::Variables& vars] + returns [boost::shared_ptr<Wccl::VarGetter<Wccl::Bool> > op] +{ + boost::shared_ptr<Wccl::VariableAccesor<Wccl::Bool> > bool_acc; +} + : bool_acc = boolean_variable_acc [vars] { + op.reset(new Wccl::VarGetter<Wccl::Bool>(*bool_acc.get())); } ; @@ -335,73 +382,53 @@ setvar_pos returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op] { boost::shared_ptr<Wccl::Function<Wccl::Position> > ret_op; - boost::shared_ptr<Wccl::VarGetter<Wccl::Position> > ret_var; + boost::shared_ptr<Wccl::VariableAccesor<Wccl::Position> > ret_acc; } - : "setvar" LPAREN ret_var = position_variable [vars] COMMA - ret_op = op_position [vars] RPAREN { - - /* - Wccl::VariableAccesor<Wccl::Position> acc = - vars.create_accesor<Wccl::Position>(ret_var->acc_name()); - - op.reset(new Wccl::VarSetter<Wccl::Position>(acc, ret_op)); - */ + : "setvar" LPAREN ret_acc = position_variable_acc [vars] COMMA + ret_op = op_position [vars] RPAREN { + op.reset(new Wccl::VarSetter<Wccl::Position>(*ret_acc.get(), ret_op)); } +; - ; // ---------------------------------------------------------------------------- setvar_bool [Wccl::Variables& vars] returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op] { boost::shared_ptr<Wccl::Function<Wccl::Bool> > ret_op; - boost::shared_ptr<Wccl::VarGetter<Wccl::Bool> > ret_var; + boost::shared_ptr<Wccl::VariableAccesor<Wccl::Bool> > ret_acc; } - : "setvar" LPAREN ret_var = boolean_variable [vars] COMMA - ret_op = logical_predicates [vars] RPAREN { - - /* - Wccl::VariableAccesor<Wccl::Bool> acc = - vars.create_accesor<Wccl::Bool>(ret_var->acc_name()); - - op.reset(new Wccl::VarSetter<Wccl::Bool>(acc, ret_op)); - */ + : "setvar" LPAREN ret_acc = boolean_variable_acc [vars] COMMA + ret_op = logical_predicates [vars] RPAREN { + op.reset(new Wccl::VarSetter<Wccl::Bool>(*ret_acc.get(), ret_op)); } ; + // ---------------------------------------------------------------------------- setvar_sset [Wccl::Variables& vars] returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op] { boost::shared_ptr<Wccl::Function<Wccl::StrSet> > ret_op; - boost::shared_ptr<Wccl::VarGetter<Wccl::StrSet> > ret_var; + boost::shared_ptr<Wccl::VariableAccesor<Wccl::StrSet> > ret_acc; } - : "setvar" LPAREN ret_var = str_set_variable [vars] COMMA - ret_op = string_operators [vars] RPAREN { - /* - Wccl::VariableAccesor<Wccl::StrSet> acc = - vars.create_accesor<Wccl::StrSet>(ret_var->acc_name()); - - op.reset(new Wccl::VarSetter<Wccl::StrSet>(acc, ret_op)); - */ + : "setvar" LPAREN ret_acc = str_set_variable_acc [vars] COMMA + ret_op = string_operators [vars] RPAREN { + op.reset(new Wccl::VarSetter<Wccl::StrSet>(*ret_acc.get(), ret_op)); } ; + // ---------------------------------------------------------------------------- setvar_tset [Wccl::Variables& vars] returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op] { boost::shared_ptr<Wccl::Function<Wccl::TSet> > ret_op; - boost::shared_ptr<Wccl::VarGetter<Wccl::TSet> > ret_var; + boost::shared_ptr<Wccl::VariableAccesor<Wccl::TSet> > ret_acc; } - : "setvar" LPAREN ret_var = sym_set_variable [vars] COMMA - ret_op = sym_set_operators [vars] RPAREN { - /* - Wccl::VariableAccesor<Wccl::TSet> acc = - vars.create_accesor<Wccl::TSet>(ret_var->acc_name()); - - op.reset(new Wccl::VarSetter<Wccl::TSet>(acc, ret_op)); - */ + : "setvar" LPAREN ret_acc = sym_set_variable_acc [vars] COMMA + ret_op = sym_set_operators [vars] RPAREN { + op.reset(new Wccl::VarSetter<Wccl::TSet>(*ret_acc.get(), ret_op)); } ; @@ -539,6 +566,7 @@ logical_predicates | ret = lpred_eq [vars] | ret = lpred_regex [vars] | ret = setvar_op [vars] + | ret = lpred_inout [vars] ; // ---------------------------------------------------------------------------- // comma-separated predicates @@ -614,17 +642,14 @@ lpred_in boost::shared_ptr<Wccl::Function<Wccl::TSet> > ts1, ts2; boost::shared_ptr<Wccl::Function<Wccl::StrSet> > ss1, ss2; boost::shared_ptr<Wccl::Function<Wccl::Position> > p1, p2; - boost::shared_ptr<Wccl::Function<Wccl::StrSet> > expr; } : "in" LPAREN ss1 = string_operators [vars] COMMA ss2 = string_operators [vars] RPAREN { - op.reset( -// new Wccl::IsSubsetOf<Wccl::StrSet>(ss1, ss2) - ); + op.reset(new Wccl::IsSubsetOf<Wccl::StrSet>(ss1, ss2)); } | "in" LPAREN ts1 = sym_set_operators [vars] COMMA ts2 = sym_set_operators [vars] RPAREN { - // op.reset(new Wccl::IsSubsetOf(*ts1.get(), *ts2.get())); + op.reset(new Wccl::IsSubsetOf<Wccl::TSet>(ts1, ts2)); } /* | "in" LPAREN p1 = position_operators [vars] COMMA @@ -633,23 +658,24 @@ lpred_in } */ ; + // ---------------------------------------------------------------------------- lpred_inter [Wccl::Variables& vars] returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op] { - boost::shared_ptr<Wccl::Function<Wccl::TSet> > ts1, ts2; - boost::shared_ptr<Wccl::Function<Wccl::StrSet> > ss1, ss2; - boost::shared_ptr<Wccl::Function<Wccl::Position> > p1, p2; + boost::shared_ptr<Wccl::Function<Wccl::StrSet> > ss1, ss2; + boost::shared_ptr<Wccl::Function<Wccl::TSet> > ts1, ts2; + boost::shared_ptr<Wccl::Function<Wccl::Position> > p1, p2; } : "inter" LPAREN ss1 = string_operators [vars] COMMA ss2 = string_operators [vars] RPAREN { - // op.reset(new Wccl::Intersects(*ss1.get(), *ss2.get())); + op.reset(new Wccl::Intersects<Wccl::StrSet>(ss1, ss2)); } | "inter" LPAREN ts1 = sym_set_operators [vars] COMMA ts2 = sym_set_operators [vars] RPAREN { - // op.reset(new Wccl::Intersects(*ts1.get(), *ts2.get())); + op.reset(new Wccl::Intersects<Wccl::TSet>(ts1, ts2)); } /* | "inter" LPAREN p1 = position_operators [vars] COMMA @@ -658,6 +684,7 @@ lpred_inter } */ ; + // ---------------------------------------------------------------------------- lpred_eq [Wccl::Variables& vars] @@ -695,6 +722,21 @@ lpred_regex } ; +// ---------------------------------------------------------------------------- +lpred_inout + [Wccl::Variables& vars] + returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op] +{ + boost::shared_ptr<Wccl::Function<Wccl::Position> > ret_pos; +} + : "inside" LPAREN ret_pos = position_operators [vars] RPAREN { + op.reset(new Wccl::IsInside(ret_pos)); + } + | "outside" LPAREN ret_pos = position_operators [vars] RPAREN { + op.reset(new Wccl::IsOutside(ret_pos)); + } +; + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // ANTLR LEXER -- GitLab