xref: /aosp_15_r20/external/antlr/runtime/Cpp/include/antlr3commontoken.hpp (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1 /** \file
2  * \brief Defines the interface for a common token.
3  *
4  * All token streams should provide their tokens using an instance
5  * of this common token. A custom pointer is provided, wher you may attach
6  * a further structure to enhance the common token if you feel the need
7  * to do so. The C runtime will assume that a token provides implementations
8  * of the interface functions, but all of them may be rplaced by your own
9  * implementation if you require it.
10  */
11 #ifndef	_ANTLR3_COMMON_TOKEN_HPP
12 #define	_ANTLR3_COMMON_TOKEN_HPP
13 
14 // [The "BSD licence"]
15 // Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
16 
17 //
18 // All rights reserved.
19 //
20 // Redistribution and use in source and binary forms, with or without
21 // modification, are permitted provided that the following conditions
22 // are met:
23 // 1. Redistributions of source code must retain the above copyright
24 //    notice, this list of conditions and the following disclaimer.
25 // 2. Redistributions in binary form must reproduce the above copyright
26 //    notice, this list of conditions and the following disclaimer in the
27 //    documentation and/or other materials provided with the distribution.
28 // 3. The name of the author may not be used to endorse or promote products
29 //    derived from this software without specific prior written permission.
30 //
31 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
32 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
33 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
34 // IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
35 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
36 // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
37 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
38 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
39 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
40 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41 
42 #include    <stdlib.h>
43 
44 #include    "antlr3defs.hpp"
45 
46 ANTLR_BEGIN_NAMESPACE()
47 
48 /** The definition of an ANTLR3 common token structure, which all implementations
49  * of a token stream should provide, installing any further structures in the
50  * custom pointer element of this structure.
51  *
52  * \remark
53  * Token streams are in essence provided by lexers or other programs that serve
54  * as lexers.
55  */
56 
57 template<class ImplTraits>
58 class CommonToken : public ImplTraits::AllocPolicyType
59 {
60 public:
61 	/* Base token types, which all lexer/parser tokens come after in sequence.
62 	*/
63 	enum TOKEN_TYPE
64 	{
65 		/** Indicator of an invalid token
66 		 */
67 		TOKEN_INVALID =	0
68 		, EOR_TOKEN_TYPE
69 		/** Imaginary token type to cause a traversal of child nodes in a tree parser
70 		 */
71 		, TOKEN_DOWN
72 		/** Imaginary token type to signal the end of a stream of child nodes.
73 		 */
74 		, TOKEN_UP
75 		/** First token that can be used by users/generated code
76 		 */
77 		, MIN_TOKEN_TYPE =	TOKEN_UP + 1
78 
79 		/** End of file token
80 		 */
81 		, TOKEN_EOF =	(ANTLR_CHARSTREAM_EOF & 0xFFFFFFFF)
82 	};
83 
84 	typedef typename ImplTraits::TokenIntStreamType TokenIntStreamType;
85 	typedef typename ImplTraits::StringType StringType;
86 	typedef typename ImplTraits::InputStreamType InputStreamType;
87 	typedef typename ImplTraits::StreamDataType StreamDataType;
88 
89 private:
90     /** The actual type of this token
91      */
92     ANTLR_UINT32   m_type;
93 
94 	/** The virtual channel that this token exists in.
95      */
96     ANTLR_UINT32	m_channel;
97 
98 	mutable StringType		m_tokText;
99 
100     /** The offset into the input stream that the line in which this
101      *  token resides starts.
102      */
103 	const StreamDataType*	m_lineStart;
104 
105 	/** The line number in the input stream where this token was derived from
106      */
107     ANTLR_UINT32	m_line;
108 
109     /** The character position in the line that this token was derived from
110      */
111     ANTLR_INT32		m_charPositionInLine;
112 
113     /** Pointer to the input stream that this token originated in.
114      */
115     InputStreamType*    m_input;
116 
117     /** What the index of this token is, 0, 1, .., n-2, n-1 tokens
118      */
119     ANTLR_MARKER		m_index;
120 
121     /** The character offset in the input stream where the text for this token
122      *  starts.
123      */
124     ANTLR_MARKER		m_startIndex;
125 
126     /** The character offset in the input stream where the text for this token
127      *  stops.
128      */
129     ANTLR_MARKER		m_stopIndex;
130 
131 public:
132 	CommonToken();
133 	CommonToken(ANTLR_UINT32 type);
134 	CommonToken(TOKEN_TYPE type);
135 	CommonToken( const CommonToken& ctoken );
136 
137 	CommonToken& operator=( const CommonToken& ctoken );
138 	bool operator==( const CommonToken& ctoken ) const;
139 	bool operator<( const CommonToken& ctoken ) const;
140 
141 	InputStreamType* get_input() const;
142 	ANTLR_MARKER get_index() const;
143 	void set_index( ANTLR_MARKER index );
144 	void set_input( InputStreamType* input );
145 
146     /* ==============================
147      * API
148      */
149 
150     /** Function that returns the text pointer of a token, use
151      *  toString() if you want a pANTLR3_STRING version of the token.
152      */
153     StringType  getText() const;
154 
155     /** Pointer to a function that 'might' be able to set the text associated
156      *  with a token. Imaginary tokens such as an ANTLR3_CLASSIC_TOKEN may actually
157      *  do this, however many tokens such as ANTLR3_COMMON_TOKEN do not actaully have
158      *  strings associated with them but just point into the current input stream. These
159      *  tokens will implement this function with a function that errors out (probably
160      *  drastically.
161      */
162     void set_tokText( const StringType& text );
163 
164     /** Pointer to a function that 'might' be able to set the text associated
165      *  with a token. Imaginary tokens such as an ANTLR3_CLASSIC_TOKEN may actually
166      *  do this, however many tokens such as ANTLR3_COMMON_TOKEN do not actully have
167      *  strings associated with them but just point into the current input stream. These
168      *  tokens will implement this function with a function that errors out (probably
169      *  drastically.
170      */
171     void	setText(ANTLR_UINT8* text);
172 	void	setText(const char* text);
173 
174     /** Pointer to a function that returns the token type of this token
175      */
176     ANTLR_UINT32  get_type() const;
177 	ANTLR_UINT32  getType() const;
178 
179     /** Pointer to a function that sets the type of this token
180      */
181     void	set_type(ANTLR_UINT32 ttype);
182 
183     /** Pointer to a function that gets the 'line' number where this token resides
184      */
185     ANTLR_UINT32   get_line() const;
186 
187     /** Pointer to a function that sets the 'line' number where this token reside
188      */
189     void set_line(ANTLR_UINT32 line);
190 
191     /** Pointer to a function that gets the offset in the line where this token exists
192      */
193     ANTLR_INT32  get_charPositionInLine() const;
194 	ANTLR_INT32  getCharPositionInLine() const;
195 
196     /** Pointer to a function that sets the offset in the line where this token exists
197      */
198     void	set_charPositionInLine(ANTLR_INT32 pos);
199 
200     /** Pointer to a function that gets the channel that this token was placed in (parsers
201      *  can 'tune' to these channels.
202      */
203     ANTLR_UINT32   get_channel() const;
204 
205     /** Pointer to a function that sets the channel that this token should belong to
206      */
207     void set_channel(ANTLR_UINT32 channel);
208 
209     /** Pointer to a function that returns an index 0...n-1 of the token in the token
210      *  input stream.
211      */
212     ANTLR_MARKER  get_tokenIndex() const;
213 
214     /** Pointer to a function that can set the token index of this token in the token
215      *  input stream.
216      */
217     void	set_tokenIndex(ANTLR_MARKER tokenIndex);
218 
219     /** Pointer to a function that gets the start index in the input stream for this token.
220      */
221     ANTLR_MARKER   get_startIndex() const;
222 
223     /** Pointer to a function that sets the start index in the input stream for this token.
224      */
225     void	set_startIndex(ANTLR_MARKER index);
226 
227     /** Pointer to a function that gets the stop index in the input stream for this token.
228      */
229     ANTLR_MARKER  get_stopIndex() const;
230 
231     /** Pointer to a function that sets the stop index in the input stream for this token.
232      */
233     void	set_stopIndex(ANTLR_MARKER index);
234 	const StreamDataType* get_lineStart() const;
235 	void	set_lineStart( const StreamDataType* lineStart );
236 
237     /** Pointer to a function that returns this token as a text representation that can be
238      *  printed with embedded control codes such as \n replaced with the printable sequence "\\n"
239      *  This also yields a string structure that can be used more easily than the pointer to
240      *  the input stream in certain situations.
241      */
242     StringType  toString() const;
243 
244 };
245 
246 ANTLR_END_NAMESPACE()
247 
248 #include "antlr3commontoken.inl"
249 
250 #endif
251