Index: /trunk/jenga/include/smoothie/LexicalAnalysis.h
===================================================================
--- /trunk/jenga/include/smoothie/LexicalAnalysis.h	(revision 299)
+++ /trunk/jenga/include/smoothie/LexicalAnalysis.h	(revision 300)
@@ -23,4 +23,5 @@
 int GetStringInPare(char *buffer,const char *ReadBuffer);
 int GetStringInBracket(char *buffer,const char *ReadBuffer);
+int GetStringInGenericBracket(char *buffer,const char *ReadBuffer);
 int JumpStringInPare(const char *buffer,int pos);
 int JumpStringInBracket(const char *buffer,int pos);
@@ -34,2 +35,3 @@
 std::string Operator_NaturalStringToCalcMarkString( const std::string &name );
 std::string Operator_CalcMarkStringToNaturalString( const std::string &name );
+bool IsGenericTypeSourcePart( const char *buffer );
Index: /trunk/jenga/src/smoothie/LexicalAnalysis.cpp
===================================================================
--- /trunk/jenga/src/smoothie/LexicalAnalysis.cpp	(revision 299)
+++ /trunk/jenga/src/smoothie/LexicalAnalysis.cpp	(revision 300)
@@ -1,2 +1,3 @@
+#include <jenga/include/common/Exception.h>
 #include <jenga/include/smoothie/SmoothieException.h>
 #include <jenga/include/smoothie/LexicalAnalysis.h>
@@ -137,4 +138,27 @@
 		else if(ReadBuffer[i]=='['&&IsStr==0) PareNum++;
 		else if(ReadBuffer[i]==']'&&IsStr==0){
+			PareNum--;
+			if(PareNum==0){
+				i++;
+				buffer[i]=0;
+				break;
+			}
+		}
+		else if(ReadBuffer[i]=='\0') return 0;
+	}
+	return i;
+}
+int GetStringInGenericBracket(char *buffer,const char *ReadBuffer){
+	int i,IsStr,PareNum;
+	for(i=0,IsStr=0,PareNum=0;;i++){
+		buffer[i]=ReadBuffer[i];
+		if(IsDBCSLeadByte(ReadBuffer[i])){
+			i++;
+			buffer[i]=ReadBuffer[i];
+			continue;
+		}
+		if(ReadBuffer[i]=='\"') IsStr^=1;
+		else if(ReadBuffer[i]=='<'&&IsStr==0) PareNum++;
+		else if(ReadBuffer[i]=='>'&&IsStr==0){
 			PareNum--;
 			if(PareNum==0){
@@ -349,2 +373,56 @@
 	return name;
 }
+
+bool IsGenericTypeSourcePart( const char *buffer )
+{
+	if( buffer[0] != '<' )
+	{
+		Jenga::Throw( "意図しない文字列に対してIsGenericTypeSourcePart関数が呼ばれた" );
+		return false;
+	}
+
+	int i=1, scopeCount=1;
+	for( ; ; i++ )
+	{
+		if( buffer[i] == '\0' )
+		{
+			break;
+		}
+		if( buffer[i] == '<' )
+		{
+			scopeCount++;
+		}
+		else if( buffer[i] == '>' )
+		{
+			scopeCount--;
+
+			if( scopeCount == 0 )
+			{
+				break;
+			}
+		}
+	}
+
+	if( buffer[i] != '>' )
+	{
+		return false;
+	}
+
+
+	/////////////////////////////////////////////////////////////////
+	// '>'に続く文字を判定する
+	/////////////////////////////////////////////////////////////////
+
+	i++;
+	while( IsBlank( buffer[i] ) )
+	{
+		i++;
+	}
+
+	if( IsVariableChar( buffer[i] ) )
+	{
+		return false;
+	}
+
+	return true;
+}
