• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** \file
2  *  Contains the definition of a basic ANTLR3 exception structure created
3  *  by a recognizer when errors are found/predicted.
4 
5  * Two things to be noted for C++ Target:
6    a) This is not the C++ Exception. Consider this just as yet another class. This
7    has to be like this because there is a inbuilt recovery and hence there is a try..catch
8    block for every new token. This is not how C++ Exceptions work.Still there is exception support, as we are handling things like OutofMemory by
9    throwing exceptions
10 
11    b) There is no use in implementing templates here, as all the exceptions are grouped in
12    one container and hence needs virtual functions. But this would occur only when there is
13    a exception/ while deleting base recognizer. So shouldn't incur the overhead in normal operation
14  */
15 #ifndef	_ANTLR3_EXCEPTION_HPP
16 #define	_ANTLR3_EXCEPTION_HPP
17 
18 // [The "BSD licence"]
19 // Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
20 
21 //
22 // All rights reserved.
23 //
24 // Redistribution and use in source and binary forms, with or without
25 // modification, are permitted provided that the following conditions
26 // are met:
27 // 1. Redistributions of source code must retain the above copyright
28 //    notice, this list of conditions and the following disclaimer.
29 // 2. Redistributions in binary form must reproduce the above copyright
30 //    notice, this list of conditions and the following disclaimer in the
31 //    documentation and/or other materials provided with the distribution.
32 // 3. The name of the author may not be used to endorse or promote products
33 //    derived from this software without specific prior written permission.
34 //
35 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
36 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
38 // IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
39 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
40 // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
41 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
42 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
43 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
44 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45 
46 #include    "antlr3defs.hpp"
47 
48 ANTLR_BEGIN_NAMESPACE()
49 
50 /** Base structure for an ANTLR3 exception tracker
51  */
52 
53 template<class ImplTraits, class StreamType>
54 class ANTLR_ExceptionBase
55 {
56 public:
57 	typedef typename StreamType::UnitType TokenType;
58 	typedef typename StreamType::IntStreamType IntStreamType;
59 	typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
60 	typedef typename ImplTraits::StringType StringType;
61 	typedef typename ImplTraits::StringStreamType StringStreamType;
62 	typedef typename ImplTraits::BitsetType BitsetType;
63 	typedef typename ImplTraits::BitsetListType BitsetListType;
64 	typedef typename ImplTraits::template ExceptionBaseType<StreamType> ExceptionBaseType;
65 
66 protected:
67     /** The printable message that goes with this exception, in your preferred
68      *  encoding format. ANTLR just uses ASCII by default but you can ignore these
69      *  messages or convert them to another format or whatever of course. They are
70      *  really internal messages that you then decide how to print out in a form that
71      *  the users of your product will understand, as they are unlikely to know what
72      *  to do with "Recognition exception at: [[TOK_GERUND..... " ;-)
73      */
74     StringType		m_message;
75 
76     /** Name of the file/input source for reporting. Note that this may be empty!!
77      */
78     StringType		m_streamName;
79 
80     /** Indicates the index of the 'token' we were looking at when the
81      *  exception occurred.
82      */
83     ANTLR_MARKER	m_index;
84 
85     /** Indicates what the current token/tree was when the error occurred. Since not
86      *  all input streams will be able to retrieve the nth token, we track it here
87      *  instead. This is for parsers, and even tree parsers may set this.
88      */
89     const TokenType*		m_token;
90 
91     /** Pointer to the next exception in the chain (if any)
92      */
93     ExceptionBaseType*  m_nextException;
94 
95     /** Indicates the token we were expecting to see next when the error occurred
96      */
97     ANTLR_UINT32	m_expecting;
98 
99     /** Indicates a set of tokens that we were expecting to see one of when the
100      *  error occurred. It is a following bitset list, so you can use load it and use ->toIntList() on it
101      *  to generate an array of integer tokens that it represents.
102      */
103     BitsetListType*	m_expectingSet;
104 
105     /** If this is a tree parser exception then the node is set to point to the node
106      * that caused the issue.
107      */
108     TokenType*		m_node;
109 
110     /** The current character when an error occurred - for lexers.
111      */
112     ANTLR_UCHAR		m_c;
113 
114     /** Track the line at which the error occurred in case this is
115      *  generated from a lexer.  We need to track this since the
116      *  unexpected char doesn't carry the line info.
117      */
118     ANTLR_UINT32   	m_line;
119 
120     /** Character position in the line where the error occurred.
121      */
122     ANTLR_INT32   	m_charPositionInLine;
123 
124     /** decision number for NVE
125      */
126     ANTLR_UINT32   	m_decisionNum;
127 
128     /** State for NVE
129      */
130     ANTLR_UINT32	m_state;
131 
132     /** Rule name for failed predicate exception
133      */
134     StringType		m_ruleName;
135 
136     /** Pointer to the input stream that this exception occurred in.
137      */
138     IntStreamType* 	m_input;
139 
140 public:
141 	StringType& get_message();
142 	StringType& get_streamName();
143 	ANTLR_MARKER get_index() const;
144 	const TokenType* get_token() const;
145 	ExceptionBaseType* get_nextException() const;
146 	ANTLR_UINT32 get_expecting() const;
147 	BitsetListType* get_expectingSet() const;
148 	TokenType* get_node() const;
149 	ANTLR_UCHAR get_c() const;
150 	ANTLR_UINT32 get_line() const;
151 	ANTLR_INT32 get_charPositionInLine() const;
152 	ANTLR_UINT32 get_decisionNum() const;
153 	ANTLR_UINT32 get_state() const;
154 	StringType& get_ruleName();
155 	IntStreamType* get_input() const;
156 	void  set_message( const StringType& message );
157 	void  set_streamName( const StringType& streamName );
158 	void  set_index( ANTLR_MARKER index );
159 	void  set_token( const TokenType* token );
160 	void  set_nextException( ExceptionBaseType* nextException );
161 	void  set_expecting( ANTLR_UINT32 expecting );
162 	void  set_expectingSet( BitsetListType* expectingSet );
163 	void  set_node( TokenType* node );
164 	void  set_c( ANTLR_UCHAR c );
165 	void  set_line( ANTLR_UINT32 line );
166 	void  set_charPositionInLine( ANTLR_INT32 charPositionInLine );
167 	void  set_decisionNum( ANTLR_UINT32 decisionNum );
168 	void  set_state( ANTLR_UINT32 state );
169 	void  set_ruleName( const StringType& ruleName );
170 	void  set_input( IntStreamType* input );
171 	StringType getDescription() const;
172 
173 	virtual StringType getName() const = 0;
174 	virtual ANTLR_UINT32 getType() const = 0;
175 	virtual void print() const = 0;
176 	virtual void displayRecognitionError( ANTLR_UINT8** tokenNames, StringStreamType& str ) const = 0;
177 
178     virtual ~ANTLR_ExceptionBase();
179 
180 protected:
181 	ANTLR_ExceptionBase(const StringType& message);
182 };
183 
184 
185 template<class ImplTraits, ExceptionType Ex, class StreamType>
186 class ANTLR_Exception  :  public ImplTraits::template ExceptionBaseType<StreamType>
187 {
188 public:
189 	typedef typename ImplTraits::StringType StringType;
190 	typedef typename ImplTraits::StringStreamType StringStreamType;
191 	typedef typename ImplTraits::BitsetType BitsetType;
192 	typedef typename ImplTraits::template ExceptionBaseType<StreamType> BaseType;
193 
194 public:
195 	template<typename BaseRecognizerType>
196 	ANTLR_Exception(BaseRecognizerType* recognizer, const StringType& message);
197 
198 	const StringType& get_name() const;
199 	virtual StringType getName() const;
200 	virtual ANTLR_UINT32 getType() const;
201 	virtual void print() const;
202 	virtual void displayRecognitionError( ANTLR_UINT8** tokenNames, StringStreamType& str_stream) const;
203 };
204 
205 ANTLR_END_NAMESPACE()
206 
207 #include "antlr3exception.inl"
208 
209 #endif
210