$ template make_analysis() $ $ // Generate the analysis.cpp file $ output $basedir + '/analysis.cpp' /* This file was generated by SableCC (http://www.sablecc.org/). */ #include "node.h" #include "token.h" #include "list.h" #include "prod.h" #include "analysis.h" $namespace::Analysis::~Analysis () { } $namespace::AnalysisAdapter::~AnalysisAdapter () { } void $namespace::AnalysisAdapter::caseStart (Start node) { defaultCase(node); } void $namespace::AnalysisAdapter::caseTEOF (TEOF node) { defaultCase(node); } void $namespace::AnalysisAdapter::defaultCase (Node node) { } $ foreach {//token} void $namespace::AnalysisAdapter::case@ename (@ename node) { defaultCase(node); } $ end foreach $ foreach {//alt} void $namespace::AnalysisAdapter::case@ename (@ename node) { defaultCase(node); } $ end foreach $namespace::DepthFirstAdapter::~DepthFirstAdapter () { } void $namespace::DepthFirstAdapter::caseStart (Start node) { inStart (node); node.getTEOF().apply(*this); node.get${productions/production/@ename}().apply(*this); outStart (node); } void $namespace::DepthFirstAdapter::defaultIn (Node node) { } void $namespace::DepthFirstAdapter::defaultOut (Node node) { } void $namespace::DepthFirstAdapter::inStart (Start node) { defaultIn(node); } void $namespace::DepthFirstAdapter::outStart (Start node) { defaultOut(node); } $ foreach {//alt} void $namespace::DepthFirstAdapter::in@ename (@ename node) { defaultIn(node); } void $namespace::DepthFirstAdapter::case@ename (@ename node) { in@ename (node); $ foreach {elem} $ if @is_list node.get@ename().apply(*this); $ else if ( node.get@ename() ) node.get@ename().apply(*this); $ end $ end foreach out@ename (node); } void $namespace::DepthFirstAdapter::out@ename (@ename node) { defaultOut(node); } $ end foreach $namespace::ReverseDepthFirstAdapter::~ReverseDepthFirstAdapter () { } void $namespace::ReverseDepthFirstAdapter::caseStart (Start node) { inStart (node); node.getTEOF().apply(*this); node.get${productions/production/@ename}().apply(*this); outStart (node); } void $namespace::ReverseDepthFirstAdapter::defaultIn (Node node) { } void $namespace::ReverseDepthFirstAdapter::defaultOut (Node node) { } void $namespace::ReverseDepthFirstAdapter::inStart (Start node) { defaultIn(node); } void $namespace::ReverseDepthFirstAdapter::outStart (Start node) { defaultOut(node); } $ foreach {//alt} void $namespace::ReverseDepthFirstAdapter::in@ename (@ename node) { defaultIn(node); } void $namespace::ReverseDepthFirstAdapter::case@ename (@ename node) { in@ename (node); $ reverse_foreach {elem} $ if @is_list node.get@ename().reverse_apply(*this); $ else if ( node.get@ename() ) node.get@ename().apply(*this); $ end $ end reverse_foreach out@ename (node); } void $namespace::ReverseDepthFirstAdapter::out@ename (@ename node) { defaultOut(node); } $ end foreach $ end output $ // Generate the analysis.h file $ output $incdir + '/analysis.h' /* This file was generated by SableCC (http://www.sablecc.org/). */ #ifndef __${$namespace}__analysis_hh__ #define __${$namespace}__analysis_hh__ namespace $namespace { class Analysis { public: virtual ~Analysis(); virtual void caseStart (Start node) = 0; virtual void caseTEOF (TEOF node) = 0; $ foreach {//token} virtual void case@ename (@ename node) = 0; $ end $ foreach {//alt} virtual void case@ename (@ename node) = 0; $ end }; class AnalysisAdapter : public Analysis { public: virtual void caseStart (Start node); virtual void caseTEOF (TEOF node); virtual void defaultCase (Node node); $ foreach {//token} virtual void case@ename (@ename node); $ end $ foreach {//alt} virtual void case@ename (@ename node); $ end virtual ~AnalysisAdapter(); }; class DepthFirstAdapter : public AnalysisAdapter { public: virtual void inStart (Start node); virtual void caseStart (Start node); virtual void outStart (Start node); virtual void defaultIn (Node node); virtual void defaultOut (Node node); $ foreach {//alt} virtual void in@ename (@ename node); virtual void case@ename (@ename node); virtual void out@ename (@ename node); $ end virtual ~DepthFirstAdapter(); }; class ReverseDepthFirstAdapter : public AnalysisAdapter { public: virtual void inStart (Start node); virtual void caseStart (Start node); virtual void outStart (Start node); virtual void defaultIn (Node node); virtual void defaultOut (Node node); $ foreach {//alt} virtual void in@ename (@ename node); virtual void case@ename (@ename node); virtual void out@ename (@ename node); $ end virtual ~ReverseDepthFirstAdapter(); }; } // namespace $namespace { #endif // !__${$namespace}__analysis_hh__ $ end output $ end template