diff --git a/libwccl/ops/functions/bool/iterations/leftlook.cpp b/libwccl/ops/functions/bool/iterations/leftlook.cpp index c7f4d6965f96f56acd17bae8bccbe4eeb817afd7..d1a80282735c953fa4b714e79914fa7e2b589546 100644 --- a/libwccl/ops/functions/bool/iterations/leftlook.cpp +++ b/libwccl/ops/functions/bool/iterations/leftlook.cpp @@ -8,7 +8,7 @@ bool LeftLook::iterate( Wccl::Position &p, const Wccl::FunExecContext &context) const { - for(int i = right; i >= left; ++i) { + for(int i = right; i >= left; --i) { p.set_value(i); if(evaluating_expr_->apply(context)->get_value()) { return true; diff --git a/libwccl/ops/functions/bool/predicates/pointagreement.h b/libwccl/ops/functions/bool/predicates/pointagreement.h index b9b58e910e707f0d821b571f14e3114174769765..cefa1f7c25058cf0381be5421528a9aed9163c25 100644 --- a/libwccl/ops/functions/bool/predicates/pointagreement.h +++ b/libwccl/ops/functions/bool/predicates/pointagreement.h @@ -19,10 +19,12 @@ public: PointAgreement( const PosFunctionPtr& pos1_expr, const PosFunctionPtr& pos2_expr, - const TSetFunctionPtr& attribs_expr) + const TSetFunctionPtr& attribs_expr, + const Corpus2::Tagset& tagset) : pos1_expr_(pos1_expr), pos2_expr_(pos2_expr), - attribs_expr_(attribs_expr) + attribs_expr_(attribs_expr), + tagset_(tagset) { BOOST_ASSERT(pos1_expr_); BOOST_ASSERT(pos2_expr_); @@ -45,6 +47,7 @@ protected: const PosFunctionPtr pos1_expr_; const PosFunctionPtr pos2_expr_; const TSetFunctionPtr attribs_expr_; + const Corpus2::Tagset& tagset_; /** * Gets two positions from arguments. If either of them diff --git a/libwccl/ops/functions/bool/predicates/strongagreement.h b/libwccl/ops/functions/bool/predicates/strongagreement.h index c59ee02a08dcfa47736cf938aff6920063cbe804..83c9dd630e1645936a6aebf05af67e12ce6c1478 100644 --- a/libwccl/ops/functions/bool/predicates/strongagreement.h +++ b/libwccl/ops/functions/bool/predicates/strongagreement.h @@ -18,10 +18,12 @@ public: StrongAgreement( const PosFunctionPtr& left_pos_expr, const PosFunctionPtr& right_pos_expr, - const TSetFunctionPtr& attribs_expr) + const TSetFunctionPtr& attribs_expr, + const Corpus2::Tagset& tagset) : left_pos_expr_(left_pos_expr), right_pos_expr_(right_pos_expr), - attribs_expr_(attribs_expr) + attribs_expr_(attribs_expr), + tagset_(tagset) { BOOST_ASSERT(left_pos_expr_); BOOST_ASSERT(right_pos_expr_); @@ -45,6 +47,7 @@ protected: const PosFunctionPtr left_pos_expr_; const PosFunctionPtr right_pos_expr_; const TSetFunctionPtr attribs_expr_; + const Corpus2::Tagset& tagset_; /** * Gets start and end positions for range from arguments. diff --git a/libwccl/ops/functions/bool/predicates/weakagreement.h b/libwccl/ops/functions/bool/predicates/weakagreement.h index f3f58838001b3032875a685a48414c98b510c305..e4a47ab7ab14791210709439cd6c1c9aee150dbb 100644 --- a/libwccl/ops/functions/bool/predicates/weakagreement.h +++ b/libwccl/ops/functions/bool/predicates/weakagreement.h @@ -18,10 +18,12 @@ public: WeakAgreement( const PosFunctionPtr& left_pos_expr, const PosFunctionPtr& right_pos_expr, - const TSetFunctionPtr& attribs_expr) + const TSetFunctionPtr& attribs_expr, + const Corpus2::Tagset& tagset) : left_pos_expr_(left_pos_expr), right_pos_expr_(right_pos_expr), - attribs_expr_(attribs_expr) + attribs_expr_(attribs_expr), + tagset_(tagset) { BOOST_ASSERT(left_pos_expr_); BOOST_ASSERT(right_pos_expr_); @@ -45,6 +47,7 @@ protected: const PosFunctionPtr left_pos_expr_; const PosFunctionPtr right_pos_expr_; const TSetFunctionPtr attribs_expr_; + const Corpus2::Tagset& tagset_; /** * Gets start and end positions for range from arguments. diff --git a/libwccl/ops/functions/tset/agrfilter.h b/libwccl/ops/functions/tset/agrfilter.h index f86f3fda842938e718fbd5fc25b597ce6a8c9942..d41d4c63980b29d0c676071e8b206745ffb351e2 100644 --- a/libwccl/ops/functions/tset/agrfilter.h +++ b/libwccl/ops/functions/tset/agrfilter.h @@ -22,11 +22,13 @@ public: const PosFunctionPtr& left_pos_expr, const PosFunctionPtr& right_pos_expr, const TSetFunctionPtr& attribs_expr, - const TSetFunctionPtr& mask_expr) + const TSetFunctionPtr& mask_expr, + const Corpus2::Tagset& tagset) : left_pos_expr_(left_pos_expr), right_pos_expr_(right_pos_expr), attribs_expr_(attribs_expr), - mask_expr_(mask_expr) + mask_expr_(mask_expr), + tagset_(tagset) { BOOST_ASSERT(left_pos_expr_); BOOST_ASSERT(right_pos_expr_); @@ -54,7 +56,7 @@ protected: const TSetFunctionPtr attribs_expr_; const TSetFunctionPtr mask_expr_; - + const Corpus2::Tagset& tagset_; /** * Gets range specified via Position expressions. Trims the range diff --git a/libwccl/values/value.h b/libwccl/values/value.h index efd92cb7f0cc5d726e8396f0f28f5b66f71b9836..f4048c04e298b78d9d2e80794af0bacc291a2de3 100644 --- a/libwccl/values/value.h +++ b/libwccl/values/value.h @@ -6,7 +6,10 @@ #define WCCL_VALUE_PREAMBLE \ static const char* type_name; \ const char* get_type_name() const { return type_name; } \ -static std::string var_repr(const std::string &var_name); +static std::string var_repr(const std::string &var_name); \ +std::string make_var_repr(const std::string &var_name) const { \ + return var_repr(var_name); \ +} namespace Wccl { @@ -35,6 +38,8 @@ public: virtual ~Value() {} + virtual std::string make_var_repr(const std::string&) const = 0; + /** * String representation function, in general, a tagset is required, * but some classes might not need that, so by default just forward diff --git a/wcclparser/main.cpp b/wcclparser/main.cpp index 2ef8976a2e02cb7e22454de13d61b6888cc3791c..4df9c59eb70490eaab65c868df74a43be780caa8 100644 --- a/wcclparser/main.cpp +++ b/wcclparser/main.cpp @@ -90,8 +90,17 @@ void libedit_read_loop(boost::function<bool (const std::string&)>& line_cb) } #endif +void dumpvariables(const Wccl::Variables& vars, const Corpus2::Tagset& tagset) +{ + typedef std::pair<std::string, boost::shared_ptr<Wccl::Value> > v_t; + foreach (const v_t& v, vars.get_all<Wccl::Value>()) { + std::cerr << v.second->make_var_repr(v.first) << "=" + << v.second->to_string(tagset) << "\n"; + } +} + bool process_line(const std::string& line, Wccl::Parser& parser, - Wccl::SentenceContext& sc, bool all_positions) + Wccl::SentenceContext& sc, bool all_positions, bool dump_variables) { if (line.empty() || line == "exit" || line == "quit") { return true; @@ -123,6 +132,9 @@ bool process_line(const std::string& line, Wccl::Parser& parser, << "Parsed expression: " << retVal->to_string(parser.tagset()) << std::endl; + if (dump_variables) { + dumpvariables(*cx.variables(), parser.tagset()); + } } else { std::cerr << "Problem while parsing -- " << "retVal is NULL!" << std::endl; @@ -156,6 +168,7 @@ int main(int argc, char** argv) std::string query_load = ""; std::string position = "0"; bool quiet = false; + bool dump_variables = false; using boost::program_options::value; boost::program_options::options_description desc("Allowed options"); @@ -172,6 +185,8 @@ int main(int argc, char** argv) "Query to run (disables interactive mode)\n") ("quiet,q", value(&quiet)->zero_tokens(), "Suppress messages\n") + ("variables,V", value(&dump_variables)->zero_tokens(), + "Dump variables after running each query\n") ("help,h", "Show help") ; boost::program_options::variables_map vm; @@ -214,14 +229,14 @@ int main(int argc, char** argv) sc.set_position(pos); Wccl::Parser parser(tagset); if (!query.empty()) { - process_line(query, parser, sc, position == "all"); + process_line(query, parser, sc, position == "all", dump_variables); return 0; } else if (!query_load.empty()) { std::ifstream qf(query_load.c_str()); if (qf.good()) { std::stringstream ss; ss << qf.rdbuf(); - process_line(ss.str(), parser, sc, position == "all"); + process_line(ss.str(), parser, sc, position == "all", dump_variables); return 0; } else { throw Wccl::FileNotFound(sentence_load, "", "Query file"); @@ -229,7 +244,7 @@ int main(int argc, char** argv) } boost::function<bool (const std::string&)> f; f = boost::bind(&process_line, _1, boost::ref(parser), boost::ref(sc), - position == "all"); + position == "all", dump_variables); #ifdef HAVE_LIBEDIT libedit_read_loop(f); #else