std::multimap<p_m1_token_symbol_m2_counter,token_symbol> tokenpaths::followup_token(const unsigned int token){ db *sqlite=NULL; query_result *result=NULL; std::string head_symbol, non_head_symbol, parent_symbol, gcat, feature, lid, symbol; std::multimap<p_m1_token_symbol_m2_counter,token_symbol> token_paths; std::set<t_m0_parent_symbol_m1_head_symbol_m2_non_head_symbol> lhs_rules_processed, rhs_rules_processed; sqlite=db_factory::get_instance(); result=sqlite->exec_sql("SELECT * FROM GCAT WHERE TOKEN = '"+std::to_string(token)+"';"); if(result!=NULL&&result->nr_of_result_rows()==1){ gcat=*result->field_value_at_row_position(0,"gcat"); feature=*result->field_value_at_row_position(0,"feature"); lid=*result->field_value_at_row_position(0,"lid"); symbol="t_"+lid+"_"+gcat+"_"+feature; std::cout<<"token symbol:"<<symbol<<std::endl; delete result; } else{ exit(EXIT_FAILURE); } result=sqlite->exec_sql("SELECT * FROM SYNTAX WHERE HEAD_SYMBOL = '"+symbol+"' OR NON_HEAD_SYMBOL = '"+symbol+"';"); if(result!=NULL){ for(unsigned int i=0;i<result->nr_of_result_rows();++i){ parent_symbol=*result->field_value_at_row_position(i,"parent_symbol"); std::cout<<"parent symbol:"<<parent_symbol<<std::endl; head_symbol=*result->field_value_at_row_position(i,"head_symbol"); std::cout<<"head symbol:"<<head_symbol<<std::endl; non_head_symbol=*result->field_value_at_row_position(i,"non_head_symbol"); std::cout<<"non-head symbol:"<<non_head_symbol<<std::endl; lhs_rules_processed.clear(); rhs_rules_processed.clear(); if(head_symbol==symbol&&non_head_symbol.empty()==false){ lhs_rules_processed.insert(std::make_tuple(parent_symbol,head_symbol,non_head_symbol)); find_lhs_down(symbol,i,non_head_symbol,token_paths,lhs_rules_processed); } else{ rhs_rules_processed.insert(std::make_tuple(parent_symbol,head_symbol,non_head_symbol)); find_rhs_up(symbol,i,parent_symbol,token_paths,lhs_rules_processed,rhs_rules_processed); } } delete result; } else{ exit(EXIT_FAILURE); } for(auto&& i:token_paths){ std::cout<<"anchor token:"<<i.first.first<<" anchor counter:"<<i.first.second<<" followup token:"<<i.second<<std::endl; } return token_paths; }
std::multimap<p_m1_token_symbol_m2_counter,token_symbol> tokenpaths::followup_token(const unsigned int token){ db *sqlite=NULL; query_result *result=NULL; std::string head_symbol, non_head_symbol, parent_symbol, gcat, feature, lid, symbol; std::multimap<p_m1_token_symbol_m2_counter,token_symbol> token_paths; std::set<t_m0_parent_symbol_m1_head_symbol_m2_non_head_symbol> lhs_rules_processed, rhs_rules_processed; sqlite=db_factory::get_instance(); auto&& token_symbol_map_entry=token_symbol_map.find(token); if(token_symbol_map_entry!=token_symbol_map.end()){ if(gcat=="CON") symbol="t_Con"; else symbol=token_symbol_map_entry->second; logger::singleton()==NULL?(void)0:logger::singleton()->log(3,"token symbol:"+symbol); delete result; } else{ throw std::runtime_error("No symbol found for token: "+std::to_string(token)); } result=sqlite->exec_sql("SELECT * FROM GRAMMAR WHERE LID = '"+lex->language()+"' AND ( HEAD_SYMBOL = '"+symbol+"' OR NON_HEAD_SYMBOL = '"+symbol+"' );"); if(result!=NULL){ for(unsigned int i=0;i<result->nr_of_result_rows();++i){ parent_symbol=*result->field_value_at_row_position(i,"parent_symbol"); head_symbol=*result->field_value_at_row_position(i,"head_symbol"); non_head_symbol=*result->field_value_at_row_position(i,"non_head_symbol"); logger::singleton()==NULL?(void)0:logger::singleton()->log(3,parent_symbol+" "+head_symbol+" "+non_head_symbol); lhs_rules_processed.clear(); rhs_rules_processed.clear(); if(head_symbol==symbol&&non_head_symbol.empty()==false){ lhs_rules_processed.insert(std::make_tuple(parent_symbol,head_symbol,non_head_symbol)); find_lhs_down(symbol,i,non_head_symbol,token_paths,lhs_rules_processed); } else{ rhs_rules_processed.insert(std::make_tuple(parent_symbol,head_symbol,non_head_symbol)); find_rhs_up(symbol,i,parent_symbol,token_paths,lhs_rules_processed,rhs_rules_processed); } } delete result; } else{ throw std::runtime_error("There's no entry for the head/non-head symbol "+symbol+" in the GRAMMAR db table."); } for(auto&& i:token_paths){ logger::singleton()==NULL?(void)0:logger::singleton()->log(3,"anchor token:"+i.first.first+" anchor counter:"+std::to_string(i.first.second)+" followup token:"+i.second); } return token_paths; }
void tokenpaths::find_rhs_up(const std::string& anchor_symbol, const unsigned int anchor_symbol_counter, const std::string& symbol, std::multimap<p_m1_token_symbol_m2_counter,token_symbol>& token_paths, std::set<t_m0_parent_symbol_m1_head_symbol_m2_non_head_symbol>& lhs_rules_processed, std::set<t_m0_parent_symbol_m1_head_symbol_m2_non_head_symbol>& rhs_rules_processed){ db *sqlite=NULL; query_result *result=NULL; std::string head_symbol, non_head_symbol, parent_symbol; logger::singleton()==NULL?(void)0:logger::singleton()->log(3,"find rhs up"); sqlite=db_factory::get_instance(); result=sqlite->exec_sql("SELECT * FROM GRAMMAR WHERE LID = '"+lex->language()+"' AND ( HEAD_SYMBOL = '"+symbol+"' OR NON_HEAD_SYMBOL = '"+symbol+"' );"); if(result!=NULL){ for(unsigned int i=0;i<result->nr_of_result_rows();++i){ parent_symbol=*result->field_value_at_row_position(i,"parent_symbol"); head_symbol=*result->field_value_at_row_position(i,"head_symbol"); non_head_symbol=*result->field_value_at_row_position(i,"non_head_symbol"); logger::singleton()==NULL?(void)0:logger::singleton()->log(3,parent_symbol+" "+head_symbol+" "+non_head_symbol); if(head_symbol==symbol&&non_head_symbol.empty()==false){ if(lhs_rules_processed.find(std::make_tuple(parent_symbol,head_symbol,non_head_symbol))==lhs_rules_processed.end()){ lhs_rules_processed.insert(std::make_tuple(parent_symbol,head_symbol,non_head_symbol)); find_lhs_down(anchor_symbol,anchor_symbol_counter,non_head_symbol,token_paths,lhs_rules_processed); } } else{ if(rhs_rules_processed.find(std::make_tuple(parent_symbol,head_symbol,non_head_symbol))==rhs_rules_processed.end()){ rhs_rules_processed.insert(std::make_tuple(parent_symbol,head_symbol,non_head_symbol)); find_rhs_up(anchor_symbol,anchor_symbol_counter,parent_symbol,token_paths,lhs_rules_processed,rhs_rules_processed); } } } delete result; } else if(symbol=="S"){ if(lhs_rules_processed.find(std::make_tuple(parent_symbol,head_symbol,non_head_symbol))==lhs_rules_processed.end()){ lhs_rules_processed.insert(std::make_tuple(parent_symbol,head_symbol,non_head_symbol)); find_lhs_down(anchor_symbol,anchor_symbol_counter,symbol,token_paths,lhs_rules_processed); } } else{ throw std::runtime_error("There's no entry for the head/non-head symbol "+symbol+" in the GRAMMAR db table."); } }
void tokenpaths::find_rhs_up(const std::string& anchor_symbol, const unsigned int anchor_symbol_counter, const std::string& symbol, std::multimap<p_m1_token_symbol_m2_counter,token_symbol>& token_paths, std::set<t_m0_parent_symbol_m1_head_symbol_m2_non_head_symbol>& lhs_rules_processed, std::set<t_m0_parent_symbol_m1_head_symbol_m2_non_head_symbol>& rhs_rules_processed){ db *sqlite=NULL; query_result *result=NULL; std::string head_symbol, non_head_symbol, parent_symbol; std::cout<<"find rhs up"<<std::endl; sqlite=db_factory::get_instance(); result=sqlite->exec_sql("SELECT * FROM SYNTAX WHERE HEAD_SYMBOL = '"+symbol+"' OR NON_HEAD_SYMBOL = '"+symbol+"';"); if(result!=NULL){ for(unsigned int i=0;i<result->nr_of_result_rows();++i){ parent_symbol=*result->field_value_at_row_position(i,"parent_symbol"); std::cout<<"parent symbol:"<<parent_symbol<<std::endl; head_symbol=*result->field_value_at_row_position(i,"head_symbol"); std::cout<<"head symbol:"<<head_symbol<<std::endl; non_head_symbol=*result->field_value_at_row_position(i,"non_head_symbol"); std::cout<<"non-head symbol:"<<non_head_symbol<<std::endl; if(head_symbol==symbol&&non_head_symbol.empty()==false){ if(lhs_rules_processed.find(std::make_tuple(parent_symbol,head_symbol,non_head_symbol))==lhs_rules_processed.end()){ lhs_rules_processed.insert(std::make_tuple(parent_symbol,head_symbol,non_head_symbol)); find_lhs_down(anchor_symbol,anchor_symbol_counter,non_head_symbol,token_paths,lhs_rules_processed); } } else{ if(rhs_rules_processed.find(std::make_tuple(parent_symbol,head_symbol,non_head_symbol))==rhs_rules_processed.end()){ rhs_rules_processed.insert(std::make_tuple(parent_symbol,head_symbol,non_head_symbol)); find_rhs_up(anchor_symbol,anchor_symbol_counter,parent_symbol,token_paths,lhs_rules_processed,rhs_rules_processed); } } } delete result; } else{ exit(EXIT_FAILURE); } }