GME
13
|
00001 //############################################################################################################################################### 00002 // 00003 // Object Constraint Language Generic Manager 00004 // OCLTree.h 00005 // 00006 //############################################################################################################################################### 00007 00008 #ifndef OCLTree_h 00009 #define OCLTree_h 00010 00011 #include "StdAfx.h" 00012 #include "OCLCommon.h" 00013 #include "OCLException.h" 00014 #include "OCLObject.h" 00015 #include "OCLContext.h" 00016 #include "OCLType.h" 00017 #include "OCLFormalParameter.h" 00018 #include "OclViolation.h" 00019 00020 //udmoclpat_ocltree_h_1 __please do not remove or change this line__ 00021 00022 namespace OclTree 00023 { 00024 class TreeManager; 00025 00026 class ObjectNodeAdaptor; 00027 class CollectionNodeAdaptor; 00028 class ConstraintFactory; 00029 00030 class TreeNode; 00031 00032 class ObjectNode; 00033 class CollectionNode; 00034 00035 class DeclarationNode; 00036 class VariableNode; 00037 class TypeCastNode; 00038 class IfThenElseNode; 00039 00040 class AttributeNode; 00041 class AssociationNode; 00042 class IteratorNode; 00043 class MethodNode; 00044 class OperatorNode; 00045 class FunctionNode; 00046 00047 class ContextNode; 00048 class Constraint; 00049 //udmoclpat_ocltree_h_2 __please do not remove or change this line__ 00050 00051 typedef OclCommon::ContextStack< TypeSeq > TypeContextStack; 00052 00053 class TypeContext 00054 { 00055 public : 00056 TypeContextStack m_ctxTypes; 00057 OclCommon::ExceptionPool m_poolExceptions; 00058 StringVector m_vecImplicits; 00059 std::string m_strStereotype; 00060 OclMeta::DependencySet m_setDependencies; 00061 std::string m_namespace; 00062 00063 public : 00064 TypeContext( const std::string& pNamesp ) 00065 : m_strStereotype( "inv" ) 00066 , m_namespace( pNamesp) 00067 { 00068 } 00069 00070 TypeContext( const TypeContext& context ) 00071 : m_ctxTypes( context.m_ctxTypes ), m_poolExceptions( context.m_poolExceptions ), m_vecImplicits( context.m_vecImplicits ), m_strStereotype( context.m_strStereotype ), m_setDependencies( context.m_setDependencies ) 00072 , m_namespace( context.m_namespace) 00073 { 00074 } 00075 00076 TypeContext& operator=( const TypeContext& context ) 00077 { 00078 if ( this != &context ) { 00079 m_ctxTypes = context.m_ctxTypes; 00080 m_poolExceptions = context.m_poolExceptions; 00081 m_vecImplicits = context.m_vecImplicits; 00082 m_strStereotype = context.m_strStereotype; 00083 m_setDependencies = context.m_setDependencies; //FIXED, was m_setDependencies = m_setDependencies; 00084 m_namespace = context.m_namespace; 00085 } 00086 return *this; 00087 } 00088 }; 00089 00090 typedef OclCommon::ContextStack< OclMeta::Object > ObjectContextStack; 00091 00092 /* transferred to OclViolation 00093 struct Violation { 00094 bool bIsException; 00095 std::string strMessage; 00096 std::string strSignature; 00097 Position position; 00098 StringVector vecVariables; 00099 StringVector vecObjects; 00100 }; 00101 00102 typedef std::vector< Violation > ViolationVector; 00103 */ 00104 struct ObjectContext { 00105 ObjectContextStack oCtx; 00106 ViolationVector vecViolations; 00107 bool bDoSnapshot; 00108 int iViolationCount; 00109 bool m_bHasException; 00110 bool m_bShortCircuitLogical; 00111 bool m_bShortCircuitIterator; 00112 bool m_bEnableTracking; 00113 }; 00114 00115 typedef std::vector< TreeNode* > TreeNodeVector; 00116 00117 //############################################################################################################################################## 00118 // 00119 // A B S T R A C T C L A S S : OclTree::TreeNode 00120 // 00121 //============================================================================================================================================== 00122 // 00123 // D E S C R I P T I O N : 00124 // 00125 //############################################################################################################################################## 00126 00127 class TreeNode 00128 { 00129 public : typedef enum NodeKind { NK_OBJECT = 0, NK_COLLECTION = 1, NK_DECLARATION = 2, NK_VARIABLE = 3, NK_IFTHENELSE = 4, NK_OPERATOR = 5, NK_FUNCTION = 6, NK_ATTRIBUTE = 7, NK_ASSOCIATION = 8, NK_METHOD = 9, NK_ITERATOR = 10, NK_CONTEXT = 11, NK_TYPECAST = 12, NK_CONSTRAINT = 13, NK_EXTENSION = 14 }; 00130 00131 private : TreeManager* m_pManager; 00132 const NodeKind m_eKind; 00133 public : TypeSeq m_vecType; 00134 PositionMap m_mapPositions; 00135 bool m_bTester; 00136 bool m_bSelfTester; 00137 00138 public : 00139 TreeNode( TreeManager* pManager, NodeKind eKind ); 00140 virtual ~TreeNode(); 00141 00142 TreeManager* GetTreeManager() const; 00143 NodeKind GetKind() const; 00144 00145 virtual std::string Print( const std::string& strTabs ) const = 0; 00146 bool Check( TypeContext& context ); 00147 virtual OclMeta::Object Evaluate( ObjectContext& context ) = 0; 00148 00149 bool ParseTypeSeq( TypeContext& context, const Position& position, std::string& strType, TypeSeq& vecType ) const; 00150 bool CastType( TypeContext& context, const Position& position, const TypeSeq& vecTypeFrom, const TypeSeq& vecTypeTo ) const; 00151 VariableNode* CreateThis( TypeContext& context, int iImplicitPos ) const; 00152 int GetLastExceptionCode( TypeContext& context ) const; 00153 00154 TypeSeq GetParametralTypeSeq( const TypeSeq& vecType1, const TypeSeq& vecType2, const TypeSeq& vecTypeReturn ); 00155 OclMeta::Feature* CheckAmbiguity( const std::vector<OclMeta::Type*>& vecTypes, const std::vector<OclSignature::Feature*>& vecSignatures, std::vector<int>& vecAmbiguities, int& iPrecedence, OclCommon::ExceptionPool& exAmbiguity ); 00156 00157 void AddViolation( ObjectContext& context, int iLine, const std::string& strSignature, const std::string& strMessage = "" ); 00158 void AddViolation(ObjectContext& context, Violation &violation); 00159 bool IsBooleanReturned(); 00160 OclMeta::Object CheckFalseResult( ObjectContext& context, OclMeta::Object spObject, int iLine, const std::string& strSignature ); 00161 OclMeta::Object EvaluateCast( ObjectContext& context, OclMeta::Object spObject, int iLine, const std::string& strSignature, const std::string& strTypeName = "", bool bOnlyTest = true ); 00162 00163 protected : 00164 virtual void CheckInitialize(); 00165 virtual bool CheckImplementation( TypeContext& context ) = 0; 00166 }; 00167 00168 //############################################################################################################################################## 00169 // 00170 // C L A S S : OclTree::ObjectNode <<< + OclTree::TreeNode 00171 // 00172 //============================================================================================================================================== 00173 // 00174 // D E S C R I P T I O N : 00175 // 00176 //############################################################################################################################################## 00177 00178 class ObjectNode 00179 : public TreeNode 00180 { 00181 public : std::string m_strType; 00182 std::string m_strValue; 00183 bool m_bCallable; 00184 00185 ObjectNode( TreeManager* pManager ); 00186 00187 virtual std::string Print( const std::string& strTabs ) const; 00188 virtual bool CheckImplementation( TypeContext& context ); 00189 virtual OclMeta::Object Evaluate( ObjectContext& context ); 00190 }; 00191 00192 //############################################################################################################################################## 00193 // 00194 // C L A S S : OclTree::CollectionNode <<< + OclTree::TreeNode 00195 // 00196 //============================================================================================================================================== 00197 // 00198 // D E S C R I P T I O N : 00199 // 00200 //############################################################################################################################################## 00201 00202 class CollectionNode 00203 : public TreeNode 00204 { 00205 public : std::string m_strType; 00206 TreeNodeVector m_vecNodes; 00207 00208 CollectionNode( TreeManager* pManager ); 00209 ~CollectionNode(); 00210 00211 virtual std::string Print( const std::string& strTabs ) const; 00212 virtual bool CheckImplementation( TypeContext& context ); 00213 virtual OclMeta::Object Evaluate( ObjectContext& context ); 00214 }; 00215 00216 //############################################################################################################################################## 00217 // 00218 // C L A S S : OclTree::DeclarationNode <<< + OclTree::TreeNode 00219 // 00220 //============================================================================================================================================== 00221 // 00222 // D E S C R I P T I O N : 00223 // 00224 //############################################################################################################################################## 00225 00226 class DeclarationNode 00227 : public TreeNode 00228 { 00229 public : std::string m_strType; 00230 std::string m_strName; 00231 TreeNode* m_pValueNode; 00232 TreeNode* m_pInnerNode; 00233 TypeSeq m_vecTypeDecl; 00234 00235 DeclarationNode( TreeManager* pManager ); 00236 ~DeclarationNode(); 00237 00238 virtual std::string Print( const std::string& strTabs ) const; 00239 virtual OclMeta::Object Evaluate( ObjectContext& context ); 00240 00241 virtual void CheckInitialize(); 00242 virtual bool CheckImplementation( TypeContext& context ); 00243 }; 00244 00245 //############################################################################################################################################## 00246 // 00247 // C L A S S : OclTree::TypeCastNode <<< + OclTree::TreeNode 00248 // 00249 //============================================================================================================================================== 00250 // 00251 // D E S C R I P T I O N : 00252 // 00253 //############################################################################################################################################## 00254 00255 class TypeCastNode 00256 : public TreeNode 00257 { 00258 public : std::string m_strType; 00259 TreeNode* m_pThisNode; 00260 bool m_bIsDynamic; 00261 00262 TypeCastNode( TreeManager* pManager ); 00263 ~TypeCastNode(); 00264 00265 virtual std::string Print( const std::string& strTabs ) const; 00266 virtual void CheckInitialize(); 00267 virtual bool CheckImplementation( TypeContext& context ); 00268 virtual OclMeta::Object Evaluate( ObjectContext& context ); 00269 }; 00270 00271 //############################################################################################################################################## 00272 // 00273 // C L A S S : OclTree::IfThenElseNode <<< + OclTree::TreeNode 00274 // 00275 //============================================================================================================================================== 00276 // 00277 // D E S C R I P T I O N : 00278 // 00279 //############################################################################################################################################## 00280 00281 class IfThenElseNode 00282 : public TreeNode 00283 { 00284 public : 00285 TreeNode* m_pIfNode; 00286 TreeNode* m_pThenNode; 00287 TreeNode* m_pElseNode; 00288 00289 IfThenElseNode( TreeManager* pManager ); 00290 ~IfThenElseNode(); 00291 00292 virtual std::string Print( const std::string& strTabs ) const; 00293 virtual bool CheckImplementation( TypeContext& context ); 00294 virtual OclMeta::Object Evaluate( ObjectContext& context ); 00295 }; 00296 00297 //############################################################################################################################################## 00298 // 00299 // C L A S S : OclTree::OperatorNode <<< + OclTree::TreeNode 00300 // 00301 //============================================================================================================================================== 00302 // 00303 // D E S C R I P T I O N : 00304 // 00305 //############################################################################################################################################## 00306 00307 class OperatorNode 00308 : public TreeNode 00309 { 00310 public : 00311 std::string m_strName; 00312 TreeNode* m_pOperandNode1; 00313 TreeNode* m_pOperandNode2; 00314 std::string m_strAssignVarName; 00315 00316 OperatorNode( TreeManager* pManager ); 00317 ~OperatorNode(); 00318 00319 virtual std::string Print( const std::string& strTabs ) const; 00320 virtual void CheckInitialize(); 00321 virtual bool CheckImplementation( TypeContext& context ); 00322 virtual OclMeta::Object Evaluate( ObjectContext& context ); 00323 }; 00324 00325 //############################################################################################################################################## 00326 // 00327 // C L A S S : OclTree::IteratorNode <<< + OclTree::TreeNode 00328 // 00329 //============================================================================================================================================== 00330 // 00331 // D E S C R I P T I O N : 00332 // 00333 //############################################################################################################################################## 00334 00335 class LevelCounter 00336 { 00337 public: 00338 LevelCounter(int *count) 00339 { 00340 if (count) 00341 { 00342 counter = count; 00343 (*counter)++; 00344 } 00345 } 00346 ~LevelCounter() 00347 { 00348 if (counter) 00349 { 00350 (*counter)--; 00351 } 00352 } 00353 00354 private: 00355 int *counter; 00356 }; 00357 00358 class IteratorNode 00359 : public TreeNode 00360 { 00361 // recursion corrected: terge 00362 private: 00363 static int m_iteratorLevel; 00364 00365 public : 00366 std::string m_strName; 00367 TreeNode* m_pThisNode; 00368 TreeNode* m_pArgumentNode; 00369 00370 StringVector m_vecDeclarators; 00371 std::string m_strDeclType; 00372 TypeSeq m_vecTypeDecl; 00373 00374 std::string m_strAccuType; 00375 std::string m_strAccuName; 00376 TypeSeq m_vecTypeAccu; 00377 TreeNode* m_pAccuNode; 00378 00379 std::string m_strCallOperator; 00380 00381 IteratorNode( TreeManager* pManager ); 00382 ~IteratorNode(); 00383 00384 virtual std::string Print( const std::string& strTabs ) const; 00385 virtual void CheckInitialize(); 00386 virtual bool CheckImplementation( TypeContext& context ); 00387 virtual OclMeta::Object Evaluate( ObjectContext& context ); 00388 bool Iterate( ObjectContext& context, OclImplementation::Iterator* pIIterator, OclMeta::Object& objectThis, OclMeta::ObjectVector& vecArguments, int iDeclNum ); 00389 private : 00390 bool CheckIterator( TypeContext& context ); 00391 }; 00392 00393 //############################################################################################################################################## 00394 // 00395 // C L A S S : OclTree::MethodNode <<< + OclTree::TreeNode 00396 // 00397 //============================================================================================================================================== 00398 // 00399 // D E S C R I P T I O N : 00400 // 00401 //############################################################################################################################################## 00402 00403 class MethodNode 00404 : public TreeNode 00405 { 00406 private: 00407 static int m_stackLevel; 00408 00409 public : std::string m_strName; 00410 TreeNode* m_pThisNode; 00411 TreeNodeVector m_vecArguments; 00412 std::string m_strCallOperator; 00413 00414 IteratorNode* m_pIterator; 00415 00416 MethodNode( TreeManager* pManager ); 00417 ~MethodNode(); 00418 00419 virtual std::string Print( const std::string& strTabs ) const; 00420 virtual void CheckInitialize(); 00421 virtual bool CheckImplementation( TypeContext& context ); 00422 virtual OclMeta::Object Evaluate( ObjectContext& context ); 00423 }; 00424 00425 //############################################################################################################################################## 00426 // 00427 // C L A S S : OclTree::FunctionNode <<< + OclTree::TreeNode 00428 // 00429 //============================================================================================================================================== 00430 // 00431 // D E S C R I P T I O N : 00432 // 00433 //############################################################################################################################################## 00434 00435 class FunctionNode 00436 : public TreeNode 00437 { 00438 public : std::string m_strName; 00439 TreeNodeVector m_vecArguments; 00440 00441 MethodNode* m_pMethod; 00442 00443 FunctionNode( TreeManager* pManager ); 00444 ~FunctionNode(); 00445 00446 virtual std::string Print( const std::string& strTabs ) const; 00447 virtual void CheckInitialize(); 00448 virtual bool CheckImplementation( TypeContext& context ); 00449 virtual OclMeta::Object Evaluate( ObjectContext& context ); 00450 }; 00451 00452 //############################################################################################################################################## 00453 // 00454 // C L A S S : OclTree::AssociationNode <<< + OclTree::TreeNode 00455 // 00456 //============================================================================================================================================== 00457 // 00458 // D E S C R I P T I O N : 00459 // 00460 //############################################################################################################################################## 00461 00462 class AssociationNode 00463 : public TreeNode 00464 { 00465 public : std::string m_strName; 00466 std::string m_strAcceptable; 00467 TreeNode* m_pThisNode; 00468 std::string m_strCallOperator; 00469 00470 AssociationNode( TreeManager* pManager ); 00471 ~AssociationNode(); 00472 00473 virtual std::string Print( const std::string& strTabs ) const; 00474 virtual void CheckInitialize(); 00475 virtual bool CheckImplementation( TypeContext& context ); 00476 virtual OclMeta::Object Evaluate( ObjectContext& context ); 00477 private : 00478 bool CheckAssociation( TypeContext& context ); 00479 }; 00480 00481 //############################################################################################################################################## 00482 // 00483 // C L A S S : OclTree::AttributeNode <<< + OclTree::TreeNode 00484 // 00485 //============================================================================================================================================== 00486 // 00487 // D E S C R I P T I O N : 00488 // 00489 //############################################################################################################################################## 00490 00491 class AttributeNode 00492 : public TreeNode 00493 { 00494 public : std::string m_strName; 00495 TreeNode* m_pThisNode; 00496 std::string m_strCallOperator; 00497 00498 AssociationNode* m_pAssociation; 00499 IteratorNode* m_pCollector; 00500 00501 AttributeNode( TreeManager* pManager ); 00502 ~AttributeNode(); 00503 00504 virtual std::string Print( const std::string& strTabs ) const; 00505 virtual void CheckInitialize(); 00506 virtual bool CheckImplementation( TypeContext& context ); 00507 virtual OclMeta::Object Evaluate( ObjectContext& context ); 00508 }; 00509 00510 //############################################################################################################################################## 00511 // 00512 // C L A S S : OclTree::VariableNode <<< + OclTree::TreeNode 00513 // 00514 //============================================================================================================================================== 00515 // 00516 // D E S C R I P T I O N : 00517 // 00518 //############################################################################################################################################## 00519 00520 class VariableNode 00521 : public TreeNode 00522 { 00523 public : std::string m_strName; 00524 00525 AttributeNode* m_pAttribute; 00526 ObjectNode* m_pType; 00527 00528 VariableNode( TreeManager* pManager ); 00529 ~VariableNode(); 00530 00531 virtual std::string Print( const std::string& strTabs ) const; 00532 virtual void CheckInitialize(); 00533 virtual bool CheckImplementation( TypeContext& context ); 00534 virtual OclMeta::Object Evaluate( ObjectContext& context ); 00535 }; 00536 00537 //############################################################################################################################################## 00538 // 00539 // C L A S S : OclTree::ContextNode <<< + OclTree::TreeNode 00540 // 00541 //============================================================================================================================================== 00542 // 00543 // D E S C R I P T I O N : 00544 // 00545 //############################################################################################################################################## 00546 00547 class ContextNode 00548 : public TreeNode 00549 { 00550 public : std::string m_strName; 00551 std::string m_strType; 00552 bool m_bClassifier; 00553 std::string m_strStereotype; 00554 OclMeta::DependencySet m_setDependencies; 00555 00556 OclCommon::FormalParameterVector m_vecParameters; 00557 std::string m_strReturnType; 00558 TypeSeq m_vecTypeReturn; 00559 00560 ContextNode( TreeManager* pManager ); 00561 00562 virtual std::string Print( const std::string& strTabs ) const; 00563 virtual void CheckInitialize(); 00564 virtual bool CheckImplementation( TypeContext& context ); 00565 virtual OclMeta::Object Evaluate( ObjectContext& context ); 00566 }; 00567 00568 //############################################################################################################################################## 00569 // 00570 // C L A S S : OclTree::Constraint <<< + OclTree::TreeNode 00571 // 00572 //============================================================================================================================================== 00573 // 00574 // D E S C R I P T I O N : 00575 // 00576 //############################################################################################################################################## 00577 00578 class Constraint 00579 : public TreeNode 00580 { 00581 public : std::string m_strName; 00582 ContextNode* m_pContext; 00583 TreeNode* m_pExpression; 00584 00585 Constraint( TreeManager* pManager ); 00586 virtual ~Constraint(); 00587 00588 virtual std::string Print( const std::string& strTabs ) const; 00589 virtual bool CheckImplementation( TypeContext& context ); 00590 virtual OclMeta::Object Evaluate( ObjectContext& context ); 00591 }; 00592 00593 //############################################################################################################################################## 00594 // 00595 // A B S T R A C T C L A S S : OclTree::ObjectNodeAdaptor 00596 // 00597 //============================================================================================================================================== 00598 // 00599 // D E S C R I P T I O N : 00600 // 00601 //############################################################################################################################################## 00602 00603 class ObjectNodeAdaptor 00604 { 00605 public : ObjectNodeAdaptor() {} 00606 virtual ~ObjectNodeAdaptor() {} 00607 00608 virtual std::string Print( const std::string& strTabs, ObjectNode* pNode ) const; 00609 virtual bool Check( TypeContext& context, ObjectNode* pNode ) const; 00610 virtual OclMeta::Object Evaluate( ObjectContext& context, ObjectNode* pNode ) const; 00611 }; 00612 00613 //############################################################################################################################################## 00614 // 00615 // P U R E A B S T R A C T C L A S S : OclTree::CollectionNodeAdaptor 00616 // 00617 //============================================================================================================================================== 00618 // 00619 // D E S C R I P T I O N : 00620 // 00621 //############################################################################################################################################## 00622 00623 class CollectionNodeAdaptor 00624 { 00625 public : 00626 CollectionNodeAdaptor() {} 00627 virtual ~CollectionNodeAdaptor() {} 00628 00629 virtual std::string Print( const std::string& strTabs, CollectionNode* pNode ) const; 00630 virtual bool Check( TypeContext& context, CollectionNode* pNode ) const; 00631 virtual OclMeta::Object Evaluate( ObjectContext& context, CollectionNode* pNode ) const; 00632 }; 00633 00634 //############################################################################################################################################## 00635 // 00636 // C L A S S : OclTree::TreeManager 00637 // 00638 //============================================================================================================================================== 00639 // 00640 // D E S C R I P T I O N : 00641 // 00642 //############################################################################################################################################## 00643 00644 class TreeManager 00645 { 00646 private : OclMeta::TypeManager* m_pTypeManager; 00647 ObjectNodeAdaptor* m_pOAdaptor; 00648 CollectionNodeAdaptor* m_pCAdaptor; 00649 00650 public : 00651 TreeManager( OclMeta::TypeManager* pTypeManager, ObjectNodeAdaptor* pOAdaptor, CollectionNodeAdaptor* pCAdaptor ); 00652 virtual ~TreeManager(); 00653 00654 OclMeta::TypeManager* GetTypeManager() const; 00655 00656 ObjectNode* CreateObject() const; 00657 CollectionNode* CreateCollection() const; 00658 00659 DeclarationNode* CreateDeclaration() const; 00660 VariableNode* CreateVariable() const; 00661 TypeCastNode* CreateTypeCast() const; 00662 IfThenElseNode* CreateIfThenElse() const; 00663 00664 OperatorNode* CreateOperator() const; 00665 IteratorNode* CreateIterator() const; 00666 MethodNode* CreateMethod() const; 00667 FunctionNode* CreateFunction() const; 00668 AssociationNode* CreateAssociation() const; 00669 AttributeNode* CreateAttribute() const; 00670 00671 ContextNode* CreateContext() const; 00672 Constraint* CreateConstraint() const; 00673 00674 //udmoclpat_ocltree_h_3 __please do not remove or change this line__ 00675 00676 friend class ObjectNode; 00677 friend class CollectionNode; 00678 }; 00679 00680 //udmoclpat_ocltree_h_4 __please do not remove or change this line__ 00681 00682 }; // namespace OclTree 00683 00684 00685 #endif // OclTree_h