diff --git a/libmwereader/mwe.cpp b/libmwereader/mwe.cpp index cc1f5379d4c8fc5e5b21e30d78129f228ba52c33..5799d2cf8b96e545fa0ae005fb797880de7d8fa1 100644 --- a/libmwereader/mwe.cpp +++ b/libmwereader/mwe.cpp @@ -24,7 +24,7 @@ LexicalUnit::LexicalUnit(const std::string &base, } bool LexicalUnit::IsHere(const Wccl::SentenceContext &sc, - std::set<size_t> &out_position) const + std::set<size_t> &out_position, int &head_pos) const { // set variables for(variables_map::const_iterator ivars = variables_.begin(); @@ -37,6 +37,10 @@ bool LexicalUnit::IsHere(const Wccl::SentenceContext &sc, if(pResult->get_value() == false) return false; + bool found_head = false; + + Wccl::SentenceContext sc2(sc.get_sentence_ptr()); + // fill up positions foreach(const std::string&varname, condition_->valid_variable_names()){ if(boost::algorithm::starts_with(varname, "Pos")){ @@ -46,11 +50,24 @@ bool LexicalUnit::IsHere(const Wccl::SentenceContext &sc, errmsg += " Offending unit: " + base_; throw Wccl::WcclError(errmsg); } - out_position.insert( sc.get_abs_position(pos) ); + int abs_pos = sc.get_abs_position(pos); + out_position.insert( abs_pos ); + if(!found_head){ + sc2.set_position(abs_pos); + if(head_cond_->apply(sc2)->get_value()){ + head_pos = abs_pos; + found_head = true; + } + } } } - // TODO head position + if(!found_head){ + std::string errmsg("MWE found, but no head for it."); + errmsg += " Offending unit: " + base_; + throw Wccl::WcclError(errmsg); + } + return true; } diff --git a/libmwereader/mwe.h b/libmwereader/mwe.h index 77a38fe7513449069200c5aaa5f32de0839bc935..439323f99c4d81b11106241ae69d65806727f3ff 100644 --- a/libmwereader/mwe.h +++ b/libmwereader/mwe.h @@ -35,7 +35,7 @@ public: * \returns true if this lexical unit was found here */ virtual bool IsHere(const Wccl::SentenceContext& sc, - std::set<size_t> &out_positions) const; + std::set<size_t> &out_positions, int &head_pos) const; const std::string & get_base() const{ return base_;} const variables_map & get_variables() const{ return variables_;} diff --git a/libmwereader/mwereader.cpp b/libmwereader/mwereader.cpp index 26e4c6ac99e5add2ce6fb20cb08d2fd0b1f1e18e..e6328be4549d4e8d810d424f7491cf6d80776479 100644 --- a/libmwereader/mwereader.cpp +++ b/libmwereader/mwereader.cpp @@ -46,7 +46,8 @@ bool MWEReader::registered = TokenReader::register_path_reader<MWEReader>( std::cout << "# "; foreach(LexicalUnit::Ptr pLU, potential){ std::set<size_t> positions; - bool is_here = pLU->IsHere(sc, positions); + int head; + bool is_here = pLU->IsHere(sc, positions, head); if(is_here) std::cout << "** " << pLU->get_base() << "** "; } diff --git a/libmwereader/test_mwe.xml b/libmwereader/test_mwe.xml index 43a302e376dcf82f80c40ab9ca60c978e26567e3..020213ffa30dd2e18419b6168fd5a416dae909d9 100644 --- a/libmwereader/test_mwe.xml +++ b/libmwereader/test_mwe.xml @@ -17,7 +17,7 @@ <MWE base="Jan Paweł"> <var name="Subst1">jan</var> <var name="Subst2">paweł</var> - <head>inter(cas[0], {nom})</head> + <head>inter(base[0], "jan")</head> </MWE> <MWE base="waga netto"> <var name="Subst1">waga</var>