#ifndef _ANTLR3_TRAITS_HPP #define _ANTLR3_TRAITS_HPP #include "antlr3defs.hpp" ANTLR_BEGIN_NAMESPACE() //Users implementing overrides should inherit from this template<class ImplTraits> class CustomTraitsBase { public: typedef Empty AllocPolicyType; typedef Empty StringType; typedef Empty StringStreamType; typedef Empty StreamDataType; typedef Empty Endianness; //collections typedef Empty BitsetType; typedef Empty BitsetListType; typedef Empty InputStreamType; template<class StreamType> class IntStreamType : public Empty { public: typedef Empty BaseType; }; typedef Empty LexStateType; typedef Empty CommonTokenType; typedef Empty TokenIntStreamType; typedef Empty TokenStreamType; typedef Empty TreeNodeStreamType; typedef Empty DebugEventListenerType; template<class StreamType> class RecognizerSharedStateType : public Empty { public: typedef Empty BaseType; }; template<class StreamType> class RecognizerType : public Empty { public: typedef Empty BaseType; }; typedef Empty TreeType; typedef Empty TreeAdaptorType; template<class StreamType> class ExceptionBaseType : public Empty { public: typedef Empty BaseType; }; //this should be overridden with generated lexer typedef Empty BaseLexerType; typedef Empty TokenSourceType; typedef Empty BaseParserType;//this should be overridden with generated lexer typedef Empty BaseTreeParserType; template<class StreamType> class RewriteStreamType : public Empty { public: typedef Empty BaseType; }; typedef Empty RuleReturnValueType; //If we want to change the way tokens are stored static const bool TOKENS_ACCESSED_FROM_OWNING_RULE = false; static const int TOKEN_FILL_BUFFER_INCREMENT = 100; //used only if the above val is true static void displayRecognitionError( const std::string& str ) { printf("%s", str.c_str() ); } }; template<class A, class B> class TraitsSelector { public: typedef A selected; }; template<class B> class TraitsSelector<Empty, B> { public: typedef B selected; }; template<class A, class B, class C> class TraitsOneArgSelector { public: typedef A selected; }; template<class A, class B> class TraitsOneArgSelector<A,B,Empty> { public: typedef B selected; }; template<bool v, class A, class B> class BoolSelector { public: typedef A selected; }; template<class A, class B> class BoolSelector<false, A, B> { public: typedef B selected; }; template< template<class ImplTraits> class UserTraits > class TraitsBase { public: typedef TraitsBase TraitsType; typedef typename TraitsSelector< typename UserTraits<TraitsType>::AllocPolicyType, DefaultAllocPolicy >::selected AllocPolicyType; typedef typename TraitsSelector< typename UserTraits<TraitsType>::StringType, std::string >::selected StringType; typedef typename TraitsSelector< typename UserTraits<TraitsType>::StringStreamType, std::stringstream >::selected StringStreamType; typedef typename TraitsSelector< typename UserTraits<TraitsType>::StreamDataType, ANTLR_UINT8 >::selected StreamDataType; typedef typename TraitsSelector< typename UserTraits<TraitsType>::Endianness, RESOLVE_ENDIAN_AT_RUNTIME >::selected Endianness; typedef typename TraitsSelector< typename UserTraits<TraitsType>::BitsetType, Bitset<TraitsType> >::selected BitsetType; typedef typename TraitsSelector< typename UserTraits<TraitsType>::BitsetListType, BitsetList<TraitsType> >::selected BitsetListType; typedef typename TraitsSelector< typename UserTraits<TraitsType>::InputStreamType, InputStream<TraitsType> >::selected InputStreamType; template<class SuperType> class IntStreamType : public TraitsOneArgSelector< typename UserTraits<TraitsType>::template IntStreamType<SuperType>, IntStream<TraitsType, SuperType>, typename UserTraits<TraitsType>::template IntStreamType<SuperType>::BaseType >::selected { }; typedef typename TraitsSelector< typename UserTraits<TraitsType>::LexStateType, LexState<TraitsType> >::selected LexStateType; static const bool TOKENS_ACCESSED_FROM_OWNING_RULE = UserTraits<TraitsType>::TOKENS_ACCESSED_FROM_OWNING_RULE; static const int TOKEN_FILL_BUFFER_INCREMENT = UserTraits<TraitsType>::TOKEN_FILL_BUFFER_INCREMENT; //used only if the above val is true static void displayRecognitionError( const StringType& str ) { UserTraits<TraitsType>::displayRecognitionError(str); } }; template< class LxrType, class PsrType, template<class ImplTraits> class UserTraits = CustomTraitsBase, class TreePsrType = antlr3::Empty > class Traits : public TraitsBase<UserTraits> { public: typedef Traits TraitsType; typedef TraitsBase<UserTraits> BaseTraitsType; typedef typename TraitsSelector< typename UserTraits<TraitsType>::CommonTokenType, CommonToken<TraitsType> >::selected CommonTokenType; typedef typename TraitsSelector< typename UserTraits<TraitsType>::TokenIntStreamType, TokenIntStream<TraitsType> >::selected TokenIntStreamType; typedef typename TraitsSelector< typename UserTraits<TraitsType>::TokenStreamType, CommonTokenStream<TraitsType> >::selected TokenStreamType; typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeNodeStreamType, CommonTreeNodeStream<TraitsType> >::selected TreeNodeStreamType; typedef typename TraitsSelector< typename UserTraits<TraitsType>::DebugEventListenerType, DebugEventListener<TraitsType> >::selected DebugEventListenerType; template<class StreamType> class RecognizerSharedStateType : public TraitsOneArgSelector< typename UserTraits<TraitsType>::template RecognizerSharedStateType<StreamType>, RecognizerSharedState<TraitsType, StreamType>, typename UserTraits<TraitsType>::template RecognizerSharedStateType<StreamType>::BaseType >::selected {}; template<class StreamType> class RecognizerType : public TraitsOneArgSelector< typename UserTraits<TraitsType>::template RecognizerType<StreamType>, BaseRecognizer<TraitsType, StreamType>, typename UserTraits<TraitsType>::template RecognizerType<StreamType>::BaseType >::selected { public: typedef typename TraitsOneArgSelector< typename UserTraits<TraitsType>::template RecognizerType<StreamType>, BaseRecognizer<TraitsType, StreamType>, typename UserTraits<TraitsType>::template RecognizerType<StreamType>::BaseType >::selected BaseType; typedef typename BaseType::RecognizerSharedStateType RecognizerSharedStateType; public: RecognizerType(ANTLR_UINT32 sizeHint, RecognizerSharedStateType* state) : BaseType( sizeHint, state ) { } }; typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeType, CommonTree<TraitsType> >::selected TreeType; typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeAdaptorType, CommonTreeAdaptor<TraitsType> >::selected TreeAdaptorType; template<class StreamType> class ExceptionBaseType : public TraitsOneArgSelector< typename UserTraits<TraitsType>::template ExceptionBaseType<StreamType>, ANTLR_ExceptionBase<TraitsType, StreamType>, typename UserTraits<TraitsType>::template ExceptionBaseType<StreamType>::BaseType >::selected { public: typedef typename TraitsOneArgSelector< typename UserTraits<TraitsType>::template ExceptionBaseType<StreamType>, ANTLR_ExceptionBase<TraitsType, StreamType>, typename UserTraits<TraitsType>::template ExceptionBaseType<StreamType>::BaseType >::selected BaseType; protected: ExceptionBaseType( const typename BaseTraitsType::StringType& message ) :BaseType(message) { } }; //this should be overridden with generated lexer typedef typename TraitsSelector< typename UserTraits<TraitsType>::BaseLexerType, Lexer<TraitsType> >::selected BaseLexerType; typedef LxrType LexerType; typedef typename TraitsSelector< typename UserTraits<TraitsType>::TokenSourceType, TokenSource<TraitsType> >::selected TokenSourceType; typedef typename TraitsSelector< typename UserTraits<TraitsType>::BaseParserType, Parser<TraitsType> >::selected BaseParserType; typedef PsrType ParserType; typedef typename TraitsSelector< typename UserTraits<TraitsType>::BaseTreeParserType, TreeParser<TraitsType> >::selected BaseTreeParserType; typedef TreePsrType TreeParserType; template<class SuperType> class RewriteStreamType : public TraitsOneArgSelector< typename UserTraits<TraitsType>::template RewriteStreamType<SuperType>, RewriteRuleElementStream<TraitsType, SuperType>, typename UserTraits<TraitsType>::template RewriteStreamType<SuperType>::BaseType >::selected { public: typedef typename TraitsOneArgSelector< typename UserTraits<TraitsType>::template RewriteStreamType<SuperType>, RewriteRuleElementStream<TraitsType, SuperType>, typename UserTraits<TraitsType>::template RewriteStreamType<SuperType>::BaseType >::selected BaseType; typedef typename SuperType::StreamType StreamType; typedef typename BaseType::RecognizerType Recognizer_Type; typedef typename BaseType::TokenType TokenType; typedef typename BaseType::ElementsType ElementsType; public: RewriteStreamType(TreeAdaptorType* adaptor = NULL, Recognizer_Type* rec=NULL, ANTLR_UINT8* description = NULL) :BaseType(adaptor, rec, description) { } RewriteStreamType(TreeAdaptorType* adaptor, Recognizer_Type* rec, ANTLR_UINT8* description, TokenType* oneElement) :BaseType(adaptor, rec, description, oneElement) { } RewriteStreamType(TreeAdaptorType* adaptor, Recognizer_Type* rec, ANTLR_UINT8* description, const ElementsType& elements) :BaseType(adaptor, rec, description, elements) { } }; typedef typename TraitsSelector< typename UserTraits<TraitsType>::RuleReturnValueType, typename BoolSelector< TraitsType::TOKENS_ACCESSED_FROM_OWNING_RULE, RuleReturnValue_1<TraitsType>, RuleReturnValue<TraitsType> >::selected >::selected RuleReturnValueType; }; ANTLR_END_NAMESPACE() #endif //_ANTLR3_TRAITS_HPP