From a3a797720c98b5cb24c3a7da214de77188c490d6 Mon Sep 17 00:00:00 2001 From: ilor <kailoran@gmail.com> Date: Wed, 8 Dec 2010 13:15:09 +0100 Subject: [PATCH] add -V option to wcclparser to dump variable status after query processing --- libwccl/values/value.h | 7 ++++++- wcclparser/main.cpp | 23 +++++++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/libwccl/values/value.h b/libwccl/values/value.h index efd92cb..f4048c0 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 2ef8976..4df9c59 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 -- GitLab