Newer
Older
#include <boost/algorithm/string.hpp>
LexicalUnit::LexicalUnit(const std::string &base,
Bartosz Broda
committed
LexicalUnit::BoolOpPtr condition,
LexicalUnit::BoolOpPtr head_cond,
LexicalUnit::strmap variables)
: condition_(condition),
head_cond_(head_cond),
variables_(variables),
base_(base),
nowhere_(Wccl::Position())
{
Bartosz Broda
committed
for(strmap::iterator iter = variables_.begin();
iter != variables_.end(); ++iter)
potential_bases_.insert(iter->second);
Bartosz Broda
committed
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) );
}
Bartosz Broda
committed
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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);
}
}
}