1*16467b97STreehugger Robot #ifndef _ANTLR3_TRAITS_HPP 2*16467b97STreehugger Robot #define _ANTLR3_TRAITS_HPP 3*16467b97STreehugger Robot 4*16467b97STreehugger Robot #include "antlr3defs.hpp" 5*16467b97STreehugger Robot 6*16467b97STreehugger Robot 7*16467b97STreehugger Robot ANTLR_BEGIN_NAMESPACE() 8*16467b97STreehugger Robot 9*16467b97STreehugger Robot //Users implementing overrides should inherit from this 10*16467b97STreehugger Robot template<class ImplTraits> 11*16467b97STreehugger Robot class CustomTraitsBase 12*16467b97STreehugger Robot { 13*16467b97STreehugger Robot public: 14*16467b97STreehugger Robot typedef Empty AllocPolicyType; 15*16467b97STreehugger Robot typedef Empty StringType; 16*16467b97STreehugger Robot typedef Empty StringStreamType; 17*16467b97STreehugger Robot typedef Empty StreamDataType; 18*16467b97STreehugger Robot typedef Empty Endianness; 19*16467b97STreehugger Robot 20*16467b97STreehugger Robot //collections 21*16467b97STreehugger Robot typedef Empty BitsetType; 22*16467b97STreehugger Robot typedef Empty BitsetListType; 23*16467b97STreehugger Robot 24*16467b97STreehugger Robot typedef Empty InputStreamType; 25*16467b97STreehugger Robot 26*16467b97STreehugger Robot template<class StreamType> 27*16467b97STreehugger Robot class IntStreamType : public Empty 28*16467b97STreehugger Robot { 29*16467b97STreehugger Robot public: 30*16467b97STreehugger Robot typedef Empty BaseType; 31*16467b97STreehugger Robot }; 32*16467b97STreehugger Robot 33*16467b97STreehugger Robot typedef Empty LexStateType; 34*16467b97STreehugger Robot 35*16467b97STreehugger Robot typedef Empty CommonTokenType; 36*16467b97STreehugger Robot typedef Empty TokenIntStreamType; 37*16467b97STreehugger Robot 38*16467b97STreehugger Robot typedef Empty TokenStreamType; 39*16467b97STreehugger Robot typedef Empty TreeNodeStreamType; 40*16467b97STreehugger Robot 41*16467b97STreehugger Robot 42*16467b97STreehugger Robot typedef Empty DebugEventListenerType; 43*16467b97STreehugger Robot template<class StreamType> 44*16467b97STreehugger Robot class RecognizerSharedStateType : public Empty 45*16467b97STreehugger Robot { 46*16467b97STreehugger Robot public: 47*16467b97STreehugger Robot typedef Empty BaseType; 48*16467b97STreehugger Robot }; 49*16467b97STreehugger Robot 50*16467b97STreehugger Robot template<class StreamType> 51*16467b97STreehugger Robot class RecognizerType : public Empty 52*16467b97STreehugger Robot { 53*16467b97STreehugger Robot public: 54*16467b97STreehugger Robot typedef Empty BaseType; 55*16467b97STreehugger Robot }; 56*16467b97STreehugger Robot 57*16467b97STreehugger Robot typedef Empty TreeType; 58*16467b97STreehugger Robot typedef Empty TreeAdaptorType; 59*16467b97STreehugger Robot 60*16467b97STreehugger Robot template<class StreamType> 61*16467b97STreehugger Robot class ExceptionBaseType : public Empty 62*16467b97STreehugger Robot { 63*16467b97STreehugger Robot public: 64*16467b97STreehugger Robot typedef Empty BaseType; 65*16467b97STreehugger Robot }; 66*16467b97STreehugger Robot 67*16467b97STreehugger Robot //this should be overridden with generated lexer 68*16467b97STreehugger Robot typedef Empty BaseLexerType; 69*16467b97STreehugger Robot 70*16467b97STreehugger Robot typedef Empty TokenSourceType; 71*16467b97STreehugger Robot typedef Empty BaseParserType;//this should be overridden with generated lexer 72*16467b97STreehugger Robot typedef Empty BaseTreeParserType; 73*16467b97STreehugger Robot 74*16467b97STreehugger Robot template<class StreamType> 75*16467b97STreehugger Robot class RewriteStreamType : public Empty 76*16467b97STreehugger Robot { 77*16467b97STreehugger Robot public: 78*16467b97STreehugger Robot typedef Empty BaseType; 79*16467b97STreehugger Robot }; 80*16467b97STreehugger Robot 81*16467b97STreehugger Robot typedef Empty RuleReturnValueType; 82*16467b97STreehugger Robot 83*16467b97STreehugger Robot //If we want to change the way tokens are stored 84*16467b97STreehugger Robot static const bool TOKENS_ACCESSED_FROM_OWNING_RULE = false; 85*16467b97STreehugger Robot static const int TOKEN_FILL_BUFFER_INCREMENT = 100; //used only if the above val is true 86*16467b97STreehugger Robot displayRecognitionError(const std::string & str)87*16467b97STreehugger Robot static void displayRecognitionError( const std::string& str ) { printf("%s", str.c_str() ); } 88*16467b97STreehugger Robot }; 89*16467b97STreehugger Robot 90*16467b97STreehugger Robot template<class A, class B> 91*16467b97STreehugger Robot class TraitsSelector 92*16467b97STreehugger Robot { 93*16467b97STreehugger Robot public: 94*16467b97STreehugger Robot typedef A selected; 95*16467b97STreehugger Robot }; 96*16467b97STreehugger Robot 97*16467b97STreehugger Robot template<class B> 98*16467b97STreehugger Robot class TraitsSelector<Empty, B> 99*16467b97STreehugger Robot { 100*16467b97STreehugger Robot public: 101*16467b97STreehugger Robot typedef B selected; 102*16467b97STreehugger Robot }; 103*16467b97STreehugger Robot 104*16467b97STreehugger Robot template<class A, class B, class C> 105*16467b97STreehugger Robot class TraitsOneArgSelector 106*16467b97STreehugger Robot { 107*16467b97STreehugger Robot public: 108*16467b97STreehugger Robot typedef A selected; 109*16467b97STreehugger Robot }; 110*16467b97STreehugger Robot 111*16467b97STreehugger Robot template<class A, class B> 112*16467b97STreehugger Robot class TraitsOneArgSelector<A,B,Empty> 113*16467b97STreehugger Robot { 114*16467b97STreehugger Robot public: 115*16467b97STreehugger Robot typedef B selected; 116*16467b97STreehugger Robot }; 117*16467b97STreehugger Robot 118*16467b97STreehugger Robot template<bool v, class A, class B> 119*16467b97STreehugger Robot class BoolSelector 120*16467b97STreehugger Robot { 121*16467b97STreehugger Robot public: 122*16467b97STreehugger Robot typedef A selected; 123*16467b97STreehugger Robot }; 124*16467b97STreehugger Robot 125*16467b97STreehugger Robot template<class A, class B> 126*16467b97STreehugger Robot class BoolSelector<false, A, B> 127*16467b97STreehugger Robot { 128*16467b97STreehugger Robot public: 129*16467b97STreehugger Robot typedef B selected; 130*16467b97STreehugger Robot }; 131*16467b97STreehugger Robot 132*16467b97STreehugger Robot template< template<class ImplTraits> class UserTraits > 133*16467b97STreehugger Robot class TraitsBase 134*16467b97STreehugger Robot { 135*16467b97STreehugger Robot public: 136*16467b97STreehugger Robot typedef TraitsBase TraitsType; 137*16467b97STreehugger Robot 138*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::AllocPolicyType, DefaultAllocPolicy >::selected AllocPolicyType; 139*16467b97STreehugger Robot 140*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::StringType, 141*16467b97STreehugger Robot std::string >::selected StringType; 142*16467b97STreehugger Robot 143*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::StringStreamType, 144*16467b97STreehugger Robot std::stringstream >::selected StringStreamType; 145*16467b97STreehugger Robot 146*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::StreamDataType, 147*16467b97STreehugger Robot ANTLR_UINT8 >::selected StreamDataType; 148*16467b97STreehugger Robot 149*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::Endianness, 150*16467b97STreehugger Robot RESOLVE_ENDIAN_AT_RUNTIME >::selected Endianness; 151*16467b97STreehugger Robot 152*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::BitsetType, 153*16467b97STreehugger Robot Bitset<TraitsType> >::selected BitsetType; 154*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::BitsetListType, 155*16467b97STreehugger Robot BitsetList<TraitsType> >::selected BitsetListType; 156*16467b97STreehugger Robot 157*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::InputStreamType, 158*16467b97STreehugger Robot InputStream<TraitsType> >::selected InputStreamType; 159*16467b97STreehugger Robot 160*16467b97STreehugger Robot template<class SuperType> 161*16467b97STreehugger Robot class IntStreamType 162*16467b97STreehugger Robot : public TraitsOneArgSelector< 163*16467b97STreehugger Robot typename UserTraits<TraitsType>::template IntStreamType<SuperType>, 164*16467b97STreehugger Robot IntStream<TraitsType, SuperType>, 165*16467b97STreehugger Robot typename UserTraits<TraitsType>::template IntStreamType<SuperType>::BaseType 166*16467b97STreehugger Robot >::selected 167*16467b97STreehugger Robot { }; 168*16467b97STreehugger Robot 169*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::LexStateType, 170*16467b97STreehugger Robot LexState<TraitsType> >::selected LexStateType; 171*16467b97STreehugger Robot 172*16467b97STreehugger Robot static const bool TOKENS_ACCESSED_FROM_OWNING_RULE = UserTraits<TraitsType>::TOKENS_ACCESSED_FROM_OWNING_RULE; 173*16467b97STreehugger Robot static const int TOKEN_FILL_BUFFER_INCREMENT = UserTraits<TraitsType>::TOKEN_FILL_BUFFER_INCREMENT; //used only if the above val is true 174*16467b97STreehugger Robot displayRecognitionError(const StringType & str)175*16467b97STreehugger Robot static void displayRecognitionError( const StringType& str ) { UserTraits<TraitsType>::displayRecognitionError(str); } 176*16467b97STreehugger Robot }; 177*16467b97STreehugger Robot 178*16467b97STreehugger Robot template< 179*16467b97STreehugger Robot class LxrType, 180*16467b97STreehugger Robot class PsrType, 181*16467b97STreehugger Robot template<class ImplTraits> class UserTraits = CustomTraitsBase, 182*16467b97STreehugger Robot class TreePsrType = antlr3::Empty 183*16467b97STreehugger Robot > 184*16467b97STreehugger Robot class Traits : public TraitsBase<UserTraits> 185*16467b97STreehugger Robot { 186*16467b97STreehugger Robot public: 187*16467b97STreehugger Robot typedef Traits TraitsType; 188*16467b97STreehugger Robot typedef TraitsBase<UserTraits> BaseTraitsType; 189*16467b97STreehugger Robot 190*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::CommonTokenType, 191*16467b97STreehugger Robot CommonToken<TraitsType> >::selected CommonTokenType; 192*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::TokenIntStreamType, 193*16467b97STreehugger Robot TokenIntStream<TraitsType> >::selected TokenIntStreamType; 194*16467b97STreehugger Robot 195*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::TokenStreamType, 196*16467b97STreehugger Robot CommonTokenStream<TraitsType> >::selected TokenStreamType; 197*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeNodeStreamType, 198*16467b97STreehugger Robot CommonTreeNodeStream<TraitsType> >::selected TreeNodeStreamType; 199*16467b97STreehugger Robot 200*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::DebugEventListenerType, 201*16467b97STreehugger Robot DebugEventListener<TraitsType> >::selected DebugEventListenerType; 202*16467b97STreehugger Robot 203*16467b97STreehugger Robot template<class StreamType> 204*16467b97STreehugger Robot class RecognizerSharedStateType 205*16467b97STreehugger Robot : public TraitsOneArgSelector< 206*16467b97STreehugger Robot typename UserTraits<TraitsType>::template RecognizerSharedStateType<StreamType>, 207*16467b97STreehugger Robot RecognizerSharedState<TraitsType, StreamType>, 208*16467b97STreehugger Robot typename UserTraits<TraitsType>::template RecognizerSharedStateType<StreamType>::BaseType 209*16467b97STreehugger Robot >::selected 210*16467b97STreehugger Robot {}; 211*16467b97STreehugger Robot 212*16467b97STreehugger Robot template<class StreamType> 213*16467b97STreehugger Robot class RecognizerType 214*16467b97STreehugger Robot : public TraitsOneArgSelector< 215*16467b97STreehugger Robot typename UserTraits<TraitsType>::template RecognizerType<StreamType>, 216*16467b97STreehugger Robot BaseRecognizer<TraitsType, StreamType>, 217*16467b97STreehugger Robot typename UserTraits<TraitsType>::template RecognizerType<StreamType>::BaseType 218*16467b97STreehugger Robot >::selected 219*16467b97STreehugger Robot { 220*16467b97STreehugger Robot public: 221*16467b97STreehugger Robot typedef typename TraitsOneArgSelector< 222*16467b97STreehugger Robot typename UserTraits<TraitsType>::template RecognizerType<StreamType>, 223*16467b97STreehugger Robot BaseRecognizer<TraitsType, StreamType>, 224*16467b97STreehugger Robot typename UserTraits<TraitsType>::template RecognizerType<StreamType>::BaseType 225*16467b97STreehugger Robot >::selected BaseType; 226*16467b97STreehugger Robot typedef typename BaseType::RecognizerSharedStateType RecognizerSharedStateType; 227*16467b97STreehugger Robot 228*16467b97STreehugger Robot public: RecognizerType(ANTLR_UINT32 sizeHint,RecognizerSharedStateType * state)229*16467b97STreehugger Robot RecognizerType(ANTLR_UINT32 sizeHint, RecognizerSharedStateType* state) 230*16467b97STreehugger Robot : BaseType( sizeHint, state ) 231*16467b97STreehugger Robot { 232*16467b97STreehugger Robot } 233*16467b97STreehugger Robot }; 234*16467b97STreehugger Robot 235*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeType, 236*16467b97STreehugger Robot CommonTree<TraitsType> >::selected TreeType; 237*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeAdaptorType, 238*16467b97STreehugger Robot CommonTreeAdaptor<TraitsType> >::selected TreeAdaptorType; 239*16467b97STreehugger Robot 240*16467b97STreehugger Robot template<class StreamType> 241*16467b97STreehugger Robot class ExceptionBaseType : public TraitsOneArgSelector< 242*16467b97STreehugger Robot typename UserTraits<TraitsType>::template ExceptionBaseType<StreamType>, 243*16467b97STreehugger Robot ANTLR_ExceptionBase<TraitsType, StreamType>, 244*16467b97STreehugger Robot typename UserTraits<TraitsType>::template ExceptionBaseType<StreamType>::BaseType 245*16467b97STreehugger Robot >::selected 246*16467b97STreehugger Robot { 247*16467b97STreehugger Robot public: 248*16467b97STreehugger Robot typedef typename TraitsOneArgSelector< 249*16467b97STreehugger Robot typename UserTraits<TraitsType>::template ExceptionBaseType<StreamType>, 250*16467b97STreehugger Robot ANTLR_ExceptionBase<TraitsType, StreamType>, 251*16467b97STreehugger Robot typename UserTraits<TraitsType>::template ExceptionBaseType<StreamType>::BaseType 252*16467b97STreehugger Robot >::selected BaseType; 253*16467b97STreehugger Robot 254*16467b97STreehugger Robot protected: ExceptionBaseType(const typename BaseTraitsType::StringType & message)255*16467b97STreehugger Robot ExceptionBaseType( const typename BaseTraitsType::StringType& message ) 256*16467b97STreehugger Robot :BaseType(message) 257*16467b97STreehugger Robot { 258*16467b97STreehugger Robot } 259*16467b97STreehugger Robot }; 260*16467b97STreehugger Robot 261*16467b97STreehugger Robot //this should be overridden with generated lexer 262*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::BaseLexerType, 263*16467b97STreehugger Robot Lexer<TraitsType> >::selected BaseLexerType; 264*16467b97STreehugger Robot typedef LxrType LexerType; 265*16467b97STreehugger Robot 266*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::TokenSourceType, 267*16467b97STreehugger Robot TokenSource<TraitsType> >::selected TokenSourceType; 268*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::BaseParserType, 269*16467b97STreehugger Robot Parser<TraitsType> >::selected BaseParserType; 270*16467b97STreehugger Robot 271*16467b97STreehugger Robot typedef PsrType ParserType; 272*16467b97STreehugger Robot 273*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::BaseTreeParserType, 274*16467b97STreehugger Robot TreeParser<TraitsType> >::selected BaseTreeParserType; 275*16467b97STreehugger Robot typedef TreePsrType TreeParserType; 276*16467b97STreehugger Robot 277*16467b97STreehugger Robot template<class SuperType> 278*16467b97STreehugger Robot class RewriteStreamType : public TraitsOneArgSelector< 279*16467b97STreehugger Robot typename UserTraits<TraitsType>::template RewriteStreamType<SuperType>, 280*16467b97STreehugger Robot RewriteRuleElementStream<TraitsType, SuperType>, 281*16467b97STreehugger Robot typename UserTraits<TraitsType>::template RewriteStreamType<SuperType>::BaseType 282*16467b97STreehugger Robot >::selected 283*16467b97STreehugger Robot { 284*16467b97STreehugger Robot public: 285*16467b97STreehugger Robot typedef typename TraitsOneArgSelector< 286*16467b97STreehugger Robot typename UserTraits<TraitsType>::template RewriteStreamType<SuperType>, 287*16467b97STreehugger Robot RewriteRuleElementStream<TraitsType, SuperType>, 288*16467b97STreehugger Robot typename UserTraits<TraitsType>::template RewriteStreamType<SuperType>::BaseType 289*16467b97STreehugger Robot >::selected BaseType; 290*16467b97STreehugger Robot 291*16467b97STreehugger Robot typedef typename SuperType::StreamType StreamType; 292*16467b97STreehugger Robot typedef typename BaseType::RecognizerType Recognizer_Type; 293*16467b97STreehugger Robot typedef typename BaseType::TokenType TokenType; 294*16467b97STreehugger Robot typedef typename BaseType::ElementsType ElementsType; 295*16467b97STreehugger Robot 296*16467b97STreehugger Robot public: RewriteStreamType(TreeAdaptorType * adaptor=NULL,Recognizer_Type * rec=NULL,ANTLR_UINT8 * description=NULL)297*16467b97STreehugger Robot RewriteStreamType(TreeAdaptorType* adaptor = NULL, Recognizer_Type* rec=NULL, ANTLR_UINT8* description = NULL) 298*16467b97STreehugger Robot :BaseType(adaptor, rec, description) 299*16467b97STreehugger Robot { 300*16467b97STreehugger Robot } RewriteStreamType(TreeAdaptorType * adaptor,Recognizer_Type * rec,ANTLR_UINT8 * description,TokenType * oneElement)301*16467b97STreehugger Robot RewriteStreamType(TreeAdaptorType* adaptor, Recognizer_Type* rec, ANTLR_UINT8* description, TokenType* oneElement) 302*16467b97STreehugger Robot :BaseType(adaptor, rec, description, oneElement) 303*16467b97STreehugger Robot { 304*16467b97STreehugger Robot } RewriteStreamType(TreeAdaptorType * adaptor,Recognizer_Type * rec,ANTLR_UINT8 * description,const ElementsType & elements)305*16467b97STreehugger Robot RewriteStreamType(TreeAdaptorType* adaptor, Recognizer_Type* rec, ANTLR_UINT8* description, const ElementsType& elements) 306*16467b97STreehugger Robot :BaseType(adaptor, rec, description, elements) 307*16467b97STreehugger Robot { 308*16467b97STreehugger Robot } 309*16467b97STreehugger Robot }; 310*16467b97STreehugger Robot 311*16467b97STreehugger Robot typedef typename TraitsSelector< typename UserTraits<TraitsType>::RuleReturnValueType, 312*16467b97STreehugger Robot typename BoolSelector< TraitsType::TOKENS_ACCESSED_FROM_OWNING_RULE, 313*16467b97STreehugger Robot RuleReturnValue_1<TraitsType>, RuleReturnValue<TraitsType> >::selected 314*16467b97STreehugger Robot >::selected RuleReturnValueType; 315*16467b97STreehugger Robot }; 316*16467b97STreehugger Robot 317*16467b97STreehugger Robot 318*16467b97STreehugger Robot ANTLR_END_NAMESPACE() 319*16467b97STreehugger Robot 320*16467b97STreehugger Robot #endif //_ANTLR3_TRAITS_HPP 321