summaryrefslogtreecommitdiffstats
path: root/contrib/libs/antlr3_cpp_runtime/include/antlr3traits.hpp
diff options
context:
space:
mode:
authorDevtools Arcadia <[email protected]>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <[email protected]>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/antlr3_cpp_runtime/include/antlr3traits.hpp
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/antlr3_cpp_runtime/include/antlr3traits.hpp')
-rw-r--r--contrib/libs/antlr3_cpp_runtime/include/antlr3traits.hpp377
1 files changed, 377 insertions, 0 deletions
diff --git a/contrib/libs/antlr3_cpp_runtime/include/antlr3traits.hpp b/contrib/libs/antlr3_cpp_runtime/include/antlr3traits.hpp
new file mode 100644
index 00000000000..c5741ce9857
--- /dev/null
+++ b/contrib/libs/antlr3_cpp_runtime/include/antlr3traits.hpp
@@ -0,0 +1,377 @@
+#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