00001
#ifndef INC_ASTFactory_hpp__
00002
#define INC_ASTFactory_hpp__
00003
00004
00005
00006
00007
00008
00009
00010
00011
#include <antlr/config.hpp>
00012
#include <antlr/AST.hpp>
00013
#include <antlr/ASTArray.hpp>
00014
#include <antlr/ASTPair.hpp>
00015
00016
#include <utility>
00017
00018
#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
00019
namespace antlr {
00020
#endif
00021
00030 class ANTLR_API ASTFactory {
00031
public:
00032 typedef RefAST (*
factory_type)();
00033 typedef ANTLR_USE_NAMESPACE(std)pair< const
char*, factory_type >
factory_descriptor;
00034 typedef ANTLR_USE_NAMESPACE(std)vector< factory_descriptor* >
factory_descriptor_list;
00035 protected:
00036
00037
00038 factory_descriptor default_factory_descriptor;
00039 factory_descriptor_list nodeFactories;
00040 public:
00042 ASTFactory();
00048 ASTFactory( const
char* factory_node_name, factory_type factory );
00050 virtual ~ASTFactory();
00051
00053
void registerFactory(
int type, const
char* ast_name, factory_type factory );
00055
void setMaxNodeType(
int type );
00056
00058
void addASTChild(
ASTPair& currentAST,
RefAST child);
00060 virtual
RefAST create();
00062
RefAST create(
int type);
00064
RefAST create(
int type, const ANTLR_USE_NAMESPACE(std)string& txt);
00066
RefAST create(
RefAST tr);
00068
RefAST create(
RefToken tok);
00070
RefAST create(const ANTLR_USE_NAMESPACE(std)string& txt, ANTLR_USE_NAMESPACE(std)istream& infile );
00074
RefAST dup(
RefAST t);
00076
RefAST dupList(
RefAST t);
00080
RefAST dupTree(
RefAST t);
00087
RefAST make(ANTLR_USE_NAMESPACE(std)vector<
RefAST>& nodes);
00092
RefAST make(
ASTArray* nodes);
00094
void makeASTRoot(
ASTPair& currentAST,
RefAST root);
00095
00103
void setASTNodeFactory( const
char* factory_node_name, factory_type factory );
00104
00105 #ifdef ANTLR_SUPPORT_XML
00110
RefAST LoadAST( ANTLR_USE_NAMESPACE(std)istream& infile );
00111 #endif
00112 protected:
00113
void loadChildren( ANTLR_USE_NAMESPACE(std)istream& infile,
RefAST current );
00114
void loadSiblings( ANTLR_USE_NAMESPACE(std)istream& infile,
RefAST current );
00115
bool checkCloseTag( ANTLR_USE_NAMESPACE(std)istream& infile );
00116
00117 #ifdef ANTLR_VECTOR_HAS_AT
00119 inline
RefAST getNodeOfType(
unsigned int type )
00120 {
00121
return RefAST(nodeFactories.at(type)->second());
00122 }
00124
const char* getASTNodeType(
unsigned int type )
00125 {
00126
return nodeFactories.at(type)->first;
00127 }
00129 factory_type getASTNodeFactory(
unsigned int type )
00130 {
00131
return nodeFactories.at(type)->second;
00132 }
00133
#else
00134 inline RefAST getNodeOfType(
unsigned int type )
00135 {
00136
return RefAST(nodeFactories[type]->second());
00137 }
00139 const char* getASTNodeType(
unsigned int type )
00140 {
00141
return nodeFactories[type]->first;
00142 }
00143 factory_type getASTNodeFactory(
unsigned int type )
00144 {
00145
return nodeFactories[type]->second;
00146 }
00147
#endif
00148
00149
private:
00150
00151 ASTFactory(
const ASTFactory& );
00152 ASTFactory& operator=(
const ASTFactory& );
00153 };
00154
00155
#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
00156
}
00157
#endif
00158
00159
#endif //INC_ASTFactory_hpp__