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