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

编译器/解释器

开发平台:

Others

  1. package antlr;
  2. /* ANTLR Translator Generator
  3.  * Project led by Terence Parr at http://www.jGuru.com
  4.  * Software rights: http://www.antlr.org/RIGHTS.html
  5.  *
  6.  * $Id: //depot/code/org.antlr/release/antlr-2.7.0/antlr/MismatchedTokenException.java#1 $
  7.  */
  8. import antlr.collections.impl.BitSet;
  9. import antlr.collections.AST;
  10. public class MismatchedTokenException extends RecognitionException {
  11.     // Token names array for formatting 
  12.     String[] tokenNames;
  13.     // The token that was encountered
  14.     public Token token;
  15.     // The offending AST node if tree walking
  16.     public AST node;
  17.     String tokenText=null; // taken from node or token object
  18. // Types of tokens
  19.     public static final int TOKEN = 1;
  20.     public static final int NOT_TOKEN = 2;
  21.     public static final int RANGE = 3;
  22.     public static final int NOT_RANGE = 4;
  23.     public static final int SET = 5;
  24.     public static final int NOT_SET = 6;
  25.     // One of the above
  26.     public int mismatchType;
  27. // For TOKEN/NOT_TOKEN and RANGE/NOT_RANGE
  28.     public int expecting;
  29.     // For RANGE/NOT_RANGE (expecting is lower bound of range)
  30.     public int upper;
  31.     // For SET/NOT_SET
  32.     public BitSet set;
  33.     /** Looking for AST wildcard, didn't find it */
  34.     public MismatchedTokenException() {
  35. super("Mismatched Token: expecting any AST node");
  36.     }
  37.     // Expected range / not range
  38.     public MismatchedTokenException(String[] tokenNames_, AST node, int lower, int upper_, boolean matchNot) {
  39. super("Mismatched Token");
  40. tokenNames = tokenNames_;
  41. this.node = node;
  42. if ( node==null ) {
  43.     tokenText = "<empty tree>";
  44. }
  45. else {
  46.     tokenText = node.toString();
  47. }
  48. expecting = lower;
  49. upper = upper_;
  50. this.fileName = "<AST>";
  51. mismatchType = matchNot ? NOT_RANGE : RANGE;
  52.     }
  53.     // Expected token / not token
  54.     public MismatchedTokenException(String[] tokenNames_, AST node, int expecting_, boolean matchNot) {
  55. super("Mismatched Token");
  56. tokenNames = tokenNames_;
  57. this.node = node;
  58. if ( node==null ) {
  59.     tokenText = "<empty tree>";
  60. }
  61. else {
  62.     tokenText = node.toString();
  63. }
  64. expecting = expecting_;
  65. this.fileName = "<AST>";
  66. mismatchType = matchNot ? NOT_TOKEN : TOKEN;
  67.     }
  68.     // Expected BitSet / not BitSet
  69.     public MismatchedTokenException(String[] tokenNames_, AST node, BitSet set_, boolean matchNot) {
  70. super("Mismatched Token");
  71. tokenNames = tokenNames_;
  72. this.node = node;
  73. if ( node==null ) {
  74.     tokenText = "<empty tree>";
  75. }
  76. else {
  77.     tokenText = node.toString();
  78. }
  79. set = set_;
  80. this.fileName = "<AST>";
  81. mismatchType = matchNot ? NOT_SET : SET;
  82.     }
  83.     // Expected range / not range
  84.     public MismatchedTokenException(String[] tokenNames_, Token token_, int lower, int upper_, boolean matchNot, String fileName) {
  85. super("Mismatched Token");
  86. tokenNames = tokenNames_;
  87. token = token_;
  88. line = token.getLine();
  89. column = token.getColumn();
  90. tokenText = token.getText();
  91. expecting = lower;
  92. upper = upper_;
  93. this.fileName = fileName;
  94. mismatchType = matchNot ? NOT_RANGE : RANGE;
  95.     }
  96.     // Expected token / not token
  97.     public MismatchedTokenException(String[] tokenNames_, Token token_, int expecting_, boolean matchNot, String fileName) {
  98. super("Mismatched Token");
  99. tokenNames = tokenNames_;
  100. token = token_;
  101. line = token.getLine();
  102. column = token.getColumn();
  103. tokenText = token.getText();
  104. expecting = expecting_;
  105. this.fileName = fileName;
  106. mismatchType = matchNot ? NOT_TOKEN : TOKEN;
  107.     }
  108.     // Expected BitSet / not BitSet
  109.     public MismatchedTokenException(String[] tokenNames_, Token token_, BitSet set_, boolean matchNot, String fileName) {
  110. super("Mismatched Token");
  111. tokenNames = tokenNames_;
  112. token = token_;
  113. line = token.getLine();
  114. column = token.getColumn();
  115. tokenText = token.getText();
  116. set = set_;
  117. this.fileName = fileName;
  118. mismatchType = matchNot ? NOT_SET : SET;
  119.     }
  120.     /**
  121.      * @deprecated As of ANTLR 2.7.0
  122.      */
  123.     public String getErrorMessage() {
  124. return getMessage();
  125.     }
  126.     /**
  127.      * Returns the error message that happened on the line/col given.
  128.      * Copied from toString().
  129.      */
  130.     public String getMessage() {
  131. StringBuffer sb = new StringBuffer();
  132. switch (mismatchType) {
  133. case TOKEN :
  134.     sb.append("expecting " + tokenName(expecting) + ", found '" + tokenText + "'");
  135.     break;
  136. case NOT_TOKEN :
  137.     sb.append("expecting anything but " + tokenName(expecting) + "; got it anyway");
  138.     break;
  139. case RANGE :
  140.     sb.append("expecting token in range: " + tokenName(expecting) + ".." + tokenName(upper) + ", found '" + tokenText + "'");
  141.     break;
  142. case NOT_RANGE :
  143.     sb.append("expecting token NOT in range: " + tokenName(expecting) + ".." + tokenName(upper) + ", found '" + tokenText + "'");
  144.     break;
  145. case SET :
  146. case NOT_SET :
  147.     sb.append("expecting " + (mismatchType == NOT_SET ? "NOT " : "") + "one of (");
  148.     int[] elems = set.toArray();
  149.     for (int i = 0; i < elems.length; i++) {
  150. sb.append(" ");
  151. sb.append(tokenName(elems[i]));
  152.     }
  153.     sb.append("), found '" + tokenText + "'");
  154.     break;
  155. default :
  156.     sb.append(super.getMessage());
  157.     break;
  158. }
  159. return sb.toString();
  160.     }
  161.     private String tokenName(int tokenType)
  162.     {
  163. if (tokenType == Token.INVALID_TYPE) {
  164.     return "<Set of tokens>";
  165. }
  166. else if (tokenType < 0 || tokenType >= tokenNames.length) {
  167.     return "<" + String.valueOf(tokenType) + ">";
  168. else {
  169.     return tokenNames[tokenType];
  170. }
  171.     }
  172.     /**
  173.      * @return a string representation of this exception.
  174.      */
  175.     public String toString() {
  176. if (token != null) { // AST or Token?
  177.     return Tool.getFileLineString(fileName,line)+getMessage();
  178. }
  179. return getMessage();
  180.     }
  181. }