#include "phrase_builder.h" #include "phrase.h" #include "vocabulary.h" namespace extractor { PhraseBuilder::PhraseBuilder(shared_ptr vocabulary) : vocabulary(vocabulary) {} Phrase PhraseBuilder::Build(const vector& symbols) { Phrase phrase; phrase.symbols = symbols; for (size_t i = 0; i < symbols.size(); ++i) { if (vocabulary->IsTerminal(symbols[i])) { phrase.words.push_back(vocabulary->GetTerminalValue(symbols[i])); } else { phrase.var_pos.push_back(i); } } return phrase; } Phrase PhraseBuilder::Extend(const Phrase& phrase, bool start_x, bool end_x) { vector symbols = phrase.Get(); int num_nonterminals = 0; if (start_x) { num_nonterminals = 1; symbols.insert(symbols.begin(), vocabulary->GetNonterminalIndex(num_nonterminals)); } for (size_t i = start_x; i < symbols.size(); ++i) { if (!vocabulary->IsTerminal(symbols[i])) { ++num_nonterminals; symbols[i] = vocabulary->GetNonterminalIndex(num_nonterminals); } } if (end_x) { ++num_nonterminals; symbols.push_back(vocabulary->GetNonterminalIndex(num_nonterminals)); } return Build(symbols); } } // namespace extractor