    001    /* Generated By:JavaCC: Do not edit this line. ParseException.java Version 5.0 */
    002    /* JavaCCOptions:KEEP_LINE_COL=null */
    003    package org.apache.commons.jexl2.parser;
    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     */
    014    public 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=ff8a94b249d20c98f3226ff5185cc21b (do not edit this line) */