#include "phrase_builder.h" #include "phrase.h" #include "vocabulary.h" PhraseBuilder::PhraseBuilder(shared_ptr vocabulary) : vocabulary(vocabulary) {} Phrase PhraseBuilder::Build(const vector& symbols) { Phrase phrase; phrase.symbols = symbols; phrase.words.resize(symbols.size()); for (size_t i = 0; i < symbols.size(); ++i) { if (vocabulary->IsTerminal(symbols[i])) { phrase.words[i] = 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); }