123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 |
- #ifndef _ANTLR3_TRAITS_HPP
- #define _ANTLR3_TRAITS_HPP
- namespace antlr3 {
- /**
- * Users implementing overrides should inherit from this
- *
- * All classes typenames reffer to Empty class
- */
- 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 TokenUserDataType;
- typedef Empty TokenIntStreamType;
- typedef Empty TokenStreamType;
- typedef Empty TreeNodeIntStreamType;
- 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 TreeUserDataType;
- typedef Empty TreeAdaptorType;
- typedef Empty TreeStoreType;
-
- 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 ElementType>
- 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 unsigned 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() ); }
- };
- /**
- * Traits manipulation classes
- */
- 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;
- };
- /**
- * Base traits template
- *
- * This class contains default typenames for every trait
- */
- 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 unsigned 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); }
- };
- /**
- * Final traits
- *
- * They combine Traits and user provided traits(UserTraits)
- */
- template< class LxrType,
- class PsrType,
- template<class ImplTraits> class UserTraits = CustomTraitsBase
- //,
- //class TreePsrType = antlr3::Empty
- //template<class ImplTraits> class TreePsrType = TreeParser
- >
- class Traits : public TraitsBase<UserTraits>
- {
- public:
- typedef Traits TraitsType;
- typedef TraitsBase<UserTraits> BaseTraitsType;
- // CommonTokenType
- typedef typename TraitsSelector< typename UserTraits<TraitsType>::CommonTokenType,
- CommonToken<TraitsType> >::selected CommonTokenType;
- // TokenUserDataType
- typedef typename TraitsSelector< typename UserTraits<TraitsType>::TokenUserDataType,
- Empty >::selected TokenUserDataType;
- // TokenListType
- typedef typename BaseTraitsType::AllocPolicyType::template ListType<const CommonTokenType*> TokenListType;
- // TokenIntStreamType
- typedef typename TraitsSelector< typename UserTraits<TraitsType>::TokenIntStreamType,
- TokenIntStream<TraitsType> >::selected TokenIntStreamType;
- // TokenStreamType
- typedef typename TraitsSelector< typename UserTraits<TraitsType>::TokenStreamType,
- CommonTokenStream<TraitsType> >::selected TokenStreamType;
- // TreeNodeIntStreamType
- typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeNodeIntStreamType,
- TreeNodeIntStream<TraitsType> >::selected TreeNodeIntStreamType;
- // TreeNodeStreamType
- typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeNodeStreamType,
- CommonTreeNodeStream<TraitsType> >::selected TreeNodeStreamType;
- // DebugEventListenerType
- typedef typename TraitsSelector< typename UserTraits<TraitsType>::DebugEventListenerType,
- DebugEventListener<TraitsType> >::selected DebugEventListenerType;
- // RecognizerSharedStateType
- template<class StreamType>
- class RecognizerSharedStateType : public TraitsOneArgSelector< typename UserTraits<TraitsType>::template RecognizerSharedStateType<StreamType>,
- RecognizerSharedState<TraitsType, StreamType>,
- typename UserTraits<TraitsType>::template RecognizerSharedStateType<StreamType>::BaseType
- >::selected
- {};
- // RecognizerType
- 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 )
- {
- }
- };
- // TreeType
- typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeType,
- CommonTree<TraitsType> >::selected TreeType;
- typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeUserDataType,
- Empty >::selected TreeUserDataType;
- // TreeAdaptorType
- typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeAdaptorType,
- CommonTreeAdaptor<TraitsType> >::selected TreeAdaptorType;
- typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeStoreType,
- CommonTreeStore<TraitsType> >::selected TreeStoreType;
- typedef typename TreeStoreType::TreeTypePtr TreeTypePtr;
- //typedef std::unique_ptr<TreeType, ResourcePoolManager<ImplTraits>> TreeTypePtr;
- // ExceptionBaseType
- 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
- // BaseLexerType
- typedef typename TraitsSelector< typename UserTraits<TraitsType>::BaseLexerType,
- Lexer<TraitsType> >::selected BaseLexerType;
- typedef LxrType LexerType;
- // TokenSourceType
- typedef typename TraitsSelector< typename UserTraits<TraitsType>::TokenSourceType,
- TokenSource<TraitsType> >::selected TokenSourceType;
- // this should be overridden with generated parser
- // BaseParserType
- typedef typename TraitsSelector< typename UserTraits<TraitsType>::BaseParserType,
- Parser<TraitsType> >::selected BaseParserType;
- typedef PsrType ParserType;
- // this should be overridden with generated treeparser (not implemented yet)
- // BaseTreeParserType
- typedef typename TraitsSelector< typename UserTraits<TraitsType>::BaseTreeParserType,
- TreeParser<TraitsType> >::selected BaseTreeParserType;
- //typedef TreePsrType<Traits> TreeParserType;
- typedef BaseTreeParserType TreeParserType;
- // RewriteStreamType
- template<class ElementType>
- class RewriteStreamType : public TraitsOneArgSelector< typename UserTraits<TraitsType>::template RewriteStreamType<ElementType>,
- RewriteRuleElementStream<TraitsType, ElementType>,
- typename UserTraits<TraitsType>::template RewriteStreamType<ElementType>::BaseType
- >::selected
- {
- public:
- typedef typename TraitsOneArgSelector< typename UserTraits<TraitsType>::template RewriteStreamType<ElementType>,
- RewriteRuleElementStream<TraitsType, ElementType>,
- typename UserTraits<TraitsType>::template RewriteStreamType<ElementType>::BaseType
- >::selected BaseType;
- //typedef typename SuperType::StreamType StreamType;
- //typedef typename BaseType::RecognizerType Recognizer_Type;
- //typedef typename BaseType::ElementType ElementType;
- typedef typename BaseType::ElementsType ElementsType;
- public:
- RewriteStreamType(TreeAdaptorType* adaptor = NULL, const char* description = NULL)
- :BaseType(adaptor, description)
- {
- }
- RewriteStreamType(TreeAdaptorType* adaptor, const char* description, ElementType* oneElement)
- :BaseType(adaptor, description, oneElement)
- {
- }
- RewriteStreamType(TreeAdaptorType* adaptor, const char* description, const ElementsType& elements)
- :BaseType(adaptor, description, elements)
- {
- }
- };
- // RuleReturnValueType
- typedef typename TraitsSelector< typename UserTraits<TraitsType>::RuleReturnValueType,
- typename BoolSelector< TraitsType::TOKENS_ACCESSED_FROM_OWNING_RULE,
- RuleReturnValue_1<TraitsType>,
- RuleReturnValue<TraitsType>
- >::selected
- >::selected RuleReturnValueType;
- };
- }
- #endif //_ANTLR3_TRAITS_HPP
|