[Yamato-svn] [yamato-svn] [2] スキャナでの識別子管理クラス一応完成

Back to archive index

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
+¡‚̃XƒR[ƒv‚©‚çƒg[ƒNƒ“ŒŸõ
+‚ЂƂã‚̃XƒR[ƒ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))// eƒXƒR[ƒv‚àƒ`ƒFƒbƒN
+		{
+			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‚ÉŠÜ‚ß‚ç‚ê‚È‚¢‚à‚Ì(ƒXƒy[ƒX‚Æ‚©“Ç“_)‚ª‚ ‚ê‚ΏR‚é
+				terms_begin++;
+				continue;
+			}
+			
+			lasthit = SearchIdent(terms_begin,terms.end());
+			
+			if (lasthit->cmp_res != 0)
+			{
+				// “o˜^‚ª‚È‚©‚Á‚½‚Ì‚Å1ƒg[ƒ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)
 					{
-						// Å‰‚Ì1ƒg[ƒNƒ“‚ªŽ¯•ÊŽq
+						// “o˜^Ï‚Ý‚¾‚Á‚½
+						return;
 					}
-					else
-					{
-						// ƒoƒbƒtƒ@‚É“ü‚Á‚Ä‚¢‚é‚Ì‚ªŽ¯•ÊŽ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"




Yamato-svn メーリングリストの案内
Back to archive index