/* @ 功能: 分析一个记号 @ 参数: @ 返回值:如果分析失败,返回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; }
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(); }