00001
00002
00003
00004 #ifndef ASTPROCESSING_H
00005 #define ASTPROCESSING_H
00006 #define INHERITED 0
00007 #define SYNTHESIZED 1
00008 #define BOTH 2
00009
00010
00011
00012 #ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
00013 #include "staticCFG.h"
00014 #endif
00015
00016 #include <vector>
00017 #include <algorithm>
00018 #include <utility>
00019 #include <iostream>
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 bool
00036 SgTreeTraversal_inFileToTraverse(SgNode* node, bool traversalConstraint, SgFile* fileToVisit);
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 #include "AstSuccessorsSelectors.h"
00075 #include "StackFrameVector.h"
00076
00077
00078
00079 typedef void *DummyAttribute;
00080
00081
00082 static const DummyAttribute defaultDummyAttribute = NULL;
00083
00084
00085
00086 typedef DummyAttribute _DummyAttribute;
00087
00088
00089 template <class InheritedAttributeType, class SynthesizedAttributeType>
00090 class SgCombinedTreeTraversal;
00091
00092
00093
00094
00095
00096 template <class InheritedAttributeType, class SynthesizedAttributeType>
00097 class SgTreeTraversal
00098 {
00099 public:
00100 typedef StackFrameVector<SynthesizedAttributeType> SynthesizedAttributesList;
00101
00102 SynthesizedAttributeType traverse(SgNode* basenode,
00103 InheritedAttributeType inheritedValue,
00104 t_traverseOrder travOrder = preandpostorder);
00105
00106 SynthesizedAttributeType traverseWithinFile(SgNode* basenode,
00107 InheritedAttributeType inheritedValue,
00108 t_traverseOrder travOrder = preandpostorder);
00109
00110 void traverseInputFiles(SgProject* projectNode,
00111 InheritedAttributeType inheritedValue,
00112 t_traverseOrder travOrder = preandpostorder);
00113
00114
00115 virtual ~SgTreeTraversal();
00116 SgTreeTraversal();
00117
00118
00119 SgTreeTraversal(const SgTreeTraversal &);
00120 const SgTreeTraversal &operator=(const SgTreeTraversal &);
00121
00122 friend class SgCombinedTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>;
00123
00124
00125 #include "Cxx_GrammarTreeTraversalAccessEnums.h"
00126
00127 protected:
00128 virtual InheritedAttributeType evaluateInheritedAttribute(SgNode* astNode,
00129 InheritedAttributeType inheritedValue) = 0;
00130
00131
00132 virtual SynthesizedAttributeType evaluateSynthesizedAttribute(SgNode* n,
00133 InheritedAttributeType in,
00134 SynthesizedAttributesList l) = 0;
00135
00136
00137 typedef typename AstSuccessorsSelectors::SuccessorsContainer SuccessorsContainer;
00138 typedef SuccessorsContainer& SuccessorsContainerRef;
00139
00140
00141
00142 virtual void setNodeSuccessors(SgNode* node, SuccessorsContainer& succContainer);
00143
00144 virtual SynthesizedAttributeType defaultSynthesizedAttribute(InheritedAttributeType inh);
00145
00146
00147
00148
00149
00150
00151 virtual void atTraversalStart();
00152
00153
00154 virtual void atTraversalEnd();
00155
00156
00157
00158
00159
00160
00161 void set_useDefaultIndexBasedTraversal(bool);
00162 private:
00163 void performTraversal(SgNode *basenode,
00164 InheritedAttributeType inheritedValue,
00165 t_traverseOrder travOrder);
00166 SynthesizedAttributeType traversalResult();
00167
00168 bool useDefaultIndexBasedTraversal;
00169 bool traversalConstraint;
00170 SgFile *fileToVisit;
00171
00172
00173
00174
00175 SynthesizedAttributesList *synthesizedAttributes;
00176 };
00177
00178
00179
00180 template <class InheritedAttributeType, class SynthesizedAttributeType>
00181 class AstCombinedTopDownBottomUpProcessing;
00182
00183 template <class InheritedAttributeType, class SynthesizedAttributeType>
00184 class AstTopDownBottomUpProcessing
00185 : public SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>
00186 {
00187 public:
00188 typedef typename SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>
00189 ::SynthesizedAttributesList SynthesizedAttributesList;
00190
00191
00192 typedef SynthesizedAttributesList SubTreeSynthesizedAttributes;
00193
00195 SynthesizedAttributeType traverse(SgNode* node, InheritedAttributeType inheritedValue);
00196
00197
00198
00199
00200
00201
00203 SynthesizedAttributeType traverseWithinFile(SgNode* node, InheritedAttributeType inheritedValue);
00204
00205
00206 friend class AstCombinedTopDownBottomUpProcessing<InheritedAttributeType, SynthesizedAttributeType>;
00207
00208 protected:
00210 virtual InheritedAttributeType evaluateInheritedAttribute(SgNode* astNode,
00211 InheritedAttributeType inheritedValue) = 0;
00212
00217 virtual SynthesizedAttributeType evaluateSynthesizedAttribute(SgNode*,
00218 InheritedAttributeType,
00219 SynthesizedAttributesList) = 0;
00220
00221
00222
00226 virtual void atTraversalStart();
00227 virtual void atTraversalEnd();
00228 };
00229
00230 template <class InheritedAttributeType>
00231 class AstCombinedTopDownProcessing;
00232
00233 template <class InheritedAttributeType>
00234 class DistributedMemoryAnalysisPreTraversal;
00235
00236 template <class InheritedAttributeType>
00237 class AstTopDownProcessing
00238 : public SgTreeTraversal<InheritedAttributeType, DummyAttribute>
00239 {
00240 public:
00241 typedef typename SgTreeTraversal<InheritedAttributeType, DummyAttribute>
00242 ::SynthesizedAttributesList SynthesizedAttributesList;
00243
00245 void traverse(SgNode* node, InheritedAttributeType inheritedValue);
00246
00247
00249 void traverseWithinFile(SgNode* node, InheritedAttributeType inheritedValue);
00250
00251
00252 friend class AstCombinedTopDownProcessing<InheritedAttributeType>;
00253 friend class DistributedMemoryAnalysisPreTraversal<InheritedAttributeType>;
00254
00255 protected:
00257 virtual InheritedAttributeType evaluateInheritedAttribute(SgNode* astNode,
00258 InheritedAttributeType inheritedValue) = 0;
00259
00260
00264 virtual void atTraversalStart();
00265 virtual void atTraversalEnd();
00266
00267
00268
00269
00270
00271 virtual void destroyInheritedValue(SgNode*, InheritedAttributeType);
00272
00273 private:
00274 DummyAttribute evaluateSynthesizedAttribute(SgNode* astNode,
00275 InheritedAttributeType inheritedValue,
00276 SynthesizedAttributesList l);
00277
00278
00279 DummyAttribute defaultSynthesizedAttribute(InheritedAttributeType inh);
00280 };
00281
00282 template <class SynthesizedAttributeType>
00283 class AstCombinedBottomUpProcessing;
00284
00285 template <class InheritedAttributeType>
00286 class DistributedMemoryAnalysisPostTraversal;
00287
00288 template <class SynthesizedAttributeType>
00289 class AstBottomUpProcessing
00290 : public SgTreeTraversal<DummyAttribute,SynthesizedAttributeType>
00291 {
00292 public:
00293 typedef typename SgTreeTraversal<DummyAttribute, SynthesizedAttributeType>
00294 ::SynthesizedAttributesList SynthesizedAttributesList;
00295
00296
00297 typedef SynthesizedAttributesList SubTreeSynthesizedAttributes;
00298
00299
00300
00302 SynthesizedAttributeType traverse(SgNode* node);
00303
00304
00306 SynthesizedAttributeType traverseWithinFile(SgNode* node);
00307
00308
00310 void traverseInputFiles(SgProject* projectNode);
00311
00312 friend class AstCombinedBottomUpProcessing<SynthesizedAttributeType>;
00313 friend class DistributedMemoryAnalysisPostTraversal<SynthesizedAttributeType>;
00314
00315 protected:
00320 virtual SynthesizedAttributeType evaluateSynthesizedAttribute(SgNode*, SynthesizedAttributesList) = 0;
00321
00322
00326 virtual SynthesizedAttributeType defaultSynthesizedAttribute();
00330 virtual void atTraversalStart();
00331 virtual void atTraversalEnd();
00332
00333 private:
00334 virtual DummyAttribute evaluateInheritedAttribute(SgNode* astNode, DummyAttribute inheritedValue);
00335
00336
00337 virtual SynthesizedAttributeType evaluateSynthesizedAttribute(SgNode* astNode, DummyAttribute inheritedValue, SynthesizedAttributesList l);
00338
00339
00340
00341 virtual SynthesizedAttributeType defaultSynthesizedAttribute(DummyAttribute inheritedValue);
00342 };
00343
00344
00345 class AstSynthesizedAttribute {};
00346 class AstInheritedAttribute {};
00347
00349 class SgSynthesizedAttribute : public AstSynthesizedAttribute {};
00350
00352 class SgInheritedAttribute : public AstInheritedAttribute {};
00353
00354
00357 template <class InheritedAttributeType, class SynthesizedAttributeType>
00358 class SgTopDownBottomUpProcessing : public AstTopDownBottomUpProcessing <InheritedAttributeType, SynthesizedAttributeType> {};
00359
00361 template <class InheritedAttributeType>
00362 class SgTopDownProcessing : public AstTopDownProcessing <InheritedAttributeType> {};
00363
00365 template <class SynthesizedAttributeType>
00366 class SgBottomUpProcessing : public AstBottomUpProcessing <SynthesizedAttributeType> {};
00367
00368
00369
00370
00371
00372
00373
00374
00375 template<class InheritedAttributeType, class SynthesizedAttributeType>
00376 void
00377 SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>::
00378 setNodeSuccessors(SgNode* node, SuccessorsContainer& succContainer)
00379 {
00380 AstSuccessorsSelectors::selectDefaultSuccessors(node, succContainer);
00381 }
00382
00383
00384
00385
00386
00387 template<class InheritedAttributeType, class SynthesizedAttributeType>
00388 SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>::
00389 SgTreeTraversal()
00390 : useDefaultIndexBasedTraversal(true),
00391 traversalConstraint(false),
00392 fileToVisit(NULL),
00393 synthesizedAttributes(new SynthesizedAttributesList())
00394 {
00395 }
00396
00397 #ifndef SWIG
00398
00399 template<class InheritedAttributeType, class SynthesizedAttributeType>
00400 SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>::
00401 ~SgTreeTraversal()
00402 {
00403 ROSE_ASSERT(synthesizedAttributes != NULL);
00404 delete synthesizedAttributes;
00405 synthesizedAttributes = NULL;
00406 }
00407
00408
00409 #endif
00410
00411 template<class InheritedAttributeType, class SynthesizedAttributeType>
00412 SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>::
00413 SgTreeTraversal(const SgTreeTraversal &other)
00414 : useDefaultIndexBasedTraversal(other.useDefaultIndexBasedTraversal),
00415 traversalConstraint(other.traversalConstraint),
00416 fileToVisit(other.fileToVisit),
00417 synthesizedAttributes(other.synthesizedAttributes->deepCopy())
00418 {
00419 }
00420
00421 template<class InheritedAttributeType, class SynthesizedAttributeType>
00422 const SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType> &
00423 SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>::
00424 operator=(const SgTreeTraversal &other)
00425 {
00426 useDefaultIndexBasedTraversal = other.useDefaultIndexBasedTraversal;
00427 traversalConstraint = other.traversalConstraint;
00428 fileToVisit = other.fileToVisit;
00429
00430 ROSE_ASSERT(synthesizedAttributes != NULL);
00431 delete synthesizedAttributes;
00432 synthesizedAttributes = other.synthesizedAttributes->deepCopy();
00433
00434 return *this;
00435 }
00436
00437 template<class InheritedAttributeType, class SynthesizedAttributeType>
00438 void
00439 SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>::
00440 set_useDefaultIndexBasedTraversal(bool val)
00441 {
00442 useDefaultIndexBasedTraversal = val;
00443 }
00444
00445
00446
00447 template<class InheritedAttributeType, class SynthesizedAttributeType>
00448 void
00449 SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>::
00450 traverseInputFiles(SgProject* projectNode,
00451 InheritedAttributeType inheritedValue,
00452 t_traverseOrder travOrder)
00453 {
00454 const SgFilePtrList& fList = projectNode->get_fileList();
00455
00456
00457
00458
00459
00460 if ( SgProject::get_verbose() > 0 )
00461 printf ("Warning: The traverseInputFiles() iteration over the file list prevents the evaluation of inherited and synthesized attributes on the SgProject IR node! \n");
00462
00463 for (SgFilePtrList::const_iterator fl_iter = fList.begin(); fl_iter != fList.end(); fl_iter++)
00464 {
00465 ROSE_ASSERT(*fl_iter != NULL);
00466 traverseWithinFile((*fl_iter), inheritedValue, travOrder);
00467 }
00468 }
00469
00470
00471
00472
00473
00477
00478
00479
00480 template <class InheritedAttributeType, class SynthesizedAttributeType>
00481 SynthesizedAttributeType
00482 AstTopDownBottomUpProcessing<InheritedAttributeType, SynthesizedAttributeType>::
00483 traverse(SgNode* node, InheritedAttributeType inheritedValue)
00484 {
00485
00486 return SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>
00487 ::traverse(node, inheritedValue, preandpostorder);
00488 }
00489
00490
00491
00492 template <class InheritedAttributeType, class SynthesizedAttributeType>
00493 SynthesizedAttributeType
00494 AstTopDownBottomUpProcessing<InheritedAttributeType, SynthesizedAttributeType>::
00495 traverseWithinFile(SgNode* node, InheritedAttributeType inheritedValue)
00496 {
00497
00498 return SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>::traverseWithinFile(node, inheritedValue, preandpostorder);
00499 }
00500
00504
00505
00506 template <class InheritedAttributeType>
00507 DummyAttribute
00508 AstTopDownProcessing<InheritedAttributeType>::
00509 evaluateSynthesizedAttribute(SgNode* astNode,
00510 InheritedAttributeType inheritedValue,
00511 typename AstTopDownProcessing<InheritedAttributeType>::SynthesizedAttributesList l)
00512 {
00513
00514 destroyInheritedValue(astNode, inheritedValue);
00515
00516 DummyAttribute a = defaultDummyAttribute;
00517 return a;
00518 }
00519
00520
00521
00522 template <class InheritedAttributeType>
00523 DummyAttribute
00524 AstTopDownProcessing<InheritedAttributeType>::
00525 defaultSynthesizedAttribute(InheritedAttributeType inh)
00526 {
00527
00528 DummyAttribute a = defaultDummyAttribute;
00529 return a;
00530 }
00531
00532
00533 template <class InheritedAttributeType>
00534 void
00535 AstTopDownProcessing<InheritedAttributeType>::
00536 traverse(SgNode* node, InheritedAttributeType inheritedValue)
00537 {
00538
00539
00540 SgTreeTraversal<InheritedAttributeType, DummyAttribute>
00541 ::traverse(node, inheritedValue, preandpostorder);
00542 }
00543
00544
00545
00546 template <class InheritedAttributeType>
00547 void
00548 AstTopDownProcessing<InheritedAttributeType>::
00549 traverseWithinFile(SgNode* node, InheritedAttributeType inheritedValue)
00550 {
00551
00552
00553 SgTreeTraversal<InheritedAttributeType, DummyAttribute>::traverseWithinFile(node, inheritedValue, preandpostorder);
00554 }
00555
00556
00560
00561
00562 template <class SynthesizedAttributeType>
00563 DummyAttribute
00564 AstBottomUpProcessing<SynthesizedAttributeType>::
00565 evaluateInheritedAttribute(SgNode* astNode, DummyAttribute inheritedValue)
00566 {
00567
00568 DummyAttribute a = defaultDummyAttribute;
00569 return a;
00570 }
00571
00572
00573
00574
00575
00576 template <class SynthesizedAttributeType>
00577 SynthesizedAttributeType AstBottomUpProcessing<SynthesizedAttributeType>::
00578 defaultSynthesizedAttribute()
00579 {
00580
00581
00582
00583 SynthesizedAttributeType s = SynthesizedAttributeType();
00584 return s;
00585 }
00586
00587
00588 template <class SynthesizedAttributeType>
00589 SynthesizedAttributeType AstBottomUpProcessing<SynthesizedAttributeType>::
00590 defaultSynthesizedAttribute(DummyAttribute inheritedValue)
00591 {
00592 return defaultSynthesizedAttribute();
00593 }
00594
00595
00596 template <class SynthesizedAttributeType>
00597 SynthesizedAttributeType AstBottomUpProcessing<SynthesizedAttributeType>::
00598 evaluateSynthesizedAttribute(SgNode* astNode,
00599 DummyAttribute inheritedValue,
00600 SynthesizedAttributesList l)
00601 {
00602 return evaluateSynthesizedAttribute(astNode, l);
00603 }
00604
00605
00606
00607
00608
00609
00610 template <class SynthesizedAttributeType>
00611 SynthesizedAttributeType AstBottomUpProcessing<SynthesizedAttributeType>::
00612 traverse(SgNode* node)
00613 {
00614
00615 static DummyAttribute da;
00616 return SgTreeTraversal<DummyAttribute, SynthesizedAttributeType>
00617 ::traverse(node, da, postorder);
00618
00619 }
00620
00621
00622 template <class SynthesizedAttributeType>
00623 SynthesizedAttributeType AstBottomUpProcessing<SynthesizedAttributeType>::
00624 traverseWithinFile(SgNode* node)
00625 {
00626 static DummyAttribute da;
00627 return SgTreeTraversal<DummyAttribute, SynthesizedAttributeType>::traverseWithinFile(node, da, postorder);
00628 }
00629
00630
00631
00632
00633 template <class SynthesizedAttributeType>
00634 void AstBottomUpProcessing<SynthesizedAttributeType>::
00635 traverseInputFiles(SgProject* projectNode)
00636 {
00637 static DummyAttribute da;
00638
00639
00640
00641 SgTreeTraversal<DummyAttribute, SynthesizedAttributeType>
00642 ::traverseInputFiles(projectNode, da, postorder);
00643 }
00644 #ifdef _MSC_VER
00645
00646 #include "../astQuery/booleanQuery.h"
00647 #include "../astQuery/booleanQueryInheritedAttribute.h"
00648 #endif
00649
00650 template <class InheritedAttributeType, class SynthesizedAttributeType>
00651 SynthesizedAttributeType SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>::
00652 defaultSynthesizedAttribute(InheritedAttributeType inh)
00653 {
00654
00655 SynthesizedAttributeType s = SynthesizedAttributeType();
00656 return s;
00657 }
00658
00659
00660 template <class InheritedAttributeType, class SynthesizedAttributeType>
00661 SynthesizedAttributeType
00662 SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>::
00663 traverseWithinFile(SgNode* node,
00664 InheritedAttributeType inheritedValue,
00665 t_traverseOrder treeTraversalOrder)
00666 {
00667
00668 ROSE_ASSERT(this != NULL);
00669 traversalConstraint = true;
00670
00671 SgFile* filenode = isSgFile(node);
00672 ROSE_ASSERT(filenode != NULL);
00673
00674
00675
00676 fileToVisit = filenode;
00677
00678 ROSE_ASSERT(SgTreeTraversal_inFileToTraverse(node, traversalConstraint, fileToVisit) == true);
00679
00680 SynthesizedAttributeType synth = traverse(node, inheritedValue, treeTraversalOrder);
00681 traversalConstraint = false;
00682 return synth;
00683 }
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705 template <class InheritedAttributeType, class SynthesizedAttributeType>
00706 SynthesizedAttributeType SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>::
00707 traverse(SgNode *node, InheritedAttributeType inheritedValue,
00708 t_traverseOrder treeTraversalOrder)
00709 {
00710
00711 synthesizedAttributes->resetStack();
00712 ROSE_ASSERT(synthesizedAttributes->debugSize() == 0);
00713
00714
00715 atTraversalStart();
00716
00717
00718 performTraversal(node, inheritedValue, treeTraversalOrder);
00719
00720
00721 atTraversalEnd();
00722
00723
00724 return traversalResult();
00725 }
00726
00727
00728
00729 template<class InheritedAttributeType, class SynthesizedAttributeType>
00730 void
00731 SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>::
00732 performTraversal(SgNode* node,
00733 InheritedAttributeType inheritedValue,
00734 t_traverseOrder treeTraversalOrder)
00735 {
00736
00737
00738
00739
00740
00741
00742
00743 if (node && SgTreeTraversal_inFileToTraverse(node, traversalConstraint, fileToVisit))
00744 {
00745
00746
00747
00748
00749 if (treeTraversalOrder & preorder)
00750 inheritedValue = evaluateInheritedAttribute(node, inheritedValue);
00751
00752
00753
00754
00755 AstSuccessorsSelectors::SuccessorsContainer succContainer;
00756 size_t numberOfSuccessors;
00757 if (!useDefaultIndexBasedTraversal)
00758 {
00759 setNodeSuccessors(node, succContainer);
00760 numberOfSuccessors = succContainer.size();
00761 }
00762 else
00763 {
00764 numberOfSuccessors = node->get_numberOfTraversalSuccessors();
00765 }
00766
00767 for (size_t idx = 0; idx < numberOfSuccessors; idx++)
00768 {
00769 SgNode *child = NULL;
00770
00771 if (useDefaultIndexBasedTraversal)
00772 {
00773
00774 child = node->get_traversalSuccessorByIndex(idx);
00775 }
00776 else
00777 {
00778
00779 child = succContainer[idx];
00780 }
00781
00782 if (child != NULL)
00783 {
00784
00785
00786
00787 performTraversal(child, inheritedValue, treeTraversalOrder);
00788
00789
00790
00791
00792 }
00793 else
00794 {
00795
00796 if (treeTraversalOrder & postorder)
00797 synthesizedAttributes->push(defaultSynthesizedAttribute(inheritedValue));
00798 }
00799 }
00800
00801
00802
00803
00804
00805
00806
00807
00808 if (treeTraversalOrder & postorder)
00809 {
00810
00811
00812
00813
00814
00815
00816 synthesizedAttributes->setFrameSize(numberOfSuccessors);
00817 ROSE_ASSERT(synthesizedAttributes->size() == numberOfSuccessors);
00818 synthesizedAttributes->push(evaluateSynthesizedAttribute(node, inheritedValue, *synthesizedAttributes));
00819 }
00820 }
00821 else
00822 {
00823 if (treeTraversalOrder & postorder)
00824 synthesizedAttributes->push(defaultSynthesizedAttribute(inheritedValue));
00825 }
00826 }
00827
00828
00829
00830 template <class InheritedAttributeType, class SynthesizedAttributeType>
00831 SynthesizedAttributeType SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>::
00832 traversalResult()
00833 {
00834
00835
00836
00837
00838
00839
00840 if (synthesizedAttributes->debugSize() == 1)
00841 {
00842 return synthesizedAttributes->pop();
00843 }
00844 else
00845 {
00846 static SynthesizedAttributeType sa;
00847 return sa;
00848 }
00849 }
00850
00851
00852
00853 template <class InheritedAttributeType, class SynthesizedAttributeType>
00854 void
00855 SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>::
00856 atTraversalStart()
00857 {
00858 }
00859
00860 template <class InheritedAttributeType, class SynthesizedAttributeType>
00861 void
00862 SgTreeTraversal<InheritedAttributeType, SynthesizedAttributeType>::
00863 atTraversalEnd()
00864 {
00865 }
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883 template <class InheritedAttributeType, class SynthesizedAttributeType>
00884 void
00885 AstTopDownBottomUpProcessing<InheritedAttributeType, SynthesizedAttributeType>::
00886 atTraversalStart()
00887 {
00888 }
00889
00890 template <class InheritedAttributeType, class SynthesizedAttributeType>
00891 void
00892 AstTopDownBottomUpProcessing<InheritedAttributeType, SynthesizedAttributeType>::
00893 atTraversalEnd()
00894 {
00895 }
00896
00897 template <class InheritedAttributeType>
00898 void
00899 AstTopDownProcessing<InheritedAttributeType>::
00900 destroyInheritedValue(SgNode*, InheritedAttributeType)
00901 {
00902 }
00903
00904 template <class InheritedAttributeType>
00905 void
00906 AstTopDownProcessing<InheritedAttributeType>::
00907 atTraversalStart()
00908 {
00909 }
00910
00911 template <class InheritedAttributeType>
00912 void
00913 AstTopDownProcessing<InheritedAttributeType>::
00914 atTraversalEnd()
00915 {
00916 }
00917
00918 template <class SynthesizedAttributeType>
00919 void
00920 AstBottomUpProcessing<SynthesizedAttributeType>::
00921 atTraversalStart()
00922 {
00923 }
00924
00925 template <class SynthesizedAttributeType>
00926 void
00927 AstBottomUpProcessing<SynthesizedAttributeType>::
00928 atTraversalEnd()
00929 {
00930 }
00931
00932
00933 #include "AstSimpleProcessing.h"
00934
00935 #include "AstCombinedProcessing.h"
00936
00937
00938
00939
00940
00941
00942 #if !_MSC_VER
00943 #include "AstSharedMemoryParallelProcessing.h"
00944 #endif
00945
00946 #endif