svnno****@sourc*****
svnno****@sourc*****
2009年 1月 20日 (火) 16:08:21 JST
Revision: 2 http://svn.sourceforge.jp/view?root=yamato&view=rev&rev=2 Author: whiteball Date: 2009-01-20 16:08:21 +0900 (Tue, 20 Jan 2009) Log Message: ----------- ã¹ãã£ãã§ã®èå¥å管çã¯ã©ã¹ä¸å¿å®æ Modified Paths: -------------- trunk/yamato/ident_manager.cpp trunk/yamato/ident_manager.h trunk/yamato/yamato.vcproj Modified: trunk/yamato/ident_manager.cpp =================================================================== --- trunk/yamato/ident_manager.cpp 2008-10-29 13:00:49 UTC (rev 1) +++ trunk/yamato/ident_manager.cpp 2009-01-20 07:08:21 UTC (rev 2) @@ -1,21 +1,82 @@ #include <sstream> -#include <boost/utility.hpp> -#include <boost/tuple/tuple.hpp> -#include <boost/tuple/tuple_io.hpp> +//#include <boost/utility.hpp> #include "ident_manager.h" +namespace +{ +using namespace yamato; + +compare_res_t CompareIdent(std::vector<PToken> &base,std::list<PToken>::iterator target_begin,std::list<PToken>::iterator target_end) + { + std::list<PToken>::iterator target_itr = target_begin, + last_hit = target_end; + std::vector<PToken>::iterator base_itr = base.begin(), + base_end = base.end(); + int res,num; + + for(num=0;;num++) + { + res = (*target_itr)->GetStr().compare((*base_itr)->GetStr()); + if (res == 0) + { + last_hit = target_itr; + target_itr++; + base_itr++; + if (target_itr == target_end) + { + if (base_itr != base_end) + { + res = 1; + } + } + else if (base_itr == base_end) + { + res = -1; + } + else if ((*target_itr)->GetType() != dummy_token_id) + { + continue; + } + num++; + break; + } + else + { + break; + } + } + + compare_res_t result(new tag_compare_res_t); + result->cmp_res = res; + result->token_num = num; + result->itr = last_hit; + + return result; + } + +inline compare_res_t CompareIdent(std::list<PToken> &target,std::vector<PToken> &base) + { + return CompareIdent(base,target.begin(),target.end()); + } + +} + namespace yamato { -using namespace std; -const size_t TABLE_SIZE = 67; -CIdentManager::CIdentManager(void):m_table(new boost::scoped_ptr<TableElement>[TABLE_SIZE]) +namespace {const size_t TABLE_SIZE = 67;} + +CIdentManager::CIdentManager(boost::shared_ptr<CIdentManager> parent):m_table(new boost::scoped_ptr<TableElement>[TABLE_SIZE]),m_parent(parent) { } CIdentManager::~CIdentManager(void) { } + +CIdentManager::CIdentManager(const CIdentManager&) + { + } size_t CIdentManager::CalcHash(str_t s) { @@ -38,131 +99,176 @@ return *plist; } -void CIdentManager::RegisterIdent(list<PToken> &/*terms*/) +compare_res_t CIdentManager::SearchIdent(std::list<PToken> &terms) { - + return SearchIdent(terms.begin(),terms.end()); } - -inline boost::tuple<int,int,std::list<PToken>::iterator> CompareIdent(list<PToken> target,vector<PToken> base) + +/* +èF +¡ÌXR[v©çg[Nõ +ÐÆÂãÌXR[v©çg[Nõ +g[Nªæè·æØé±ÆªoéûðÌp +©Â©çȯêÎA½¾1ÂÌg[Nð¯ÊqÉ·é +*/ +compare_res_t CIdentManager::SearchIdent(std::list<PToken>::iterator terms_begin,std::list<PToken>::iterator terms_end) { - list<PToken>::iterator target_itr = target.begin(), - target_end = target.end(), - last_hit = target_end; - vector<PToken>::iterator base_itr = base.begin(), - base_end = base.end(); - int res,num; + TableElement &li = GetList((*terms_begin)->GetStr()); - for(num=0;;num++) + TableElement::iterator itr=li.begin(); + + compare_res_t lasthit(new tag_compare_res_t); + lasthit->cmp_res = -1; + lasthit->token_num = -1; + lasthit->itr = terms_begin; + for(;itr!=li.end();itr++) { - res = (*target_itr)->GetStr().compare((*base_itr)->GetStr()); - if (res == 0) + compare_res_t res = CompareIdent((*itr),terms_begin,terms_end); + + if (res->cmp_res < 0) { - last_hit = target_itr; - target_itr++; - base_itr++; - if (target_itr == target_end) + continue; + } + else if (res->cmp_res == 0) + { + if (res->itr == terms_end) { - if (base_itr != base_end) - { - res = 1; - } + //srcªSÅÐÆÂ̯Êq + lasthit = res; + break;// to return } - else if (base_itr == base_end) + + //æè·¢ûðc· + if (lasthit->token_num <= res->token_num) { - res = -1; + lasthit = res; } - else if ((*target_itr)->GetType() != dummy_token_id) - { - continue; - } - num++; - break; } else { - break; + } } + if((lasthit->itr == terms_end)&&(m_parent != 0))// eXR[và`FbN + { + compare_res_t res = m_parent->SearchIdent(terms_begin,terms_end); + //æè·¢ûðc· + if (lasthit->token_num <= res->token_num) + { + lasthit = res; + } + } - //return std::pair<int,std::list<PToken>::iterator>(res,last_hit); - return boost::make_tuple(res,num,last_hit); + return lasthit; } -void CIdentManager::RegisterIdentList(list<PToken> &terms) +void CIdentManager::RegisterIdentList(std::list<PToken> &terms) { - //list<PToken>::iterator terms_itr = terms.begin(); + std::list<PToken>::iterator terms_begin = terms.begin(); + std::basic_ostringstream<char_t> buffer; + compare_res_t lasthit; - //str_t str = (*terms_itr)->GetStr(); - //terms_itr++; + while(terms_begin != terms.end()) + { + if ((*terms_begin)->GetType() == dummy_token_id) + { + // ¯ÊqÉÜßçêÈ¢àÌ(Xy[XÆ©Ç_)ª êÎRé + terms_begin++; + continue; + } + + lasthit = SearchIdent(terms_begin,terms.end()); + + if (lasthit->cmp_res != 0) + { + // o^ªÈ©Á½ÌÅ1g[NůÊq + RegisterIdent(*terms_begin); + terms_begin++; + } + else + { + // ùm̯Êq¾Á½ + buffer.clear(); + for(std::list<PToken>::iterator t_itr=terms_begin; t_itr!=lasthit->itr; t_itr++) + { + buffer << (*t_itr)->GetStr(); + } + // sÔ۶̽ß1ÂcµÄÝè + (*terms_begin)->SetStr(buffer.str()); + (*terms_begin)->SetType(ident); + // vçÈ¢ª(v-v)ðjü + // begin v---------v end + // +-+-*-+-+-+-+-+-+-*-+-+ + terms_begin++; + terms_begin = terms.erase(terms_begin,lasthit->itr); + } + } + + return; + } + +void CIdentManager::RegisterIdent(std::list<PToken> &terms) + { TableElement &li = GetList(terms.front()->GetStr()); + TableElement::iterator itr = li.begin(); + for(;itr != li.end();itr++) + { + compare_res_t hit = CompareIdent(*itr,terms.begin(),terms.end()); + if (hit->cmp_res < 0) + { + continue; + } + else if(hit->cmp_res == 0) + { + // o^ÏÝ + return; + } + else + { + break; + } + } - // not impl. + IdentBlock ib(terms.begin(),terms.end()); + li.insert(itr,ib); - TableElement::iterator itr=li.begin(); - //size_t len = 0; - //basic_ostringstream<char_t> buffer; + return; + } + +void CIdentManager::RegisterIdent(PToken token) + { + TableElement &li = GetList(token->GetStr()); + TableElement::iterator itr = li.begin(); - //while((itr!=li.end()) && (terms_itr!=terms.end())) - - for(;itr!=li.end();itr++) + for(;itr != li.end();itr++) { - /*if (str.length() < (itr->length()+len)) + int res = itr->at(0)->GetStr().compare(token->GetStr()); + if (res < 0) { - break; - }*/ - //int res = str.compare(0,str.length(),*itr,len,(*itr).length()-len); - boost::tuple<int,int,std::list<PToken>::iterator> res = CompareIdent(terms,(*itr)); - - if (res.get<0>() < 0) - { continue; } - else if (res.get<0>() == 0) + else { - /*if ((str.length()+len) == (*itr).length()) + if (res == 0) { - buffer << str; - } - if ((*boost::next(terms_itr))->GetType() == dummy_token_id)// ¯ÊqæØè - { - if (buffer.str().empty()) + if (itr->size() == 1) { - // ÅÌ1g[Nª¯Êq + // o^ÏݾÁ½ + return; } - else - { - // obt@ÉüÁÄ¢é̪¯Êq@-> ¢Â©Ìg[Nð1ÂÉÜÆßé - } } - else - { - // Ìg[NðÇÞ - } - /*str_t str2 = (*terms_itr)->GetStr(); - if ((str.length()+str2.length()) > itr->length()) - { - } - res = str2.compare(str.length()-1,str2.length(),*itr); - /*/ + break; } - else - { - - } - //itr++; - //terms_itr++; } + IdentBlock ib(1); + ib.push_back(token); + li.insert(itr,ib); return; } - -void CIdentManager::RegisterIdent(PToken token) - { - GetList(token->GetStr()); - } /* void CIdentManager::RegisterIdent(str_t str) { Modified: trunk/yamato/ident_manager.h =================================================================== --- trunk/yamato/ident_manager.h 2008-10-29 13:00:49 UTC (rev 1) +++ trunk/yamato/ident_manager.h 2009-01-20 07:08:21 UTC (rev 2) @@ -2,8 +2,8 @@ #include <vector> #include <list> #include <set> -#include <memory> #include <boost/scoped_ptr.hpp> +#include <boost/shared_ptr.hpp> #include <boost/scoped_array.hpp> #include "token.h" /* @@ -11,24 +11,37 @@ */ namespace yamato { - + struct tag_compare_res_t + { + int cmp_res; + int token_num; + std::list<PToken>::iterator itr; + }; + typedef boost::shared_ptr<tag_compare_res_t> compare_res_t; + class CIdentManager { private: typedef std::vector<PToken> IdentBlock; typedef std::list<IdentBlock> TableElement; + boost::scoped_array<boost::scoped_ptr<TableElement> > m_table; + boost::shared_ptr<CIdentManager> m_parent; inline size_t CalcHash(str_t); inline TableElement &GetList(str_t); inline TableElement &GetList(size_t); + CIdentManager(const CIdentManager&); public: void RegisterIdentList(std::list<PToken>&); void RegisterIdent(std::list<PToken>&); void RegisterIdent(PToken); //void RegisterIdent(str_t); - CIdentManager(void); + compare_res_t SearchIdent(std::list<PToken>::iterator,std::list<PToken>::iterator); + compare_res_t SearchIdent(std::list<PToken>&); + + explicit CIdentManager(boost::shared_ptr<CIdentManager>); ~CIdentManager(void); }; Modified: trunk/yamato/yamato.vcproj =================================================================== --- trunk/yamato/yamato.vcproj 2008-10-29 13:00:49 UTC (rev 1) +++ trunk/yamato/yamato.vcproj 2009-01-20 07:08:21 UTC (rev 2) @@ -42,7 +42,7 @@ MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="1" - DisableLanguageExtensions="false" + DisableLanguageExtensions="true" DefaultCharIsUnsigned="true" WarningLevel="4" WarnAsError="true"