#include "mwe.h" #include <boost/algorithm/string.hpp> namespace Corpus2{ LexicalUnit::LexicalUnit(const std::string &base, LexicalUnit::BoolOpPtr condition, LexicalUnit::BoolOpPtr head_cond, LexicalUnit::strmap variables) : condition_(condition), head_cond_(head_cond), variables_(variables), base_(base), nowhere_(Wccl::Position()) { for(strmap::iterator iter = variables_.begin(); iter != variables_.end(); ++iter) potential_bases_.insert(iter->second); } bool LexicalUnit::IsHere(const Wccl::SentenceContext &sc, std::set<size_t> &out_position) { boost::shared_ptr<const Wccl::Bool> pResult = condition_->apply(sc); if(pResult->get_value() == false) return false; foreach(const std::string&varname, condition_->valid_variable_names()){ if(boost::algorithm::starts_with(varname, "Pos")){ Wccl::Position pos = condition_->get<Wccl::Position>(varname); if(pos.equals(nowhere_)){ std::string errmsg("Position for found MWE cannot be zero."); errmsg += " Offending unit: " + base_; throw Wccl::WcclError(errmsg); } out_position.insert( sc.get_abs_position(pos) ); } } return true; } FixedLU::FixedLU(const std::string &base, boost::shared_ptr<Wccl::Operator<Wccl::Bool> > condition, boost::shared_ptr<Wccl::Operator<Wccl::Bool> > head_cond, std::map<std::string, std::string> variables) : LexicalUnit(base, condition, head_cond, variables) { } FlexLU::FlexLU(const std::string &base, boost::shared_ptr<Wccl::Operator<Wccl::Bool> > condition, boost::shared_ptr<Wccl::Operator<Wccl::Bool> > head_cond, std::map<std::string, std::string> variables) : LexicalUnit(base, condition, head_cond, variables) { } MWEIndex::MWEIndex() { } void MWEIndex::add_lexicalunit(LexicalUnitPtr lu) { foreach(const std::string& base, lu->get_potential_bases()){ value_type::iterator find = index_.find(base); if(find == index_.end()){ // not found -> create new one luvec v; v.push_back(lu); index_.insert( std::make_pair(base, v)); }else{// already exists -> add lu (find->second).push_back(lu); } } } }//ns Corpus2