1 /* ANTLR Translator Generator
2  * Project led by Terence Parr at http://www.jGuru.com
3  * Software rights: http://www.antlr.org/license.html
4  *
5  * $Id: //depot/code/org.antlr/release/antlr-2.7.7/lib/cpp/src/MismatchedCharException.cpp#2 $
6  */
7 
8 #include "antlr/CharScanner.hpp"
9 #include "antlr/MismatchedCharException.hpp"
10 #include "antlr/String.hpp"
11 
12 #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
13 namespace antlr {
14 #endif
15 
MismatchedCharException()16 MismatchedCharException::MismatchedCharException()
17   : RecognitionException("Mismatched char")
18 {}
19 
20 // Expected range / not range
MismatchedCharException(int c,int lower,int upper_,bool matchNot,CharScanner * scanner_)21 MismatchedCharException::MismatchedCharException(
22 	int c,
23 	int lower,
24 	int upper_,
25 	bool matchNot,
26 	CharScanner* scanner_
27 ) : RecognitionException("Mismatched char",
28                          scanner_->getFilename(),
29 								 scanner_->getLine(), scanner_->getColumn())
30   , mismatchType(matchNot ? NOT_RANGE : RANGE)
31   , foundChar(c)
32   , expecting(lower)
33   , upper(upper_)
34   , scanner(scanner_)
35 {
36 }
37 
38 // Expected token / not token
MismatchedCharException(int c,int expecting_,bool matchNot,CharScanner * scanner_)39 MismatchedCharException::MismatchedCharException(
40 	int c,
41 	int expecting_,
42 	bool matchNot,
43 	CharScanner* scanner_
44 ) : RecognitionException("Mismatched char",
45                          scanner_->getFilename(),
46 								 scanner_->getLine(), scanner_->getColumn())
47   , mismatchType(matchNot ? NOT_CHAR : CHAR)
48   , foundChar(c)
49   , expecting(expecting_)
50   , scanner(scanner_)
51 {
52 }
53 
54 // Expected BitSet / not BitSet
MismatchedCharException(int c,BitSet set_,bool matchNot,CharScanner * scanner_)55 MismatchedCharException::MismatchedCharException(
56 	int c,
57 	BitSet set_,
58 	bool matchNot,
59 	CharScanner* scanner_
60 ) : RecognitionException("Mismatched char",
61                          scanner_->getFilename(),
62 								 scanner_->getLine(), scanner_->getColumn())
63   , mismatchType(matchNot ? NOT_SET : SET)
64   , foundChar(c)
65   , set(set_)
66   , scanner(scanner_)
67 {
68 }
69 
ANTLR_USE_NAMESPACE(std)70 ANTLR_USE_NAMESPACE(std)string MismatchedCharException::getMessage() const
71 {
72 	ANTLR_USE_NAMESPACE(std)string s;
73 
74 	switch (mismatchType) {
75 	case CHAR :
76 		s += "expecting '" + charName(expecting) + "', found '" + charName(foundChar) + "'";
77 		break;
78 	case NOT_CHAR :
79 		s += "expecting anything but '" + charName(expecting) + "'; got it anyway";
80 		break;
81 	case RANGE :
82 		s += "expecting token in range: '" + charName(expecting) + "'..'" + charName(upper) + "', found '" + charName(foundChar) + "'";
83 		break;
84 	case NOT_RANGE :
85 		s += "expecting token NOT in range: " + charName(expecting) + "'..'" + charName(upper) + "', found '" + charName(foundChar) + "'";
86 		break;
87 	case SET :
88 	case NOT_SET :
89 		{
90 			s += ANTLR_USE_NAMESPACE(std)string("expecting ") + (mismatchType == NOT_SET ? "NOT " : "") + "one of (";
91 			ANTLR_USE_NAMESPACE(std)vector<unsigned int> elems = set.toArray();
92 			for ( unsigned int i = 0; i < elems.size(); i++ )
93 			{
94 				s += " '";
95 				s += charName(elems[i]);
96 				s += "'";
97 			}
98 			s += "), found '" + charName(foundChar) + "'";
99 		}
100 		break;
101 	default :
102 		s += RecognitionException::getMessage();
103 		break;
104 	}
105 
106 	return s;
107 }
108 
109 #ifndef NO_STATIC_CONSTS
110 const int MismatchedCharException::CHAR;
111 const int MismatchedCharException::NOT_CHAR;
112 const int MismatchedCharException::RANGE;
113 const int MismatchedCharException::NOT_RANGE;
114 const int MismatchedCharException::SET;
115 const int MismatchedCharException::NOT_SET;
116 #endif
117 
118 #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
119 }
120 #endif
121