You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
6.0 KiB
173 lines
6.0 KiB
package com.fr.third.antlr; |
|
|
|
/* ANTLR Translator Generator |
|
* Project led by Terence Parr at http://www.cs.usfca.edu |
|
* Software rights: http://www.antlr.org/license.html |
|
* |
|
* $Id: //depot/code/org.antlr/release/antlr-2.7.7/antlr/MismatchedTokenException.java#2 $ |
|
*/ |
|
|
|
import com.fr.third.antlr.collections.AST; |
|
import com.fr.third.antlr.collections.impl.BitSet; |
|
|
|
|
|
public class MismatchedTokenException extends RecognitionException { |
|
// Token names array for formatting |
|
String[] tokenNames; |
|
// The token that was encountered |
|
public Token token; |
|
// The offending AST node if tree walking |
|
public AST node; |
|
|
|
String tokenText = null; // taken from node or token object |
|
|
|
// Types of tokens |
|
public static final int TOKEN = 1; |
|
public static final int NOT_TOKEN = 2; |
|
public static final int RANGE = 3; |
|
public static final int NOT_RANGE = 4; |
|
public static final int SET = 5; |
|
public static final int NOT_SET = 6; |
|
// One of the above |
|
public int mismatchType; |
|
|
|
// For TOKEN/NOT_TOKEN and RANGE/NOT_RANGE |
|
public int expecting; |
|
|
|
// For RANGE/NOT_RANGE (expecting is lower bound of range) |
|
public int upper; |
|
|
|
// For SET/NOT_SET |
|
public BitSet set; |
|
|
|
/** Looking for AST wildcard, didn't find it */ |
|
public MismatchedTokenException() { |
|
super("Mismatched Token: expecting any AST node", "<AST>", -1, -1); |
|
} |
|
|
|
// Expected range / not range |
|
public MismatchedTokenException(String[] tokenNames_, AST node_, int lower, int upper_, boolean matchNot) { |
|
super("Mismatched Token", "<AST>", node_==null? -1:node_.getLine(), node_==null? -1:node_.getColumn()); |
|
tokenNames = tokenNames_; |
|
node = node_; |
|
if (node_ == null) { |
|
tokenText = "<empty tree>"; |
|
} |
|
else { |
|
tokenText = node_.toString(); |
|
} |
|
mismatchType = matchNot ? NOT_RANGE : RANGE; |
|
expecting = lower; |
|
upper = upper_; |
|
} |
|
|
|
// Expected token / not token |
|
public MismatchedTokenException(String[] tokenNames_, AST node_, int expecting_, boolean matchNot) { |
|
super("Mismatched Token", "<AST>", node_==null? -1:node_.getLine(), node_==null? -1:node_.getColumn()); |
|
tokenNames = tokenNames_; |
|
node = node_; |
|
if (node_ == null) { |
|
tokenText = "<empty tree>"; |
|
} |
|
else { |
|
tokenText = node_.toString(); |
|
} |
|
mismatchType = matchNot ? NOT_TOKEN : TOKEN; |
|
expecting = expecting_; |
|
} |
|
|
|
// Expected BitSet / not BitSet |
|
public MismatchedTokenException(String[] tokenNames_, AST node_, BitSet set_, boolean matchNot) { |
|
super("Mismatched Token", "<AST>", node_==null? -1:node_.getLine(), node_==null? -1:node_.getColumn()); |
|
tokenNames = tokenNames_; |
|
node = node_; |
|
if (node_ == null) { |
|
tokenText = "<empty tree>"; |
|
} |
|
else { |
|
tokenText = node_.toString(); |
|
} |
|
mismatchType = matchNot ? NOT_SET : SET; |
|
set = set_; |
|
} |
|
|
|
// Expected range / not range |
|
public MismatchedTokenException(String[] tokenNames_, Token token_, int lower, int upper_, boolean matchNot, String fileName_) { |
|
super("Mismatched Token", fileName_, token_.getLine(), token_.getColumn()); |
|
tokenNames = tokenNames_; |
|
token = token_; |
|
tokenText = token_.getText(); |
|
mismatchType = matchNot ? NOT_RANGE : RANGE; |
|
expecting = lower; |
|
upper = upper_; |
|
} |
|
|
|
// Expected token / not token |
|
public MismatchedTokenException(String[] tokenNames_, Token token_, int expecting_, boolean matchNot, String fileName_) { |
|
super("Mismatched Token", fileName_, token_.getLine(), token_.getColumn()); |
|
tokenNames = tokenNames_; |
|
token = token_; |
|
tokenText = token_.getText(); |
|
mismatchType = matchNot ? NOT_TOKEN : TOKEN; |
|
expecting = expecting_; |
|
} |
|
|
|
// Expected BitSet / not BitSet |
|
public MismatchedTokenException(String[] tokenNames_, Token token_, BitSet set_, boolean matchNot, String fileName_) { |
|
super("Mismatched Token", fileName_, token_.getLine(), token_.getColumn()); |
|
tokenNames = tokenNames_; |
|
token = token_; |
|
tokenText = token_.getText(); |
|
mismatchType = matchNot ? NOT_SET : SET; |
|
set = set_; |
|
} |
|
|
|
/** |
|
* Returns a clean error message (no line number/column information) |
|
*/ |
|
public String getMessage() { |
|
StringBuffer sb = new StringBuffer(); |
|
|
|
switch (mismatchType) { |
|
case TOKEN: |
|
sb.append("expecting " + tokenName(expecting) + ", found '" + tokenText + "'"); |
|
break; |
|
case NOT_TOKEN: |
|
sb.append("expecting anything but " + tokenName(expecting) + "; got it anyway"); |
|
break; |
|
case RANGE: |
|
sb.append("expecting token in range: " + tokenName(expecting) + ".." + tokenName(upper) + ", found '" + tokenText + "'"); |
|
break; |
|
case NOT_RANGE: |
|
sb.append("expecting token NOT in range: " + tokenName(expecting) + ".." + tokenName(upper) + ", found '" + tokenText + "'"); |
|
break; |
|
case SET: |
|
case NOT_SET: |
|
sb.append("expecting " + (mismatchType == NOT_SET ? "NOT " : "") + "one of ("); |
|
int[] elems = set.toArray(); |
|
for (int i = 0; i < elems.length; i++) { |
|
sb.append(' '); |
|
sb.append(tokenName(elems[i])); |
|
} |
|
sb.append("), found '" + tokenText + "'"); |
|
break; |
|
default : |
|
sb.append(super.getMessage()); |
|
break; |
|
} |
|
|
|
return sb.toString(); |
|
} |
|
|
|
private String tokenName(int tokenType) { |
|
if (tokenType == Token.INVALID_TYPE) { |
|
return "<Set of tokens>"; |
|
} |
|
else if (tokenType < 0 || tokenType >= tokenNames.length) { |
|
return "<" + String.valueOf(tokenType) + ">"; |
|
} |
|
else { |
|
return tokenNames[tokenType]; |
|
} |
|
} |
|
}
|
|
|