#ifndef _ANTLR3_TRAITS_HPP #define _ANTLR3_TRAITS_HPP #include "antlr3defs.hpp" ANTLR_BEGIN_NAMESPACE() //Users implementing overrides should inherit from this template 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 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 RecognizerSharedStateType : public Empty { public: typedef Empty BaseType; }; template class RecognizerType : public Empty { public: typedef Empty BaseType; }; typedef Empty TreeType; typedef Empty TreeAdaptorType; template 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 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 TraitsSelector { public: typedef A selected; }; template class TraitsSelector { public: typedef B selected; }; template class TraitsOneArgSelector { public: typedef A selected; }; template class TraitsOneArgSelector { public: typedef B selected; }; template class BoolSelector { public: typedef A selected; }; template class BoolSelector { public: typedef B selected; }; template< template class UserTraits > class TraitsBase { public: typedef TraitsBase TraitsType; typedef typename TraitsSelector< typename UserTraits::AllocPolicyType, DefaultAllocPolicy >::selected AllocPolicyType; typedef typename TraitsSelector< typename UserTraits::StringType, std::string >::selected StringType; typedef typename TraitsSelector< typename UserTraits::StringStreamType, std::stringstream >::selected StringStreamType; typedef typename TraitsSelector< typename UserTraits::StreamDataType, ANTLR_UINT8 >::selected StreamDataType; typedef typename TraitsSelector< typename UserTraits::Endianness, RESOLVE_ENDIAN_AT_RUNTIME >::selected Endianness; typedef typename TraitsSelector< typename UserTraits::BitsetType, Bitset >::selected BitsetType; typedef typename TraitsSelector< typename UserTraits::BitsetListType, BitsetList >::selected BitsetListType; typedef typename TraitsSelector< typename UserTraits::InputStreamType, InputStream >::selected InputStreamType; template class IntStreamType : public TraitsOneArgSelector< typename UserTraits::template IntStreamType, IntStream, typename UserTraits::template IntStreamType::BaseType >::selected { }; typedef typename TraitsSelector< typename UserTraits::LexStateType, LexState >::selected LexStateType; static const bool TOKENS_ACCESSED_FROM_OWNING_RULE = UserTraits::TOKENS_ACCESSED_FROM_OWNING_RULE; static const int TOKEN_FILL_BUFFER_INCREMENT = UserTraits::TOKEN_FILL_BUFFER_INCREMENT; //used only if the above val is true static void displayRecognitionError( const StringType& str ) { UserTraits::displayRecognitionError(str); } }; template< class LxrType, class PsrType, template class UserTraits = CustomTraitsBase, class TreePsrType = antlr3::Empty > class Traits : public TraitsBase { public: typedef Traits TraitsType; typedef TraitsBase BaseTraitsType; typedef typename TraitsSelector< typename UserTraits::CommonTokenType, CommonToken >::selected CommonTokenType; typedef typename TraitsSelector< typename UserTraits::TokenIntStreamType, TokenIntStream >::selected TokenIntStreamType; typedef typename TraitsSelector< typename UserTraits::TokenStreamType, CommonTokenStream >::selected TokenStreamType; typedef typename TraitsSelector< typename UserTraits::TreeNodeStreamType, CommonTreeNodeStream >::selected TreeNodeStreamType; typedef typename TraitsSelector< typename UserTraits::DebugEventListenerType, DebugEventListener >::selected DebugEventListenerType; template class RecognizerSharedStateType : public TraitsOneArgSelector< typename UserTraits::template RecognizerSharedStateType, RecognizerSharedState, typename UserTraits::template RecognizerSharedStateType::BaseType >::selected {}; template class RecognizerType : public TraitsOneArgSelector< typename UserTraits::template RecognizerType, BaseRecognizer, typename UserTraits::template RecognizerType::BaseType >::selected { public: typedef typename TraitsOneArgSelector< typename UserTraits::template RecognizerType, BaseRecognizer, typename UserTraits::template RecognizerType::BaseType >::selected BaseType; typedef typename BaseType::RecognizerSharedStateType RecognizerSharedStateType; public: RecognizerType(ANTLR_UINT32 sizeHint, RecognizerSharedStateType* state) : BaseType( sizeHint, state ) { } }; typedef typename TraitsSelector< typename UserTraits::TreeType, CommonTree >::selected TreeType; typedef typename TraitsSelector< typename UserTraits::TreeAdaptorType, CommonTreeAdaptor >::selected TreeAdaptorType; template class ExceptionBaseType : public TraitsOneArgSelector< typename UserTraits::template ExceptionBaseType, ANTLR_ExceptionBase, typename UserTraits::template ExceptionBaseType::BaseType >::selected { public: typedef typename TraitsOneArgSelector< typename UserTraits::template ExceptionBaseType, ANTLR_ExceptionBase, typename UserTraits::template ExceptionBaseType::BaseType >::selected BaseType; protected: ExceptionBaseType( const typename BaseTraitsType::StringType& message ) :BaseType(message) { } }; //this should be overridden with generated lexer typedef typename TraitsSelector< typename UserTraits::BaseLexerType, Lexer >::selected BaseLexerType; typedef LxrType LexerType; typedef typename TraitsSelector< typename UserTraits::TokenSourceType, TokenSource >::selected TokenSourceType; typedef typename TraitsSelector< typename UserTraits::BaseParserType, Parser >::selected BaseParserType; typedef PsrType ParserType; typedef typename TraitsSelector< typename UserTraits::BaseTreeParserType, TreeParser >::selected BaseTreeParserType; typedef TreePsrType TreeParserType; template class RewriteStreamType : public TraitsOneArgSelector< typename UserTraits::template RewriteStreamType, RewriteRuleElementStream, typename UserTraits::template RewriteStreamType::BaseType >::selected { public: typedef typename TraitsOneArgSelector< typename UserTraits::template RewriteStreamType, RewriteRuleElementStream, typename UserTraits::template RewriteStreamType::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::RuleReturnValueType, typename BoolSelector< TraitsType::TOKENS_ACCESSED_FROM_OWNING_RULE, RuleReturnValue_1, RuleReturnValue >::selected >::selected RuleReturnValueType; }; ANTLR_END_NAMESPACE() #endif //_ANTLR3_TRAITS_HPP