Changeset 97 in dev for BasicCompiler_Common
- Timestamp:
- Apr 16, 2007, 3:52:40 AM (18 years ago)
- Location:
- BasicCompiler_Common
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler_Common/BasicCompiler.cpp
r92 r97 697 697 isUnicode = true; 698 698 typeOfPtrChar = MAKE_PTR_TYPE(DEF_WORD,1); 699 typeOfPtrUChar = MAKE_PTR_TYPE(DEF_WORD,1); 699 700 } 700 701 -
BasicCompiler_Common/BasicCompiler.h
r88 r97 81 81 bool isUnicode = false; 82 82 int typeOfPtrChar = MAKE_PTR_TYPE(DEF_SBYTE,1); 83 int typeOfPtrUChar = MAKE_PTR_TYPE(DEF_BYTE,1); 83 84 84 85 char *basbuf; -
BasicCompiler_Common/Class.cpp
r96 r97 1528 1528 if( !objClass.IsUsing() ){ 1529 1529 // 未使用のクラスは無視する 1530 if( (string)objClass.name == "CTest"){1531 int test=0;1532 }1533 1530 continue; 1534 1531 } -
BasicCompiler_Common/Class.h
r94 r97 210 210 //メンバの参照方法 211 211 enum RefType{ 212 Non = 0, // no reference member 212 213 Dot, // obj.member 213 214 Pointer, // obj->member 214 Non, // no reference member215 215 }; 216 216 }; -
BasicCompiler_Common/NumOpe_GetType.cpp
r96 r97 294 294 } 295 295 296 bool GetTermType( const char *term, Type &resultType, bool &isLiteral, bool *pIsClassName = NULL ){ 297 char parameter[VN_SIZE]; 298 299 // Withを解決 300 char termFull[VN_SIZE]; 301 if(term[0]=='.'){ 302 GetWithName(termFull); 303 lstrcat(termFull,term); 304 } 305 else lstrcpy(termFull,term); 306 307 char termLeft[VN_SIZE]; 308 lstrcpy(termLeft,termFull); 309 310 // パース 311 char member[VN_SIZE]; 312 CClass::RefType refType; 313 if( SplitMemberName( termFull, termLeft, member, refType ) ){ 314 /////////////////////////////////////////////////////////////////// 315 // オブジェクトとメンバに分解できるとき 316 // termLeft.member 317 /////////////////////////////////////////////////////////////////// 318 319 isLiteral = false; 320 321 // オブジェクト側の型を取得 322 bool isClassName = false; 323 Type leftType; 324 if( !GetTermType( termLeft, leftType, isLiteral, &isClassName ) ){ 325 return false; 326 } 327 328 if( isClassName ){ 329 // 静的メンバ/メソッドの場合 330 goto globalArea; 331 } 332 333 if( !leftType.HasMember() ){ 334 // メンバを持たない型の場合 335 return false; 336 } 337 338 const CClass &objClass = leftType.GetClass(); 339 340 341 /////////////////////////////////////////////////////////////////// 342 // メンバを検索 343 /////////////////////////////////////////////////////////////////// 344 if( GetMemberType( objClass, member, resultType, 0, false ) ){ 345 // メンバが見つかったとき 346 return true; 347 } 348 349 350 /////////////////////////////////////////////////////////////////// 351 // 動的メソッドを検索 352 /////////////////////////////////////////////////////////////////// 353 vector<UserProc *> userProcs; 354 355 char methodName[VN_SIZE] ,lpPtrOffset[VN_SIZE]; 356 lstrcpy( methodName, member ); 357 GetVarFormatString(methodName,parameter,lpPtrOffset,member,refType); 358 359 objClass.EnumMethod( methodName, userProcs ); 360 UserProc *pUserProc; 361 if(userProcs.size()){ 362 //オーバーロードを解決 363 pUserProc=OverloadSolutionWithStrParam(termFull,userProcs,parameter,termLeft); 364 365 if( pUserProc ){ 366 resultType = pUserProc->ReturnType(); 367 return true; 368 } 369 } 370 371 return false; 372 } 373 374 375 ////////////////////////////////////////////// 376 // クラス名かどうかをチェック(静的メンバ用) 377 ////////////////////////////////////////////// 378 379 if( pIsClassName ){ 380 if( pobj_DBClass->check( termFull ) ){ 381 *pIsClassName = true; 382 return true; 383 } 384 } 385 386 387 ///////////////////////////////////////////////////////////////// 388 // グローバル属性 389 ///////////////////////////////////////////////////////////////// 390 globalArea: 391 392 393 if(lstrcmpi(termFull,"This")==0){ 394 //Thisオブジェクト 395 resultType.SetType( DEF_OBJECT, pobj_CompilingClass ); 396 return true; 397 } 398 399 400 ////////////////////////////////////// 401 // 関数(DLL、ユーザー定義、組み込み) 402 ////////////////////////////////////// 403 char procName[VN_SIZE]; 404 char temporary[8192]; 405 406 int i2=GetCallProcName(termFull,procName); 407 if(termFull[i2]=='('){ 408 int i4=GetStringInPare_RemovePare(parameter,termFull+i2+1); 409 410 void *pProc; 411 int idProc=GetProc(procName,(void **)&pProc); 412 413 if(idProc){ 414 //閉じカッコ")"に続く文字がNULLでないとき 415 if(termFull[i2+1+i4+1]!='\0'){ 416 SetError(42,NULL,cp); 417 } 418 419 420 //////////////// 421 // 呼び出し 422 //////////////// 423 424 if( !CallProc(idProc,pProc,procName,parameter, resultType, false ) ){ 425 return false; 426 } 427 if( resultType.IsNull() ){ 428 //戻り値が存在しないとき 429 return false; 430 } 431 432 isLiteral = false; 433 434 return true; 435 } 436 else if(GetConstCalcBuffer(procName,parameter,temporary)){ 437 ///////////////////////// 438 // マクロ関数 439 ///////////////////////// 440 441 //閉じカッコ")"に続く文字がNULLでないときはエラーにする 442 if(termFull[i2+1+i4+1]!='\0') SetError(42,NULL,cp); 443 444 //マクロ関数の場合 445 if( !NumOpe_GetType(temporary,Type(),resultType) ){ 446 return false; 447 } 448 449 if( !IS_LITERAL( resultType.GetIndex() ) ){ 450 //リテラル値ではなかったとき 451 isLiteral = false; 452 } 453 454 return true; 455 } 456 } 457 458 459 //////////////////////////////// 460 // インデクサ(getアクセサ) 461 //////////////////////////////// 462 463 char VarName[VN_SIZE],ArrayElements[VN_SIZE]; 464 GetArrayElement(termFull,VarName,ArrayElements); 465 if(ArrayElements[0]){ 466 GetVarType(VarName,resultType,false); 467 if( resultType.IsObject() ){ 468 if( !GetReturnTypeOfIndexerGetterProc( resultType.GetClass(),resultType) ){ 469 SetError(1,NULL,cp); 470 return false; 471 } 472 473 isLiteral = false; 474 475 return true; 476 } 477 } 478 479 480 //////////////////////////////// 481 // 変数 482 //////////////////////////////// 483 484 if( GetVarType( termFull, resultType, false ) ){ 485 if( resultType.GetBasicType() & FLAG_PTR ){ 486 //配列ポインタ 487 resultType.SetBasicType( GetPtrType( resultType.GetBasicType()^FLAG_PTR ) ); 488 } 489 490 isLiteral = false; 491 492 return true; 493 } 494 495 496 ///////////////////////////////// 497 // プロパティ用のメソッド 498 ///////////////////////////////// 499 500 //配列要素を排除 501 GetArrayElement(termFull,VarName,ArrayElements); 502 503 if(GetSubHash(VarName,0)){ 504 GetReturnTypeOfPropertyMethod(termFull,NULL,resultType); 505 506 isLiteral = false; 507 508 return true; 509 } 510 511 512 return false; 513 } 514 296 515 bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType ){ 297 516 extern int cp; 298 int i,i2,i3,i4; 299 char temporary[1024],temp2[1024],temp3[1024]; 517 int i,i3; 300 518 301 519 if(expression[0]=='\0'){ … … 392 610 term = values[i]; 393 611 612 if( calc[i+1]%100 == CALC_AS ){ 613 // As演算子の右辺値 614 //型名 615 if( Type::StringToType( term, resultType ) ){ 616 resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST ); 617 } 618 else{ 619 SetError(3, term, cp ); 620 goto error; 621 } 622 623 type_stack[sp] = resultType.GetBasicType(); 624 index_stack[sp] = resultType.GetIndex(); 625 sp++; 626 627 break; 628 } 629 394 630 if(term[0]=='\"'){ 395 631 StrLiteral: 396 632 397 if( baseType.Is StringObject() ){398 //要求タイプがオブジェクト であり、Stringの受け入れが可能な場合633 if( baseType.IsObject() || baseType.IsNull() ){ 634 //要求タイプがオブジェクト、または未定のとき 399 635 extern CClass *pobj_StringClass; 400 636 type_stack[sp]=DEF_OBJECT; … … 421 657 // 何らかの識別子 422 658 423 ////////////////////////////////////// 424 // 関数(DLL、ユーザー定義、組み込み) 425 ////////////////////////////////////// 426 427 i2=GetCallProcName(term,temporary); 428 if(term[i2]=='('){ 429 i4=GetStringInPare_RemovePare(temp2,term+i2+1); 430 431 int idProc; 432 void *pProc; 433 idProc=GetProc(temporary,(void **)&pProc); 434 435 if(idProc){ 436 //閉じカッコ")"に続く文字がNULLでないとき 437 if(term[i2+1+i4+1]!='\0'){ 438 if( term[i2+1+i4+1] == '.' 439 || term[i2+1+i4+1] == 1 && term[i2+1+i4+2] == ESC_PSMEM ){ 440 goto NonProc; 441 } 442 else{ 443 SetError(42,NULL,cp); 444 } 445 } 446 447 448 //////////////// 449 // 呼び出し 450 //////////////// 451 452 Type resultType; 453 if( !CallProc(idProc,pProc,temporary,temp2, resultType, false ) ){ 454 goto error; 455 } 456 if( resultType.IsNull() ){ 457 //戻り値が存在しないとき 458 goto error; 459 } 460 461 type_stack[sp] = resultType.GetBasicType(); 462 index_stack[sp] = resultType.GetIndex(); 463 659 bool isLiteral = true; 660 if( GetTermType( term, resultType, isLiteral ) ){ 661 type_stack[sp] = resultType.GetBasicType(); 662 index_stack[sp] = resultType.GetIndex(); 663 664 if( !isLiteral ){ 464 665 bLiteralCalculation=0; 465 466 sp++;467 break;468 666 } 469 else if(GetConstCalcBuffer(temporary,temp2,temp3)){ 470 ///////////////////////// 471 // マクロ関数 472 ///////////////////////// 473 474 //閉じカッコ")"に続く文字がNULLでないときはエラーにする 475 if(term[i2+1+i4+1]!='\0') SetError(42,NULL,cp); 476 477 //マクロ関数の場合 478 Type tempType; 479 NumOpe_GetType(temp3,Type(),tempType); 480 481 if(!IS_LITERAL(tempType.GetIndex())){ 482 //リテラル値ではなかったとき 483 bLiteralCalculation=0; 484 } 485 486 type_stack[sp] = tempType.GetBasicType(); 487 index_stack[sp] = tempType.GetIndex(); 488 489 sp++; 490 break; 491 } 492 } 493 NonProc: 494 495 //インデクサ(getアクセサ) 496 char VarName[VN_SIZE],ArrayElements[VN_SIZE]; 497 GetArrayElement(term,VarName,ArrayElements); 498 if(ArrayElements[0]){ 499 Type type; 500 GetVarType(VarName,type,false); 501 if( type.IsObject() ){ 502 if( !GetReturnTypeOfIndexerGetterProc( type.GetClass(),type) ){ 503 SetError(1,NULL,cp); 504 goto error; 505 } 506 type_stack[sp]=type.GetBasicType(); 507 index_stack[sp]=type.GetIndex(); 508 bLiteralCalculation=0; 509 510 sp++; 511 break; 512 } 667 668 sp++; 669 break; 513 670 } 514 671 … … 526 683 } 527 684 bLiteralCalculation = 0; 528 sp++;529 break;530 }531 532 if( (string)term == "s.GetType().Name" ){533 int test=0;534 }535 536 537 Type varType;538 if( GetVarType(term,varType,0) ){539 //////////540 // 変数541 //////////542 543 if( varType.GetBasicType() & FLAG_PTR ){544 //配列ポインタ545 type_stack[sp]=GetPtrType( varType.GetBasicType()^FLAG_PTR );546 }547 else{548 type_stack[sp]=varType.GetBasicType();549 }550 index_stack[sp] = varType.GetIndex();551 552 bLiteralCalculation=0;553 685 sp++; 554 686 break; … … 586 718 587 719 588 //////////////589 // 型名の場合590 //////////////591 592 Type tempType;593 if( Type::StringToType( term, tempType ) ){594 type_stack[sp] = tempType.GetBasicType() | FLAG_CAST;595 index_stack[sp] = tempType.GetIndex();596 sp++;597 break;598 }599 600 601 720 ///////////////////////////////// 602 721 // プロパティ用のメソッド … … 604 723 605 724 //配列要素を排除 725 char VarName[VN_SIZE],ArrayElements[VN_SIZE]; 606 726 GetArrayElement(term,VarName,ArrayElements); 607 727 608 728 if(GetSubHash(VarName,0)){ 729 SetError(); 609 730 Type tempType; 610 731 GetReturnTypeOfPropertyMethod(term,NULL,tempType); -
BasicCompiler_Common/OldStatement.cpp
r76 r97 103 103 else if(varType.IsObject()){ 104 104 varType.SetBasicType( DEF_OBJECT ); 105 if( varType.IsString Object() ){105 if( varType.IsStringClass() ){ 106 106 varType.SetBasicType( DEF_STRING ); 107 107 } -
BasicCompiler_Common/Procedure.h
r92 r97 85 85 class UserProc : public Procedure 86 86 { 87 #ifdef _DEBUG 88 public: 89 string _paramStr; 90 #endif 87 91 88 92 private: -
BasicCompiler_Common/Subroutine.cpp
r94 r97 83 83 } 84 84 } 85 bool SplitMemberName( const char *desc, char *object, char *member, CClass::RefType &refType ){ 86 int lastIndex = -1; 87 for( int i=0; desc[i]; i++ ){ 88 if( desc[i] == '(' ){ 89 i=JumpStringInPare(desc,i+1); 90 continue; 91 } 92 else if( desc[i] == '[' ){ 93 i=JumpStringInBracket(desc,i+1); 94 continue; 95 } 96 else if(desc[i]=='.'||(desc[i]==1&&desc[i+1]==ESC_PSMEM)){ 97 lastIndex = i; 98 } 99 } 100 if( lastIndex == -1 ){ 101 return false; 102 } 103 104 if(desc[lastIndex]=='.'){ 105 lstrcpy(member,desc+lastIndex+1); 106 refType = CClass::Dot; 107 } 108 else{ 109 lstrcpy(member,desc+lastIndex+2); 110 refType = CClass::Pointer; 111 } 112 113 if( object ){ 114 lstrcpy( object, desc ); 115 object[lastIndex]=0; 116 } 117 118 return true; 119 } 85 120 bool SplitMemberName( const char *desc, char *object, char *member ){ 86 int i; 87 for(i=lstrlen(desc)-1;i>=0;i--){ 88 if(desc[i]=='.'||(desc[i]==1&&desc[i+1]==ESC_PSMEM)) 89 break; 90 } 91 if(i==-1) return false; 92 else{ 93 if(desc[i]=='.') 94 lstrcpy(member,desc+i+1); 95 else 96 lstrcpy(member,desc+i+2); 97 98 if( object ){ 99 lstrcpy( object, desc ); 100 object[i]=0; 101 } 102 } 103 104 return true; 121 CClass::RefType dummyRefType; 122 return SplitMemberName( desc, object, member, dummyRefType ); 105 123 } 106 124 … … 565 583 SubNum++; 566 584 567 568 585 UserProc *pUserProc = new UserProc( temporary, kind, isMacro, isCdecl, isExport ); 569 586 pUserProc->SetParentClass( pobj_c ); … … 580 597 // ※第1パラメータにに指定するデータの例:"( s As String ) As String" 581 598 pUserProc->SetParamsAndReturnType( buffer + i, nowLine, isStatic ); 599 600 #ifdef _DEBUG 601 pUserProc->_paramStr = buffer + i; 602 #endif 582 603 583 604 -
BasicCompiler_Common/Type.cpp
r88 r97 417 417 return false; 418 418 } 419 bool Type::IsStringObject() const 419 bool Type::IsObjectClass() const 420 { 421 if( basicType == DEF_OBJECT ){ 422 if( lstrcmp( pClass->name,"Object")==0){ 423 return true; 424 } 425 } 426 return false; 427 } 428 bool Type::IsStringClass() const 420 429 { 421 430 if( basicType == DEF_OBJECT ){ … … 438 447 if( basicType == DEF_ANY ){ 439 448 return true; 449 } 450 return false; 451 } 452 453 bool Type::HasMember() const 454 { 455 if( NATURAL_TYPE( basicType ) == DEF_OBJECT 456 || NATURAL_TYPE( basicType ) == DEF_STRUCT ){ 457 return true; 440 458 } 441 459 return false; -
BasicCompiler_Common/Type.h
r79 r97 105 105 bool IsObject() const; 106 106 bool IsObjectPtr() const; 107 bool IsStringObject() const; 107 bool IsObjectClass() const; 108 bool IsStringClass() const; 108 109 bool IsVoidPtr() const; 109 110 bool IsAny() const; 111 112 // オブジェクトや構造体など、メンバを持つ型かどうかを判別する 113 bool HasMember() const; 110 114 111 115 const string ToString() const; -
BasicCompiler_Common/VariableOpe.cpp
r88 r97 240 240 } 241 241 242 void GetWithName(char *buffer){ 243 extern WITHINFO WithInfo; 244 int i; 245 246 buffer[0]=0; 247 for(i=0;i<WithInfo.num;i++) 248 lstrcat(buffer,WithInfo.ppName[i]); 249 } 250 242 251 bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, CClass::RefType &refType, char *member ){ 243 252 int p1 = 0, p2 = 0; … … 1173 1182 } 1174 1183 1175 1176 1184 //構文を解析 1177 1185 int SubScripts[MAX_ARRAYDIM]; -
BasicCompiler_Common/VariableOpe.h
r79 r97 14 14 int GetPtrType(int type); 15 15 BOOL GetTypeName(int type,LONG_PTR lpIndex,char *name); 16 void GetWithName(char *buffer); 16 17 bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, CClass::RefType &refType, char *member ); 17 18 BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember, CClass::RefType &refType ); … … 21 22 void GetArrange(char *variable,char *variAnswer,int *SubScripts); 22 23 int GetTypeFromSimpleName(char *variable); 24 bool GetMemberType( const CClass &objClass, const char *lpszMember, Type &resultType, BOOL bPrivateAccess, bool isErrorEnabled); 23 25 bool GetVarType( const char *nameBuffer, Type &resultType, bool isError); 24 26 bool GetVarOffsetReadOnly(const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss = NULL ); -
BasicCompiler_Common/calculation.cpp
r79 r97 820 820 for(i=0,sp=0;i<pnum;i++){ 821 821 822 //型チェック(正常でない場合はエラーにする) 823 TypeErrorCheck(stack,sp,calc[i]%100); 822 if( enableerror ){ 823 //型チェック(正常でない場合はエラーにする) 824 TypeErrorCheck(stack,sp,calc[i]%100); 825 } 824 826 825 827 idCalc=calc[i]%100; … … 1088 1090 #pragma optimize("", on) 1089 1091 1090 BOOL GetConstCalcBuffer(c har *name,char *Parameter,char *pCalcBuffer){1092 BOOL GetConstCalcBuffer(const char *name,const char *Parameter,char *pCalcBuffer){ 1091 1093 extern HANDLE hHeap; 1092 1094 int i2,i3,i4,num; … … 1256 1258 pDllProc=GetDeclareHash(temporary); 1257 1259 if(pDllProc){ 1258 if( pDllProc->ReturnType().IsString Object() ){1260 if( pDllProc->ReturnType().IsStringClass() ){ 1259 1261 return 1; 1260 1262 } … … 1266 1268 pUserProc=GetSubHash(temporary); 1267 1269 if(pUserProc){ 1268 if( pUserProc->ReturnType().IsString Object() ){1270 if( pUserProc->ReturnType().IsStringClass() ){ 1269 1271 return 1; 1270 1272 } … … 1307 1309 return -1; 1308 1310 } 1309 if( varType.IsString Object() ){1311 if( varType.IsStringClass() ){ 1310 1312 return 1; 1311 1313 } … … 1526 1528 } 1527 1529 1530 calc[*pnum]=0; 1531 1528 1532 return 1; 1529 1533 } -
BasicCompiler_Common/common.h
r96 r97 94 94 extern bool isUnicode; 95 95 extern int typeOfPtrChar; 96 extern int typeOfPtrUChar; 96 97 97 98 … … 294 295 //hash.cpp 295 296 int hash_default(const char *name); 296 CONSTINFO *GetConstHash(c har *name);297 CONSTINFO *GetConstHash(const char *name); 297 298 DllProc *GetDeclareHash(char *name); 298 299 void GetOverloadSubHash( const char *lpszName, std::vector<UserProc *> &subs ); … … 418 419 int NeutralizationType(int type1,LONG_PTR index1,int type2,LONG_PTR index2); 419 420 DWORD GetLiteralValue(char *value,_int64 *pi64,int BaseType); 420 BOOL GetConstCalcBuffer(c har *name,char *Parameter,char *pCalcBuffer);421 BOOL GetConstCalcBuffer(const char *name,const char *Parameter,char *pCalcBuffer); 421 422 DWORD GetConstValue(char *name,double *dbl,char *buffer,LONG_PTR *plpIndex); 422 423 bool IsStringObjectType(const Type &TypeInfo); … … 435 436 int GetProc(char *name,void **ppInfo); 436 437 void SplitObjectName(const char *name,char *ObjectName,int *pRefType); 438 bool SplitMemberName( const char *desc, char *object, char *member, CClass::RefType &refType ); 437 439 bool SplitMemberName( const char *desc, char *object, char *member ); 438 440 bool CallProc( int kind, const void *pProc, const char *fullCallName, const char *lpszParms, Type &resultType, bool isCallOn = true ); -
BasicCompiler_Common/hash.cpp
r95 r97 17 17 } 18 18 19 CONSTINFO *GetConstHash(c har *name){19 CONSTINFO *GetConstHash(const char *name){ 20 20 //ハッシュ値を取得 21 21 int key;
Note:
See TracChangeset
for help on using the changeset viewer.