    001/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 5.0 */
    002/* JavaCCOptions:KEEP_LINE_COL=null */
    003package org.apache.commons.configuration2.plist;
    004
    005/**
    006 * This exception is thrown when parse errors are encountered.
    007 * You can explicitly create objects of this exception type by
    008 * calling the method generateParseException in the generated
    009 * parser.
    010 *
    011 * You can modify this class to customize your error reporting
    012 * mechanisms so long as you retain the public fields.
    013 */
    014public class ParseException extends Exception {
    015
    016  /**
    017   * The version identifier for this Serializable class.
    018   * Increment only if the <i>serialized</i> form of the
    019   * class changes.
    020   */
    021  private static final long serialVersionUID = 1L;
    022
    023  /**
    024   * This constructor is used by the method "generateParseException"
    025   * in the generated parser.  Calling this constructor generates
    026   * a new object of this type with the fields "currentToken",
    027   * "expectedTokenSequences", and "tokenImage" set.
    028   */
    029  public ParseException(Token currentTokenVal,
    030                        int[][] expectedTokenSequencesVal,
    031                        String[] tokenImageVal
    032                       )
    033  {
    034    super(initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal));
    035    currentToken = currentTokenVal;
    036    expectedTokenSequences = expectedTokenSequencesVal;
    037    tokenImage = tokenImageVal;
    038  }
    039
    040  /**
    041   * The following constructors are for use by you for whatever
    042   * purpose you can think of.  Constructing the exception in this
    043   * manner makes the exception behave in the normal way - i.e., as
    044   * documented in the class "Throwable".  The fields "errorToken",
    045   * "expectedTokenSequences", and "tokenImage" do not contain
    046   * relevant information.  The JavaCC generated code does not use
    047   * these constructors.
    048   */
    049
    050  public ParseException() {
    051    super();
    052  }
    053
    054  /** Constructor with message. */
    055  public ParseException(String message) {
    056    super(message);
    057  }
    058
    059
    060  /**
    061   * This is the last token that has been consumed successfully.  If
    062   * this object has been created due to a parse error, the token
    063   * followng this token will (therefore) be the first error token.
    064   */
    065  public Token currentToken;
    066
    067  /**
    068   * Each entry in this array is an array of integers.  Each array
    069   * of integers represents a sequence of tokens (by their ordinal
    070   * values) that is expected at this point of the parse.
    071   */
    072  public int[][] expectedTokenSequences;
    073
    074  /**
    075   * This is a reference to the "tokenImage" array of the generated
    076   * parser within which the parse error occurred.  This array is
    077   * defined in the generated ...Constants interface.
    078   */
    079  public String[] tokenImage;
    080
    081  /**
    082   * It uses "currentToken" and "expectedTokenSequences" to generate a parse
    083   * error message and returns it.  If this object has been created
    084   * due to a parse error, and you do not catch it (it gets thrown
    085   * from the parser) the correct error message
    086   * gets displayed.
    087   */
    088  private static String initialise(Token currentToken,
    089                           int[][] expectedTokenSequences,
    090                           String[] tokenImage) {
    091    String eol = System.getProperty("line.separator", "\n");
    092    StringBuffer expected = new StringBuffer();
    093    int maxSize = 0;
    094    for (int i = 0; i < expectedTokenSequences.length; i++) {
    095      if (maxSize < expectedTokenSequences[i].length) {
    096        maxSize = expectedTokenSequences[i].length;
    097      }
    098      for (int j = 0; j < expectedTokenSequences[i].length; j++) {
    099        expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
    100      }
    101      if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
    102        expected.append("...");
    103      }
    104      expected.append(eol).append("    ");
    105    }
    106    String retval = "Encountered \"";
    107    Token tok = currentToken.next;
    108    for (int i = 0; i < maxSize; i++) {
    109      if (i != 0) retval += " ";
    110      if (tok.kind == 0) {
    111        retval += tokenImage[0];
    112        break;
    113      }
    114      retval += " " + tokenImage[tok.kind];
    115      retval += " \"";
    116      retval += add_escapes(tok.image);
    117      retval += " \"";
    118      tok = tok.next;
    119    }
    120    retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
    121    retval += "." + eol;
    122    if (expectedTokenSequences.length == 1) {
    123      retval += "Was expecting:" + eol + "    ";
    124    } else {
    125      retval += "Was expecting one of:" + eol + "    ";
    126    }
    127    retval += expected.toString();
    128    return retval;
    129  }
    130
    131  /**
    132   * The end of line string for this machine.
    133   */
    134  protected String eol = System.getProperty("line.separator", "\n");
    135
    136  /**
    137   * Used to convert raw characters to their escaped version
    138   * when these raw version cannot be used as part of an ASCII
    139   * string literal.
    140   */
    141  static String add_escapes(String str) {
    142      StringBuffer retval = new StringBuffer();
    143      char ch;
    144      for (int i = 0; i < str.length(); i++) {
    145        switch (str.charAt(i))
    146        {
    147           case 0 :
    148              continue;
    149           case '\b':
    150              retval.append("\\b");
    151              continue;
    152           case '\t':
    153              retval.append("\\t");
    154              continue;
    155           case '\n':
    156              retval.append("\\n");
    157              continue;
    158           case '\f':
    159              retval.append("\\f");
    160              continue;
    161           case '\r':
    162              retval.append("\\r");
    163              continue;
    164           case '\"':
    165              retval.append("\\\"");
    166              continue;
    167           case '\'':
    168              retval.append("\\\'");
    169              continue;
    170           case '\\':
    171              retval.append("\\\\");
    172              continue;
    173           default:
    174              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
    175                 String s = "0000" + Integer.toString(ch, 16);
    176                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
    177              } else {
    178                 retval.append(ch);
    179              }
    180              continue;
    181        }
    182      }
    183      return retval.toString();
    184   }
    185
    186}
    187/* JavaCC - OriginalChecksum=821d4af3d9164e8d8fdd0b13f5f1a0ba (do not edit this line) */