Ejemplo n.º 1
0
/*  
@	功能:	分析一个记号
@	参数:	
@	返回值:如果分析失败,返回false
@	注:	
*/
bool CLexicalAnalyzer::GetNextToken( void )
{
	if( m_nCurCharPos >= m_nStringLen )
	{
		m_curToken.m_eTokenType = EToken_Complete;
		return true;
	}
	bool bAddToLex = false;	// 当前符号是否加入记号符号中
	bool bDone = false;		// 是否完成当前记号的解析
	char cCurChar = 0;		// 当前字符
	static char szBuffer[1024];
	static char szOpt[8];
	int w = 0;
	int optW = 0;
	EToken	curTokenType;
	memset( szBuffer, 0, sizeof( szBuffer ) );
	memset( szOpt, 0, sizeof( szOpt ) );

	while( true )
	{
		cCurChar = m_lpszString[m_nCurCharPos++];
		if( cCurChar == '\0' )
			break;
		bAddToLex = true;

		switch( m_curState )
		{
			//--------开始状态
		case ELexState_Start:
			{
				// 略过前导空格
				if( IsWhiteChar( cCurChar) )
				{
					bAddToLex = false;
				}
				// 是否是一个整数
				else if( IsNumeric( cCurChar ) )
				{
					m_curState = ELexState_Int;
				}
				// 是否是一个浮点数
				else if( cCurChar == '.' )
				{
					m_curState = ELexState_Float;
				}
				// 是否是标识符
				else if( IsCharIdentifier( cCurChar ) )
				{
					m_curState = ELexState_Identifier;
				}
				// 分隔符
				else if( GetDelimiterType( cCurChar ) != EToken_Invalid )
				{
					m_curState = ELexState_Delimiter;
					curTokenType = GetDelimiterType( cCurChar );
					bDone = true;
				}
				// 开始字符串解析
				else if( cCurChar == '"' )
				{
					m_curState = ELexState_String;
					bAddToLex = false;
				}
				// 运算符
				else if( IsOptChar( cCurChar ) )
				{
					m_curState = ELexState_Operator;
					szOpt[optW++] = cCurChar;
				}
				// 非法字符,解析失败
				else
				{
					return false;
				}
			}
			break;

			//--------整数状态
		case ELexState_Int:
			{
				// 整数保持当前状态
				if( IsNumeric( cCurChar ) )
					m_curState = ELexState_Int;
				// 如果是小数点,则转到浮点数
				else if( cCurChar == '.' )
					m_curState = ELexState_Float;
				// 如果是空格,完成识别
				else if( IsWhiteChar( cCurChar ) )
				{
					bAddToLex = false;
					bDone = true;
				}
				// 如果是运算符,完成识别
				else if( IsOptChar( cCurChar ) )
				{
					bAddToLex = false;
					bDone = true;
					-- m_nCurCharPos;
				}
				// 其它都是非法的
				else
					return false;
			}
			break;

			//--------浮点数状态
		case ELexState_Float:
			{
				if( IsNumeric( cCurChar ) )
					m_curState = ELexState_Float;
				// 如果是空格,完成识别
				else if( IsWhiteChar( cCurChar ) )
				{
					bAddToLex = false;
					bDone = true;
				}
				// 如果是运算符,完成识别
				else if( IsOptChar( cCurChar ) )
				{
					bAddToLex = false;
					bDone = true;
					-- m_nCurCharPos;
				}
				// 其它都是非法的
				else
					return false;
			}
			break;

			//--------标识符状态
		case ELexState_Identifier:
			{
				// 如果是标识符字符,则保持当前状态
				if( IsCharIdentifier( cCurChar ) )
				{
					m_curState = ELexState_Identifier;
				}
				// 如果是空格,完成识别
				else if( IsWhiteChar( cCurChar ) )
				{
					bAddToLex = false;
					bDone = true;
				}
				// 如果是运算符,完成识别
				else if( IsOptChar( cCurChar ) )
				{
					bAddToLex = false;
					bDone = true;
					-- m_nCurCharPos;
				}
				// 其它都是非法的
				else
					return false;
			}
			break;

			//---------字符串
		case ELexState_String:
			{
				// 如果是 " 字符串识别完成
				if( cCurChar == '"' )
				{
					bAddToLex = false;
					m_curState = ELexState_StringEnd;
				}
				// 如果是转义字符,则转到转义字符状态
				else if( cCurChar == '\\' )
				{
					bAddToLex = false;
					m_curState = ELexState_StringEscape;
				}
				// 其它字符全部添加到字符串中
			}
			break;

			//---------转义字符
		case ELexState_StringEscape:
			{
				// TODO 转换当前字符
				m_curState = ELexState_String;
			}
			break;

			//---------完成字符串识别
		case ELexState_StringEnd:
			{
				bAddToLex = false;
				bDone = true;
			}
			break;

			//---------运算符
		case ELexState_Operator:
			{
				szOpt[optW++] = cCurChar;
				if( GetOptTokenType( szOpt ) == EToken_Invalid )
				{
					bAddToLex = false;
					bDone = true;
					-- m_nCurCharPos;
				}
			}
			break;


		}	// end switch

		if( bAddToLex )
			szBuffer[w++] = cCurChar;
		if( bDone )
			break;

	}
	szBuffer[w++] = '\0';

	// 确定记号类型
	switch( m_curState )
	{
	case ELexState_Int:
		curTokenType = GetIntType( szBuffer );
		break;

	case ELexState_Float:
		curTokenType = EToken_Float;
		break;

	case ELexState_Identifier:
		curTokenType = GetKeywordType( szBuffer );
		break;

	case ELexState_Delimiter:
		curTokenType = GetDelimiterType( szBuffer[0] );
		break;

	case ELexState_Operator:
		curTokenType = GetOptTokenType( szBuffer );
		break;

	case ELexState_Start:
	default:
		curTokenType = EToken_Complete;
		break;
	}
	m_curToken.m_strTokenString = szBuffer;
	m_curToken.m_eTokenType		= curTokenType;

	return true;
}
Ejemplo n.º 2
0
    void VirtualMachine::LoadRuntimeClasses()
    {
        // Load only once.
        if(objectClass)
            return;

        // The first loaded module must be the runtime.
        runtimeModule = loadedModules[0];
        runtimeModule->SetRuntimeFlag(true);

        // Get basic classes.
        typeClass = GetClass(runtimeModule, "Chela.Lang.Type");
        objectClass = GetClass(runtimeModule, "Chela.Lang.Object");
        stringClass = GetClass(runtimeModule, "Chela.Lang.String");
        closureClass = GetClass(runtimeModule, "Chela.Lang.Closure");
        arrayClass = GetClass(runtimeModule, "Chela.Lang.Array");
        valueTypeClass = GetClass(runtimeModule, "Chela.Lang.ValueType");
        enumClass = GetClass(runtimeModule, "Chela.Lang.Enum");
        delegateClass = GetClass(runtimeModule, "Chela.Lang.Delegate");

        // Special attributes.
        threadStaticAttribute = GetClass(runtimeModule, "Chela.Lang.ThreadStaticAttribute");
        chelaIntrinsicAttribute = GetClass(runtimeModule, "Chela.Runtime.Core.ChelaIntrinsicAttribute");

        // Get the kernel data holding classes.
        streamHolderClass = GetTemplateClass(runtimeModule, "Chela.Compute.StreamHolder");
        streamHolder1DClass = GetTemplateClass(runtimeModule, "Chela.Compute.StreamHolder1D");
        streamHolder2DClass = GetTemplateClass(runtimeModule, "Chela.Compute.StreamHolder2D");
        streamHolder3DClass = GetTemplateClass(runtimeModule, "Chela.Compute.StreamHolder3D");
        uniformHolderClass = GetTemplateClass(runtimeModule, "Chela.Compute.UniformHolder");

        // Get the reflection classes.
        assemblyClass = GetClass(runtimeModule, "Chela.Reflection.Assembly");
        constructorInfoClass = GetClass(runtimeModule, "Chela.Reflection.ConstructorInfo");
        eventInfoClass = GetClass(runtimeModule, "Chela.Reflection.EventInfo");
        fieldInfoClass = GetClass(runtimeModule, "Chela.Reflection.FieldInfo");
        memberInfoClass = GetClass(runtimeModule, "Chela.Reflection.MemberInfo");
        methodInfoClass = GetClass(runtimeModule, "Chela.Reflection.MethodInfo");
        parameterInfoClass = GetClass(runtimeModule, "Chela.Reflection.ParameterInfo");
        propertyInfoClass = GetClass(runtimeModule, "Chela.Reflection.PropertyInfo");

        // Register associated types.
        RegisterPrimStruct(GetBoolType(), "Chela.Lang.Boolean");
        RegisterPrimStruct(GetCharType(), "Chela.Lang.Char");
        RegisterPrimStruct(GetSByteType(), "Chela.Lang.SByte");
        RegisterPrimStruct(GetByteType(), "Chela.Lang.Byte");
        RegisterPrimStruct(GetShortType(), "Chela.Lang.Int16");
        RegisterPrimStruct(GetUShortType(), "Chela.Lang.UInt16");
        RegisterPrimStruct(GetIntType(), "Chela.Lang.Int32");
        RegisterPrimStruct(GetUIntType(), "Chela.Lang.UInt32");
        RegisterPrimStruct(GetLongType(), "Chela.Lang.Int64");
        RegisterPrimStruct(GetULongType(), "Chela.Lang.UInt64");
        RegisterPrimStruct(GetSizeType(), "Chela.Lang.UIntPtr");
        RegisterPrimStruct(GetPtrDiffType(), "Chela.Lang.IntPtr");
        RegisterPrimStruct(GetFloatType(), "Chela.Lang.Single");
        RegisterPrimStruct(GetDoubleType(), "Chela.Lang.Double");
        RegisterPrimStruct(GetVoidType(), "Chela.Lang.Void");

        // Register vector associated types.
        RegisterPrimStruct(GetFloatVectorTy(this, 2), "Chela.Lang.Single2");
        RegisterPrimStruct(GetFloatVectorTy(this, 3), "Chela.Lang.Single3");
        RegisterPrimStruct(GetFloatVectorTy(this, 4), "Chela.Lang.Single4");
        RegisterPrimStruct(GetDoubleVectorTy(this, 2), "Chela.Lang.Double2");
        RegisterPrimStruct(GetDoubleVectorTy(this, 3), "Chela.Lang.Double3");
        RegisterPrimStruct(GetDoubleVectorTy(this, 4), "Chela.Lang.Double4");
        RegisterPrimStruct(GetIntVectorTy(this, 2), "Chela.Lang.Int32x2");
        RegisterPrimStruct(GetIntVectorTy(this, 3), "Chela.Lang.Int32x3");
        RegisterPrimStruct(GetIntVectorTy(this, 4), "Chela.Lang.Int32x4");
        RegisterPrimStruct(GetBoolVectorTy(this, 2), "Chela.Lang.Boolean2");
        RegisterPrimStruct(GetBoolVectorTy(this, 3), "Chela.Lang.Boolean3");
        RegisterPrimStruct(GetBoolVectorTy(this, 4), "Chela.Lang.Boolean4");

        // Register matrix associated types.
        RegisterPrimStruct(GetFloatMatrixTy(this, 3,3), "Chela.Lang.Single3x3");
        RegisterPrimStruct(GetFloatMatrixTy(this, 4,4), "Chela.Lang.Single4x4");

        // Declare them.
        typeClass->DeclarePass();
        objectClass->DeclarePass();
        stringClass->DeclarePass();
        closureClass->DeclarePass();
        arrayClass->DeclarePass();
        valueTypeClass->DeclarePass();
        enumClass->DeclarePass();
        delegateClass->DeclarePass();
        streamHolderClass->DeclarePass();
        streamHolder1DClass->DeclarePass();
        streamHolder2DClass->DeclarePass();
        streamHolder3DClass->DeclarePass();
        uniformHolderClass->DeclarePass();

        assemblyClass->DeclarePass();
        constructorInfoClass->DeclarePass();
        eventInfoClass->DeclarePass();
        fieldInfoClass->DeclarePass();
        memberInfoClass->DeclarePass();
        methodInfoClass->DeclarePass();
        parameterInfoClass->DeclarePass();
        propertyInfoClass->DeclarePass();
    }