帆软使用的第三方框架。
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.
 
 

118 lines
4.3 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/DefaultToolErrorHandler.java#2 $
*/
class DefaultToolErrorHandler implements ToolErrorHandler {
DefaultToolErrorHandler(com.fr.third.antlr.Tool tool) {
antlrTool = tool;
}
private final com.fr.third.antlr.Tool antlrTool;
CharFormatter javaCharFormatter = new JavaCharFormatter();
/** Dump token/character sets to a string array suitable for
* {@link antlr.Tool.warning(String[], String, int, int)
* @param output The array that will contain the token/character set dump,
* one element per k (lookahead) value
* @param outputStartIndex The index into <code>output</code> that the
* dump should start at.
* @param lexicalAnalysis true for lexical rule
* @param depth The depth of the ambiguity
* @param sets An array of bitsets containing the ambiguities
*/
private void dumpSets(String[] output,
int outputStartIndex,
Grammar grammar,
boolean lexicalAnalysis,
int depth,
Lookahead[] sets) {
StringBuffer line = new StringBuffer(100);
for (int i = 1; i <= depth; i++) {
line.append("k==").append(i).append(':');
if (lexicalAnalysis) {
String bits = sets[i].fset.toStringWithRanges(",", javaCharFormatter);
if (sets[i].containsEpsilon()) {
line.append("<end-of-token>");
if (bits.length() > 0) {
line.append(',');
}
}
line.append(bits);
} else {
line.append(sets[i].fset.toString(",", grammar.tokenManager.getVocabulary()));
}
output[outputStartIndex++] = line.toString();
line.setLength(0);
}
}
/** Issue a warning about ambiguity between a alternates
* @param blk The block being analyzed
* @param lexicalAnalysis true for lexical rule
* @param depth The depth of the ambiguity
* @param sets An array of bitsets containing the ambiguities
* @param altIdx1 The zero-based index of the first ambiguous alternative
* @param altIdx2 The zero-based index of the second ambiguous alternative
*/
public void warnAltAmbiguity(Grammar grammar,
AlternativeBlock blk,
boolean lexicalAnalysis,
int depth,
Lookahead[] sets,
int altIdx1,
int altIdx2)
{
final StringBuffer line = new StringBuffer(100);
if (blk instanceof RuleBlock && ((RuleBlock)blk).isLexerAutoGenRule()) {
Alternative ai = blk.getAlternativeAt(altIdx1);
Alternative aj = blk.getAlternativeAt(altIdx2);
RuleRefElement rri = (RuleRefElement)ai.head;
RuleRefElement rrj = (RuleRefElement)aj.head;
String ri = CodeGenerator.reverseLexerRuleName(rri.targetRule);
String rj = CodeGenerator.reverseLexerRuleName(rrj.targetRule);
line.append("lexical nondeterminism between rules ");
line.append(ri).append(" and ").append(rj).append(" upon");
}
else {
if (lexicalAnalysis) {
line.append("lexical ");
}
line.append("nondeterminism between alts ");
line.append(altIdx1 + 1).append(" and ");
line.append(altIdx2 + 1).append(" of block upon");
}
final String [] output = new String [depth + 1];
output[0] = line.toString();
dumpSets(output, 1, grammar, lexicalAnalysis, depth, sets);
antlrTool.warning(output, grammar.getFilename(), blk.getLine(), blk.getColumn());
}
/** Issue a warning about ambiguity between an alternate and exit path.
* @param blk The block being analyzed
* @param lexicalAnalysis true for lexical rule
* @param depth The depth of the ambiguity
* @param sets An array of bitsets containing the ambiguities
* @param altIdx The zero-based index of the ambiguous alternative
*/
public void warnAltExitAmbiguity(Grammar grammar,
BlockWithImpliedExitPath blk,
boolean lexicalAnalysis,
int depth,
Lookahead[] sets,
int altIdx
)
{
String [] output = new String[depth + 2];
output[0] = (lexicalAnalysis ? "lexical " : "") + "nondeterminism upon";
dumpSets(output, 1, grammar, lexicalAnalysis, depth, sets);
output[depth + 1] = "between alt " + (altIdx + 1) + " and exit branch of block";
antlrTool.warning(output, grammar.getFilename(), blk.getLine(), blk.getColumn());
}
}