xref: /aosp_15_r20/external/antlr/runtime/Cpp/include/antlr3traits.hpp (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot #ifndef _ANTLR3_TRAITS_HPP
2*16467b97STreehugger Robot #define _ANTLR3_TRAITS_HPP
3*16467b97STreehugger Robot 
4*16467b97STreehugger Robot #include	"antlr3defs.hpp"
5*16467b97STreehugger Robot 
6*16467b97STreehugger Robot 
7*16467b97STreehugger Robot ANTLR_BEGIN_NAMESPACE()
8*16467b97STreehugger Robot 
9*16467b97STreehugger Robot //Users implementing overrides should inherit from this
10*16467b97STreehugger Robot template<class ImplTraits>
11*16467b97STreehugger Robot class CustomTraitsBase
12*16467b97STreehugger Robot {
13*16467b97STreehugger Robot public:
14*16467b97STreehugger Robot 	typedef Empty AllocPolicyType;
15*16467b97STreehugger Robot 	typedef Empty StringType;
16*16467b97STreehugger Robot 	typedef Empty StringStreamType;
17*16467b97STreehugger Robot 	typedef Empty StreamDataType;
18*16467b97STreehugger Robot 	typedef Empty Endianness;
19*16467b97STreehugger Robot 
20*16467b97STreehugger Robot 	//collections
21*16467b97STreehugger Robot 	typedef Empty BitsetType;
22*16467b97STreehugger Robot 	typedef Empty BitsetListType;
23*16467b97STreehugger Robot 
24*16467b97STreehugger Robot 	typedef Empty InputStreamType;
25*16467b97STreehugger Robot 
26*16467b97STreehugger Robot 	template<class StreamType>
27*16467b97STreehugger Robot 	class IntStreamType : public Empty
28*16467b97STreehugger Robot 	{
29*16467b97STreehugger Robot 	public:
30*16467b97STreehugger Robot 		typedef Empty BaseType;
31*16467b97STreehugger Robot 	};
32*16467b97STreehugger Robot 
33*16467b97STreehugger Robot 	typedef Empty LexStateType;
34*16467b97STreehugger Robot 
35*16467b97STreehugger Robot 	typedef Empty CommonTokenType;
36*16467b97STreehugger Robot 	typedef Empty TokenIntStreamType;
37*16467b97STreehugger Robot 
38*16467b97STreehugger Robot 	typedef Empty TokenStreamType;
39*16467b97STreehugger Robot 	typedef Empty TreeNodeStreamType;
40*16467b97STreehugger Robot 
41*16467b97STreehugger Robot 
42*16467b97STreehugger Robot 	typedef Empty DebugEventListenerType;
43*16467b97STreehugger Robot 	template<class StreamType>
44*16467b97STreehugger Robot 	class RecognizerSharedStateType : public Empty
45*16467b97STreehugger Robot 	{
46*16467b97STreehugger Robot 	public:
47*16467b97STreehugger Robot 		typedef Empty BaseType;
48*16467b97STreehugger Robot 	};
49*16467b97STreehugger Robot 
50*16467b97STreehugger Robot 	template<class StreamType>
51*16467b97STreehugger Robot 	class RecognizerType : public Empty
52*16467b97STreehugger Robot 	{
53*16467b97STreehugger Robot 	public:
54*16467b97STreehugger Robot 		typedef Empty BaseType;
55*16467b97STreehugger Robot 	};
56*16467b97STreehugger Robot 
57*16467b97STreehugger Robot 	typedef Empty TreeType;
58*16467b97STreehugger Robot 	typedef Empty TreeAdaptorType;
59*16467b97STreehugger Robot 
60*16467b97STreehugger Robot 	template<class StreamType>
61*16467b97STreehugger Robot 	class ExceptionBaseType : public Empty
62*16467b97STreehugger Robot 	{
63*16467b97STreehugger Robot 	public:
64*16467b97STreehugger Robot 		typedef Empty BaseType;
65*16467b97STreehugger Robot 	};
66*16467b97STreehugger Robot 
67*16467b97STreehugger Robot 	//this should be overridden with generated lexer
68*16467b97STreehugger Robot 	typedef Empty BaseLexerType;
69*16467b97STreehugger Robot 
70*16467b97STreehugger Robot 	typedef Empty TokenSourceType;
71*16467b97STreehugger Robot 	typedef Empty BaseParserType;//this should be overridden with generated lexer
72*16467b97STreehugger Robot 	typedef Empty BaseTreeParserType;
73*16467b97STreehugger Robot 
74*16467b97STreehugger Robot 	template<class StreamType>
75*16467b97STreehugger Robot 	class RewriteStreamType : public Empty
76*16467b97STreehugger Robot 	{
77*16467b97STreehugger Robot 	public:
78*16467b97STreehugger Robot 		typedef Empty BaseType;
79*16467b97STreehugger Robot 	};
80*16467b97STreehugger Robot 
81*16467b97STreehugger Robot 	typedef Empty  RuleReturnValueType;
82*16467b97STreehugger Robot 
83*16467b97STreehugger Robot 	//If we want to change the way tokens are stored
84*16467b97STreehugger Robot 	static const bool TOKENS_ACCESSED_FROM_OWNING_RULE = false;
85*16467b97STreehugger Robot 	static const int  TOKEN_FILL_BUFFER_INCREMENT = 100; //used only if the above val is true
86*16467b97STreehugger Robot 
displayRecognitionError(const std::string & str)87*16467b97STreehugger Robot 	static void displayRecognitionError( const std::string& str ) {  printf("%s", str.c_str() ); }
88*16467b97STreehugger Robot };
89*16467b97STreehugger Robot 
90*16467b97STreehugger Robot template<class A, class B>
91*16467b97STreehugger Robot class TraitsSelector
92*16467b97STreehugger Robot {
93*16467b97STreehugger Robot public:
94*16467b97STreehugger Robot 	typedef A selected;
95*16467b97STreehugger Robot };
96*16467b97STreehugger Robot 
97*16467b97STreehugger Robot template<class B>
98*16467b97STreehugger Robot class TraitsSelector<Empty, B>
99*16467b97STreehugger Robot {
100*16467b97STreehugger Robot public:
101*16467b97STreehugger Robot 	typedef B selected;
102*16467b97STreehugger Robot };
103*16467b97STreehugger Robot 
104*16467b97STreehugger Robot template<class A, class B, class C>
105*16467b97STreehugger Robot class TraitsOneArgSelector
106*16467b97STreehugger Robot {
107*16467b97STreehugger Robot public:
108*16467b97STreehugger Robot 	typedef A selected;
109*16467b97STreehugger Robot };
110*16467b97STreehugger Robot 
111*16467b97STreehugger Robot template<class A, class B>
112*16467b97STreehugger Robot class TraitsOneArgSelector<A,B,Empty>
113*16467b97STreehugger Robot {
114*16467b97STreehugger Robot public:
115*16467b97STreehugger Robot 	typedef B selected;
116*16467b97STreehugger Robot };
117*16467b97STreehugger Robot 
118*16467b97STreehugger Robot template<bool v, class A, class B>
119*16467b97STreehugger Robot class BoolSelector
120*16467b97STreehugger Robot {
121*16467b97STreehugger Robot public:
122*16467b97STreehugger Robot 	typedef A selected;
123*16467b97STreehugger Robot };
124*16467b97STreehugger Robot 
125*16467b97STreehugger Robot template<class A, class B>
126*16467b97STreehugger Robot class BoolSelector<false, A, B>
127*16467b97STreehugger Robot {
128*16467b97STreehugger Robot public:
129*16467b97STreehugger Robot 	typedef B selected;
130*16467b97STreehugger Robot };
131*16467b97STreehugger Robot 
132*16467b97STreehugger Robot template< template<class ImplTraits> class UserTraits >
133*16467b97STreehugger Robot class TraitsBase
134*16467b97STreehugger Robot {
135*16467b97STreehugger Robot public:
136*16467b97STreehugger Robot 	typedef TraitsBase  TraitsType;
137*16467b97STreehugger Robot 
138*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::AllocPolicyType, DefaultAllocPolicy >::selected  AllocPolicyType;
139*16467b97STreehugger Robot 
140*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::StringType,
141*16467b97STreehugger Robot 									std::string >::selected StringType;
142*16467b97STreehugger Robot 
143*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::StringStreamType,
144*16467b97STreehugger Robot 		                             std::stringstream >::selected StringStreamType;
145*16467b97STreehugger Robot 
146*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::StreamDataType,
147*16467b97STreehugger Robot 		                             ANTLR_UINT8 >::selected StreamDataType;
148*16467b97STreehugger Robot 
149*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::Endianness,
150*16467b97STreehugger Robot 									 RESOLVE_ENDIAN_AT_RUNTIME >::selected Endianness;
151*16467b97STreehugger Robot 
152*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::BitsetType,
153*16467b97STreehugger Robot 		                             Bitset<TraitsType> >::selected BitsetType;
154*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::BitsetListType,
155*16467b97STreehugger Robot 		                             BitsetList<TraitsType> >::selected BitsetListType;
156*16467b97STreehugger Robot 
157*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::InputStreamType,
158*16467b97STreehugger Robot 		                              InputStream<TraitsType> >::selected InputStreamType;
159*16467b97STreehugger Robot 
160*16467b97STreehugger Robot 	template<class SuperType>
161*16467b97STreehugger Robot 	class IntStreamType
162*16467b97STreehugger Robot 		: public TraitsOneArgSelector<
163*16467b97STreehugger Robot 					typename UserTraits<TraitsType>::template IntStreamType<SuperType>,
164*16467b97STreehugger Robot 		            IntStream<TraitsType, SuperType>,
165*16467b97STreehugger Robot 					typename UserTraits<TraitsType>::template IntStreamType<SuperType>::BaseType
166*16467b97STreehugger Robot 								>::selected
167*16467b97STreehugger Robot 	{ };
168*16467b97STreehugger Robot 
169*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::LexStateType,
170*16467b97STreehugger Robot 		                             LexState<TraitsType> >::selected LexStateType;
171*16467b97STreehugger Robot 
172*16467b97STreehugger Robot 	static const bool TOKENS_ACCESSED_FROM_OWNING_RULE = UserTraits<TraitsType>::TOKENS_ACCESSED_FROM_OWNING_RULE;
173*16467b97STreehugger Robot 	static const int  TOKEN_FILL_BUFFER_INCREMENT = UserTraits<TraitsType>::TOKEN_FILL_BUFFER_INCREMENT; //used only if the above val is true
174*16467b97STreehugger Robot 
displayRecognitionError(const StringType & str)175*16467b97STreehugger Robot 	static void displayRecognitionError( const StringType& str ) { UserTraits<TraitsType>::displayRecognitionError(str);  }
176*16467b97STreehugger Robot };
177*16467b97STreehugger Robot 
178*16467b97STreehugger Robot template<
179*16467b97STreehugger Robot 	     class LxrType,
180*16467b97STreehugger Robot          class PsrType,
181*16467b97STreehugger Robot 		 template<class ImplTraits> class UserTraits = CustomTraitsBase,
182*16467b97STreehugger Robot 		 class TreePsrType = antlr3::Empty
183*16467b97STreehugger Robot          >
184*16467b97STreehugger Robot class Traits  : public TraitsBase<UserTraits>
185*16467b97STreehugger Robot {
186*16467b97STreehugger Robot public:
187*16467b97STreehugger Robot 	typedef Traits TraitsType;
188*16467b97STreehugger Robot 	typedef TraitsBase<UserTraits> BaseTraitsType;
189*16467b97STreehugger Robot 
190*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::CommonTokenType,
191*16467b97STreehugger Robot 									 CommonToken<TraitsType> >::selected CommonTokenType;
192*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::TokenIntStreamType,
193*16467b97STreehugger Robot 		                             TokenIntStream<TraitsType> >::selected TokenIntStreamType;
194*16467b97STreehugger Robot 
195*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::TokenStreamType,
196*16467b97STreehugger Robot 									CommonTokenStream<TraitsType> >::selected TokenStreamType;
197*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeNodeStreamType,
198*16467b97STreehugger Robot 		                            CommonTreeNodeStream<TraitsType> >::selected TreeNodeStreamType;
199*16467b97STreehugger Robot 
200*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::DebugEventListenerType,
201*16467b97STreehugger Robot 		                            DebugEventListener<TraitsType> >::selected DebugEventListenerType;
202*16467b97STreehugger Robot 
203*16467b97STreehugger Robot 	template<class StreamType>
204*16467b97STreehugger Robot 	class  RecognizerSharedStateType
205*16467b97STreehugger Robot 		          : public TraitsOneArgSelector<
206*16467b97STreehugger Robot 							typename UserTraits<TraitsType>::template RecognizerSharedStateType<StreamType>,
207*16467b97STreehugger Robot 							RecognizerSharedState<TraitsType, StreamType>,
208*16467b97STreehugger Robot 							typename UserTraits<TraitsType>::template RecognizerSharedStateType<StreamType>::BaseType
209*16467b97STreehugger Robot 										>::selected
210*16467b97STreehugger Robot 	{};
211*16467b97STreehugger Robot 
212*16467b97STreehugger Robot 	template<class StreamType>
213*16467b97STreehugger Robot 	class  RecognizerType
214*16467b97STreehugger Robot 				   : public TraitsOneArgSelector<
215*16467b97STreehugger Robot 				             typename UserTraits<TraitsType>::template RecognizerType<StreamType>,
216*16467b97STreehugger Robot 							 BaseRecognizer<TraitsType, StreamType>,
217*16467b97STreehugger Robot 							 typename UserTraits<TraitsType>::template RecognizerType<StreamType>::BaseType
218*16467b97STreehugger Robot 									>::selected
219*16467b97STreehugger Robot 	{
220*16467b97STreehugger Robot 	public:
221*16467b97STreehugger Robot 		typedef typename TraitsOneArgSelector<
222*16467b97STreehugger Robot 							typename UserTraits<TraitsType>::template RecognizerType<StreamType>,
223*16467b97STreehugger Robot 							BaseRecognizer<TraitsType, StreamType>,
224*16467b97STreehugger Robot 							typename UserTraits<TraitsType>::template RecognizerType<StreamType>::BaseType
225*16467b97STreehugger Robot 										>::selected  BaseType;
226*16467b97STreehugger Robot 		typedef typename BaseType::RecognizerSharedStateType RecognizerSharedStateType;
227*16467b97STreehugger Robot 
228*16467b97STreehugger Robot 	public:
RecognizerType(ANTLR_UINT32 sizeHint,RecognizerSharedStateType * state)229*16467b97STreehugger Robot 		RecognizerType(ANTLR_UINT32 sizeHint, RecognizerSharedStateType* state)
230*16467b97STreehugger Robot 			: BaseType( sizeHint, state )
231*16467b97STreehugger Robot 		{
232*16467b97STreehugger Robot 		}
233*16467b97STreehugger Robot 	};
234*16467b97STreehugger Robot 
235*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeType,
236*16467b97STreehugger Robot 										CommonTree<TraitsType> >::selected TreeType;
237*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeAdaptorType,
238*16467b97STreehugger Robot 										CommonTreeAdaptor<TraitsType> >::selected TreeAdaptorType;
239*16467b97STreehugger Robot 
240*16467b97STreehugger Robot 	template<class StreamType>
241*16467b97STreehugger Robot 	class ExceptionBaseType : public TraitsOneArgSelector<
242*16467b97STreehugger Robot 								typename UserTraits<TraitsType>::template ExceptionBaseType<StreamType>,
243*16467b97STreehugger Robot 								ANTLR_ExceptionBase<TraitsType, StreamType>,
244*16467b97STreehugger Robot 								typename UserTraits<TraitsType>::template ExceptionBaseType<StreamType>::BaseType
245*16467b97STreehugger Robot 													>::selected
246*16467b97STreehugger Robot 	{
247*16467b97STreehugger Robot 	public:
248*16467b97STreehugger Robot 		typedef typename TraitsOneArgSelector<
249*16467b97STreehugger Robot 			                    typename UserTraits<TraitsType>::template ExceptionBaseType<StreamType>,
250*16467b97STreehugger Robot 								ANTLR_ExceptionBase<TraitsType, StreamType>,
251*16467b97STreehugger Robot 								typename UserTraits<TraitsType>::template ExceptionBaseType<StreamType>::BaseType
252*16467b97STreehugger Robot 							>::selected BaseType;
253*16467b97STreehugger Robot 
254*16467b97STreehugger Robot 	protected:
ExceptionBaseType(const typename BaseTraitsType::StringType & message)255*16467b97STreehugger Robot 		ExceptionBaseType( const typename BaseTraitsType::StringType& message )
256*16467b97STreehugger Robot 			:BaseType(message)
257*16467b97STreehugger Robot 		{
258*16467b97STreehugger Robot 		}
259*16467b97STreehugger Robot 	};
260*16467b97STreehugger Robot 
261*16467b97STreehugger Robot 	//this should be overridden with generated lexer
262*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::BaseLexerType,
263*16467b97STreehugger Robot 											Lexer<TraitsType> >::selected BaseLexerType;
264*16467b97STreehugger Robot 	typedef LxrType LexerType;
265*16467b97STreehugger Robot 
266*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::TokenSourceType,
267*16467b97STreehugger Robot 											TokenSource<TraitsType> >::selected TokenSourceType;
268*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::BaseParserType,
269*16467b97STreehugger Robot 											Parser<TraitsType> >::selected BaseParserType;
270*16467b97STreehugger Robot 
271*16467b97STreehugger Robot 	typedef PsrType ParserType;
272*16467b97STreehugger Robot 
273*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::BaseTreeParserType,
274*16467b97STreehugger Robot 											 TreeParser<TraitsType> >::selected BaseTreeParserType;
275*16467b97STreehugger Robot 	typedef TreePsrType TreeParserType;
276*16467b97STreehugger Robot 
277*16467b97STreehugger Robot 	template<class SuperType>
278*16467b97STreehugger Robot 	class RewriteStreamType : public TraitsOneArgSelector<
279*16467b97STreehugger Robot 								typename UserTraits<TraitsType>::template RewriteStreamType<SuperType>,
280*16467b97STreehugger Robot 								RewriteRuleElementStream<TraitsType, SuperType>,
281*16467b97STreehugger Robot 								typename UserTraits<TraitsType>::template RewriteStreamType<SuperType>::BaseType
282*16467b97STreehugger Robot 													>::selected
283*16467b97STreehugger Robot 	{
284*16467b97STreehugger Robot 	public:
285*16467b97STreehugger Robot 		typedef typename TraitsOneArgSelector<
286*16467b97STreehugger Robot 				typename UserTraits<TraitsType>::template RewriteStreamType<SuperType>,
287*16467b97STreehugger Robot 				RewriteRuleElementStream<TraitsType, SuperType>,
288*16467b97STreehugger Robot 				typename UserTraits<TraitsType>::template RewriteStreamType<SuperType>::BaseType
289*16467b97STreehugger Robot 						>::selected BaseType;
290*16467b97STreehugger Robot 
291*16467b97STreehugger Robot 		typedef typename SuperType::StreamType StreamType;
292*16467b97STreehugger Robot 		typedef typename BaseType::RecognizerType Recognizer_Type;
293*16467b97STreehugger Robot 		typedef typename BaseType::TokenType TokenType;
294*16467b97STreehugger Robot 		typedef typename BaseType::ElementsType ElementsType;
295*16467b97STreehugger Robot 
296*16467b97STreehugger Robot 	public:
RewriteStreamType(TreeAdaptorType * adaptor=NULL,Recognizer_Type * rec=NULL,ANTLR_UINT8 * description=NULL)297*16467b97STreehugger Robot 		RewriteStreamType(TreeAdaptorType* adaptor = NULL, Recognizer_Type* rec=NULL, ANTLR_UINT8* description = NULL)
298*16467b97STreehugger Robot 			:BaseType(adaptor, rec, description)
299*16467b97STreehugger Robot 		{
300*16467b97STreehugger Robot 		}
RewriteStreamType(TreeAdaptorType * adaptor,Recognizer_Type * rec,ANTLR_UINT8 * description,TokenType * oneElement)301*16467b97STreehugger Robot 		RewriteStreamType(TreeAdaptorType* adaptor, Recognizer_Type* rec, ANTLR_UINT8* description, TokenType* oneElement)
302*16467b97STreehugger Robot 			:BaseType(adaptor, rec, description, oneElement)
303*16467b97STreehugger Robot 		{
304*16467b97STreehugger Robot 		}
RewriteStreamType(TreeAdaptorType * adaptor,Recognizer_Type * rec,ANTLR_UINT8 * description,const ElementsType & elements)305*16467b97STreehugger Robot 		RewriteStreamType(TreeAdaptorType* adaptor, Recognizer_Type* rec, ANTLR_UINT8* description, const ElementsType& elements)
306*16467b97STreehugger Robot 			:BaseType(adaptor, rec, description, elements)
307*16467b97STreehugger Robot 		{
308*16467b97STreehugger Robot 		}
309*16467b97STreehugger Robot 	};
310*16467b97STreehugger Robot 
311*16467b97STreehugger Robot 	typedef typename TraitsSelector< typename UserTraits<TraitsType>::RuleReturnValueType,
312*16467b97STreehugger Robot 										typename BoolSelector< TraitsType::TOKENS_ACCESSED_FROM_OWNING_RULE,
313*16467b97STreehugger Robot 														RuleReturnValue_1<TraitsType>, RuleReturnValue<TraitsType> >::selected
314*16467b97STreehugger Robot 								   >::selected RuleReturnValueType;
315*16467b97STreehugger Robot };
316*16467b97STreehugger Robot 
317*16467b97STreehugger Robot 
318*16467b97STreehugger Robot ANTLR_END_NAMESPACE()
319*16467b97STreehugger Robot 
320*16467b97STreehugger Robot #endif //_ANTLR3_TRAITS_HPP
321