MismatchedTokenException.cpp
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:7k
源码类别:

编译器/解释器

开发平台:

Others

  1. /**
  2.  * <b>SOFTWARE RIGHTS</b>
  3.  * <p>
  4.  * ANTLR 2.6.0 MageLang Insitute, 1998
  5.  * <p>
  6.  * We reserve no legal rights to the ANTLR--it is fully in the
  7.  * public domain. An individual or company may do whatever
  8.  * they wish with source code distributed with ANTLR or the
  9.  * code generated by ANTLR, including the incorporation of
  10.  * ANTLR, or its output, into commerical software.
  11.  * <p>
  12.  * We encourage users to develop software with ANTLR. However,
  13.  * we do ask that credit is given to us for developing
  14.  * ANTLR. By "credit", we mean that if you use ANTLR or
  15.  * incorporate any source code into one of your programs
  16.  * (commercial product, research project, or otherwise) that
  17.  * you acknowledge this fact somewhere in the documentation,
  18.  * research report, etc... If you like ANTLR and have
  19.  * developed a nice tool with the output, please mention that
  20.  * you developed it using ANTLR. In addition, we ask that the
  21.  * headers remain intact in our source code. As long as these
  22.  * guidelines are kept, we expect to continue enhancing this
  23.  * system and expect to make other tools available as they are
  24.  * completed.
  25.  * <p>
  26.  * The ANTLR gang:
  27.  * @version ANTLR 2.6.0 MageLang Insitute, 1998
  28.  * @author Terence Parr, <a href=http://www.MageLang.com>MageLang Institute</a>
  29.  * @author <br>John Lilley, <a href=http://www.Empathy.com>Empathy Software</a>
  30.  * @author <br><a href="mailto:pete@yamuna.demon.co.uk">Pete Wells</a>
  31.  */
  32. #include "antlr/MismatchedTokenException.hpp"
  33. #include "antlr/String.hpp"
  34. ANTLR_BEGIN_NAMESPACE(antlr)
  35. MismatchedTokenException::MismatchedTokenException()
  36. : RecognitionException("Mismatched Token: expecting any AST node")
  37. , token(0)
  38. , node(nullASTptr)
  39. {
  40. fileName = "<AST>";
  41. }
  42. // Expected range / not range
  43. MismatchedTokenException::MismatchedTokenException(
  44. const ANTLR_USE_NAMESPACE(std)vector<ANTLR_USE_NAMESPACE(std)string>& tokenNames_,
  45. RefAST node_,
  46. int lower,
  47. int upper_,
  48. bool matchNot
  49. ) : RecognitionException("Mismatched Token")
  50.   , token(0)
  51.   , node(node_)
  52. {
  53. tokenNames = tokenNames_;
  54. if (!node) {
  55. tokenText = "<empty tree>";
  56. }
  57. else {
  58. tokenText = node->toString();
  59. }
  60. expecting = lower;
  61. upper = upper_;
  62. fileName = "<AST>";
  63. mismatchType = matchNot ? NOT_RANGE : RANGE;
  64. }
  65. // Expected token / not token
  66. MismatchedTokenException::MismatchedTokenException(
  67. const ANTLR_USE_NAMESPACE(std)vector<ANTLR_USE_NAMESPACE(std)string>& tokenNames_,
  68. RefAST node_,
  69. int expecting_,
  70. bool matchNot
  71. ) : RecognitionException("Mismatched Token")
  72.   , token(0)
  73.   , node(node_)
  74. {
  75. tokenNames = tokenNames_;
  76. if (!node) {
  77. tokenText = "<empty tree>";
  78. }
  79. else {
  80. tokenText = node->toString();
  81. }
  82. expecting = expecting_;
  83. fileName = "<AST>";
  84. mismatchType = matchNot ? NOT_TOKEN : TOKEN;
  85. }
  86. // Expected BitSet / not BitSet
  87. MismatchedTokenException::MismatchedTokenException(
  88. const ANTLR_USE_NAMESPACE(std)vector<ANTLR_USE_NAMESPACE(std)string>& tokenNames_,
  89. RefAST node_,
  90. BitSet set_,
  91. bool matchNot
  92. ) : RecognitionException("Mismatched Token")
  93.   , token(0)
  94.   , node(node_)
  95.   , set(set_)
  96. {
  97. tokenNames = tokenNames_;
  98. if (!node) {
  99. tokenText = "<empty tree>";
  100. }
  101. else {
  102. tokenText = node->toString();
  103. }
  104. fileName = "<AST>";
  105. mismatchType = matchNot ? NOT_SET : SET;
  106. }
  107. // Expected range / not range
  108. MismatchedTokenException::MismatchedTokenException(
  109. const ANTLR_USE_NAMESPACE(std)vector<ANTLR_USE_NAMESPACE(std)string>& tokenNames_,
  110. RefToken token_,
  111. int lower,
  112. int upper_,
  113. bool matchNot,
  114. const ANTLR_USE_NAMESPACE(std)string& fileName_
  115. ) : RecognitionException("Mismatched Token")
  116.   , token(token_)
  117.   , node(nullASTptr)
  118. {
  119. tokenNames = tokenNames_;
  120. line = token->getLine();
  121. column = token->getColumn();
  122. tokenText = token->getText();
  123. expecting = lower;
  124. upper = upper_;
  125. fileName = fileName_;
  126. mismatchType = matchNot ? NOT_RANGE : RANGE;
  127. }
  128. // Expected token / not token
  129. MismatchedTokenException::MismatchedTokenException(
  130. const ANTLR_USE_NAMESPACE(std)vector<ANTLR_USE_NAMESPACE(std)string>& tokenNames_,
  131. RefToken token_,
  132. int expecting_,
  133. bool matchNot,
  134. const ANTLR_USE_NAMESPACE(std)string& fileName_
  135. ) : RecognitionException("Mismatched Token")
  136.   , token(token_)
  137.   , node(nullASTptr)
  138. {
  139. tokenNames = tokenNames_;
  140. line = token->getLine();
  141. column = token->getColumn();
  142. tokenText = token->getText();
  143. expecting = expecting_;
  144. fileName = fileName_;
  145. mismatchType = matchNot ? NOT_TOKEN : TOKEN;
  146. }
  147. // Expected BitSet / not BitSet
  148. MismatchedTokenException::MismatchedTokenException(
  149. const ANTLR_USE_NAMESPACE(std)vector<ANTLR_USE_NAMESPACE(std)string>& tokenNames_,
  150. RefToken token_,
  151. BitSet set_,
  152. bool matchNot,
  153. const ANTLR_USE_NAMESPACE(std)string& fileName_
  154. ) : RecognitionException("Mismatched Token")
  155.   , token(token_)
  156.   , node(nullASTptr)
  157.   , set(set_)
  158. {
  159. tokenNames = tokenNames_;
  160. line = token->getLine();
  161. column = token->getColumn();
  162. tokenText = token->getText();
  163. fileName = fileName_;
  164. mismatchType = matchNot ? NOT_SET : SET;
  165. }
  166. // deprecated As of ANTLR 2.7.0
  167. ANTLR_USE_NAMESPACE(std)string MismatchedTokenException::getErrorMessage() const
  168. {
  169. return getMessage();
  170. }
  171. ANTLR_USE_NAMESPACE(std)string MismatchedTokenException::getMessage() const
  172. {
  173. ANTLR_USE_NAMESPACE(std)string s;
  174. switch (mismatchType) {
  175. case TOKEN:
  176. s += "expecting " + tokenName(expecting) + ", found '" + tokenText + "'";
  177. break;
  178. case NOT_TOKEN:
  179. s += "expecting anything but " + tokenName(expecting) + "; got it anyway";
  180. break;
  181. case RANGE:
  182. s += "expecting token in range: " + tokenName(expecting) + ".." + tokenName(upper) + ", found '" + tokenText + "'";
  183. break;
  184. case NOT_RANGE:
  185. s += "expecting token NOT in range: " + tokenName(expecting) + ".." + tokenName(upper) + ", found '" + tokenText + "'";
  186. break;
  187. case SET:
  188. case NOT_SET:
  189. {
  190. s += ANTLR_USE_NAMESPACE(std)string("expecting ") + (mismatchType == NOT_SET ? "NOT " : "") + "one of (";
  191. ANTLR_USE_NAMESPACE(std)vector<int> elems = set.toArray();
  192. for (int i = 0; i < (int) elems.size(); i++)
  193. {
  194. s += " ";
  195. s += tokenName(elems[i]);
  196. }
  197. s += "), found '" + tokenText + "'";
  198. }
  199. break;
  200. default:
  201. s = RecognitionException::getMessage();
  202. break;
  203. }
  204. return s;
  205. }
  206. ANTLR_USE_NAMESPACE(std)string MismatchedTokenException::tokenName(int tokenType) const
  207. {
  208. if (tokenType == Token::INVALID_TYPE) {
  209. return "<Set of tokens>";
  210. }
  211. else if (tokenType < 0 || tokenType >= (int) tokenNames.size()) {
  212. return ANTLR_USE_NAMESPACE(std)string("<") + tokenType + ">";
  213. }
  214. else {
  215. return tokenNames[tokenType];
  216. }
  217. }
  218. ANTLR_USE_NAMESPACE(std)string MismatchedTokenException::toString() const {
  219. if (token) {
  220. return getFileLineString() + getMessage();
  221. }
  222. return getMessage();
  223. }
  224. #ifndef NO_STATIC_CONSTS
  225. const int MismatchedTokenException::TOKEN;
  226. const int MismatchedTokenException::NOT_TOKEN;
  227. const int MismatchedTokenException::RANGE;
  228. const int MismatchedTokenException::NOT_RANGE;
  229. const int MismatchedTokenException::SET;
  230. const int MismatchedTokenException::NOT_SET;
  231. #endif
  232. ANTLR_END_NAMESPACE