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

编译器/解释器

开发平台:

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/DefaultToolErrorHandler.java#1 $
  7.  */
  8. import antlr.collections.impl.BitSet;
  9. class DefaultToolErrorHandler implements ToolErrorHandler {
  10.     CharFormatter javaCharFormatter = new JavaCharFormatter();
  11.     /** Dump token/character sets to System.out
  12.      * @param lexicalAnalysis  true for lexical rule
  13.      * @param depth  The depth of the ambiguity
  14.      * @param sets  An array of bitsets containing the ambiguities
  15.      */
  16.     private void dumpSets(Grammar grammar,
  17.   boolean lexicalAnalysis,
  18.   int depth,
  19.   Lookahead[] sets,
  20.   String linePrefix)
  21.     {
  22. for (int i = 1; i <= depth; i++) {
  23.     System.out.print(linePrefix+"tk==" + i + ":");
  24.     if (lexicalAnalysis) {
  25. String bits = sets[i].fset.toStringWithRanges(",", javaCharFormatter);
  26. if ( sets[i].containsEpsilon() ) {
  27.     System.out.print("<end-of-token>");
  28.     if ( bits.length()>0 ) {
  29. System.out.print(",");
  30.     }
  31. }
  32. System.out.println(bits);
  33.     }
  34.     else {
  35. System.out.println(sets[i].fset.toString(",", grammar.tokenManager.getVocabulary()));
  36.     }
  37. }
  38.     }
  39.     /** Issue a warning about ambiguity between a alternates
  40.      * @param blk  The block being analyzed
  41.      * @param lexicalAnalysis  true for lexical rule
  42.      * @param depth  The depth of the ambiguity
  43.      * @param sets  An array of bitsets containing the ambiguities
  44.      * @param altIdx1  The zero-based index of the first ambiguous alternative
  45.      * @param altIdx2  The zero-based index of the second ambiguous alternative
  46.      */
  47.     public void warnAltAmbiguity(Grammar grammar,
  48.  AlternativeBlock blk,
  49.  boolean lexicalAnalysis,
  50.  int depth,
  51.  Lookahead[] sets,
  52.  int altIdx1,
  53.  int altIdx2)
  54.     {
  55. String fileline = Tool.getFileLineString(grammar.getFilename(),blk.getLine());
  56. if ( blk instanceof RuleBlock && ((RuleBlock)blk).isLexerAutoGenRule() ) {
  57.     System.out.print("warning: lexical nondeterminism between rules ");
  58.     Alternative ai = blk.getAlternativeAt(altIdx1);
  59.     Alternative aj = blk.getAlternativeAt(altIdx2);
  60.     RuleRefElement rri = (RuleRefElement)ai.head;
  61.     RuleRefElement rrj = (RuleRefElement)aj.head;
  62.     String ri = CodeGenerator.reverseLexerRuleName(rri.targetRule);
  63.     String rj = CodeGenerator.reverseLexerRuleName(rrj.targetRule);
  64.     System.out.println(ri+" and "+rj+" upon");
  65.     dumpSets(grammar, lexicalAnalysis, depth, sets, fileline);
  66.     return;
  67. }
  68. System.out.println(
  69.    //   "warning: line " + blk.getLine() + ": " +
  70.    fileline+"warning: "+
  71.    (lexicalAnalysis ? "lexical " : "") + "nondeterminism upon"
  72.    );
  73. dumpSets(grammar, lexicalAnalysis, depth, sets, fileline);
  74. System.out.println(fileline+"tbetween alts " + (altIdx1+1) + " and " + (altIdx2+1) + " of block");
  75.     }
  76.     /** Issue a warning about ambiguity between an alternate and exit path.
  77.      * @param blk  The block being analyzed
  78.      * @param lexicalAnalysis  true for lexical rule
  79.      * @param depth  The depth of the ambiguity
  80.      * @param sets  An array of bitsets containing the ambiguities
  81.      * @param altIdx  The zero-based index of the ambiguous alternative
  82.      */
  83.     public void warnAltExitAmbiguity(Grammar grammar,
  84.      BlockWithImpliedExitPath blk,
  85.      boolean lexicalAnalysis,
  86.      int depth,
  87.      Lookahead[] sets,
  88.      int altIdx
  89.      )
  90.     {
  91. String fileline = Tool.getFileLineString(grammar.getFilename(),blk.getLine());
  92. System.out.println(
  93.    // "warning: line " + blk.getLine() + ": " +
  94.    fileline+"warning: "+
  95.    (lexicalAnalysis ? "lexical " : "") + "nondeterminism upon"
  96.    );
  97. dumpSets(grammar, lexicalAnalysis, depth, sets, fileline);
  98. System.out.println(fileline+"tbetween alt " + (altIdx+1) + " and exit branch of block");
  99.     }
  100. }