| #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 |