xref: /aosp_15_r20/external/apache-commons-bcel/src/examples/Mini/ParseException.java (revision 0c56280ab0842982c46a149f7b9eaa497e31e292)
1*0c56280aSSorin Basca /*
2*0c56280aSSorin Basca  * Licensed to the Apache Software Foundation (ASF) under one or more
3*0c56280aSSorin Basca  * contributor license agreements.  See the NOTICE file distributed with
4*0c56280aSSorin Basca  * this work for additional information regarding copyright ownership.
5*0c56280aSSorin Basca  * The ASF licenses this file to You under the Apache License, Version 2.0
6*0c56280aSSorin Basca  * (the "License"); you may not use this file except in compliance with
7*0c56280aSSorin Basca  * the License.  You may obtain a copy of the License at
8*0c56280aSSorin Basca  *
9*0c56280aSSorin Basca  *      http://www.apache.org/licenses/LICENSE-2.0
10*0c56280aSSorin Basca  *
11*0c56280aSSorin Basca  *  Unless required by applicable law or agreed to in writing, software
12*0c56280aSSorin Basca  *  distributed under the License is distributed on an "AS IS" BASIS,
13*0c56280aSSorin Basca  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*0c56280aSSorin Basca  *  See the License for the specific language governing permissions and
15*0c56280aSSorin Basca  *  limitations under the License.
16*0c56280aSSorin Basca  *
17*0c56280aSSorin Basca  */
18*0c56280aSSorin Basca /* Generated By:JavaCC: Do not edit this line. ParseException.java Version 0.7pre6 */
19*0c56280aSSorin Basca package Mini;
20*0c56280aSSorin Basca 
21*0c56280aSSorin Basca /**
22*0c56280aSSorin Basca  * This exception is thrown when parse errors are encountered.
23*0c56280aSSorin Basca  * You can explicitly create objects of this exception type by
24*0c56280aSSorin Basca  * calling the method generateParseException in the generated
25*0c56280aSSorin Basca  * parser.
26*0c56280aSSorin Basca  *
27*0c56280aSSorin Basca  * You can modify this class to customize your error reporting
28*0c56280aSSorin Basca  * mechanisms so long as you retain the public fields.
29*0c56280aSSorin Basca  */
30*0c56280aSSorin Basca public class ParseException extends Exception {
31*0c56280aSSorin Basca 
32*0c56280aSSorin Basca   /**
33*0c56280aSSorin Basca    * This constructor is used by the method "generateParseException"
34*0c56280aSSorin Basca    * in the generated parser.  Calling this constructor generates
35*0c56280aSSorin Basca    * a new object of this type with the fields "currentToken",
36*0c56280aSSorin Basca    * "expectedTokenSequences", and "tokenImage" set.  The boolean
37*0c56280aSSorin Basca    * flag "specialConstructor" is also set to true to indicate that
38*0c56280aSSorin Basca    * this constructor was used to create this object.
39*0c56280aSSorin Basca    * This constructor calls its super class with the empty string
40*0c56280aSSorin Basca    * to force the "toString" method of parent class "Throwable" to
41*0c56280aSSorin Basca    * print the error message in the form:
42*0c56280aSSorin Basca    *     ParseException: <result of getMessage>
43*0c56280aSSorin Basca    */
ParseException(Token currentTokenVal, int[][] expectedTokenSequencesVal, String[] tokenImageVal )44*0c56280aSSorin Basca   public ParseException(Token currentTokenVal,
45*0c56280aSSorin Basca                         int[][] expectedTokenSequencesVal,
46*0c56280aSSorin Basca                         String[] tokenImageVal
47*0c56280aSSorin Basca                        )
48*0c56280aSSorin Basca   {
49*0c56280aSSorin Basca     super("");
50*0c56280aSSorin Basca     specialConstructor = true;
51*0c56280aSSorin Basca     currentToken = currentTokenVal;
52*0c56280aSSorin Basca     expectedTokenSequences = expectedTokenSequencesVal;
53*0c56280aSSorin Basca     tokenImage = tokenImageVal;
54*0c56280aSSorin Basca   }
55*0c56280aSSorin Basca 
56*0c56280aSSorin Basca   /**
57*0c56280aSSorin Basca    * The following constructors are for use by you for whatever
58*0c56280aSSorin Basca    * purpose you can think of.  Constructing the exception in this
59*0c56280aSSorin Basca    * manner makes the exception behave in the normal way - i.e., as
60*0c56280aSSorin Basca    * documented in the class "Throwable".  The fields "errorToken",
61*0c56280aSSorin Basca    * "expectedTokenSequences", and "tokenImage" do not contain
62*0c56280aSSorin Basca    * relevant information.  The JavaCC generated code does not use
63*0c56280aSSorin Basca    * these constructors.
64*0c56280aSSorin Basca    */
65*0c56280aSSorin Basca 
ParseException()66*0c56280aSSorin Basca   public ParseException() {
67*0c56280aSSorin Basca     super();
68*0c56280aSSorin Basca     specialConstructor = false;
69*0c56280aSSorin Basca   }
70*0c56280aSSorin Basca 
ParseException(String message)71*0c56280aSSorin Basca   public ParseException(String message) {
72*0c56280aSSorin Basca     super(message);
73*0c56280aSSorin Basca     specialConstructor = false;
74*0c56280aSSorin Basca   }
75*0c56280aSSorin Basca 
76*0c56280aSSorin Basca   /**
77*0c56280aSSorin Basca    * This variable determines which constructor was used to create
78*0c56280aSSorin Basca    * this object and thereby affects the semantics of the
79*0c56280aSSorin Basca    * "getMessage" method (see below).
80*0c56280aSSorin Basca    */
81*0c56280aSSorin Basca   protected boolean specialConstructor;
82*0c56280aSSorin Basca 
83*0c56280aSSorin Basca   /**
84*0c56280aSSorin Basca    * This is the last token that has been consumed successfully.  If
85*0c56280aSSorin Basca    * this object has been created due to a parse error, the token
86*0c56280aSSorin Basca    * followng this token will (therefore) be the first error token.
87*0c56280aSSorin Basca    */
88*0c56280aSSorin Basca   public Token currentToken;
89*0c56280aSSorin Basca 
90*0c56280aSSorin Basca   /**
91*0c56280aSSorin Basca    * Each entry in this array is an array of integers.  Each array
92*0c56280aSSorin Basca    * of integers represents a sequence of tokens (by their ordinal
93*0c56280aSSorin Basca    * values) that is expected at this point of the parse.
94*0c56280aSSorin Basca    */
95*0c56280aSSorin Basca   public int[][] expectedTokenSequences;
96*0c56280aSSorin Basca 
97*0c56280aSSorin Basca   /**
98*0c56280aSSorin Basca    * This is a reference to the "tokenImage" array of the generated
99*0c56280aSSorin Basca    * parser within which the parse error occurred.  This array is
100*0c56280aSSorin Basca    * defined in the generated ...Constants interface.
101*0c56280aSSorin Basca    */
102*0c56280aSSorin Basca   public String[] tokenImage;
103*0c56280aSSorin Basca 
104*0c56280aSSorin Basca   /**
105*0c56280aSSorin Basca    * This method has the standard behavior when this object has been
106*0c56280aSSorin Basca    * created using the standard constructors.  Otherwise, it uses
107*0c56280aSSorin Basca    * "currentToken" and "expectedTokenSequences" to generate a parse
108*0c56280aSSorin Basca    * error message and returns it.  If this object has been created
109*0c56280aSSorin Basca    * due to a parse error, and you do not catch it (it gets thrown
110*0c56280aSSorin Basca    * from the parser), then this method is called during the printing
111*0c56280aSSorin Basca    * of the final stack trace, and hence the correct error message
112*0c56280aSSorin Basca    * gets displayed.
113*0c56280aSSorin Basca    */
114*0c56280aSSorin Basca   @Override
getMessage()115*0c56280aSSorin Basca   public String getMessage() {
116*0c56280aSSorin Basca     if (!specialConstructor) {
117*0c56280aSSorin Basca       return super.getMessage();
118*0c56280aSSorin Basca     }
119*0c56280aSSorin Basca     String expected = "";
120*0c56280aSSorin Basca     int maxSize = 0;
121*0c56280aSSorin Basca     for (int i = 0; i < expectedTokenSequences.length; i++) {
122*0c56280aSSorin Basca       if (maxSize < expectedTokenSequences[i].length) {
123*0c56280aSSorin Basca         maxSize = expectedTokenSequences[i].length;
124*0c56280aSSorin Basca       }
125*0c56280aSSorin Basca       for (int j = 0; j < expectedTokenSequences[i].length; j++) {
126*0c56280aSSorin Basca         expected += tokenImage[expectedTokenSequences[i][j]] + " ";
127*0c56280aSSorin Basca       }
128*0c56280aSSorin Basca       if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
129*0c56280aSSorin Basca         expected += "...";
130*0c56280aSSorin Basca       }
131*0c56280aSSorin Basca       expected += eol + "    ";
132*0c56280aSSorin Basca     }
133*0c56280aSSorin Basca     String retval = "Encountered \"";
134*0c56280aSSorin Basca     Token tok = currentToken.next;
135*0c56280aSSorin Basca     for (int i = 0; i < maxSize; i++) {
136*0c56280aSSorin Basca       if (i != 0) {
137*0c56280aSSorin Basca         retval += " ";
138*0c56280aSSorin Basca     }
139*0c56280aSSorin Basca       if (tok.kind == 0) {
140*0c56280aSSorin Basca         retval += tokenImage[0];
141*0c56280aSSorin Basca         break;
142*0c56280aSSorin Basca       }
143*0c56280aSSorin Basca       retval += add_escapes(tok.image);
144*0c56280aSSorin Basca       tok = tok.next;
145*0c56280aSSorin Basca     }
146*0c56280aSSorin Basca     retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn + "." + eol;
147*0c56280aSSorin Basca     if (expectedTokenSequences.length == 1) {
148*0c56280aSSorin Basca       retval += "Was expecting:" + eol + "    ";
149*0c56280aSSorin Basca     } else {
150*0c56280aSSorin Basca       retval += "Was expecting one of:" + eol + "    ";
151*0c56280aSSorin Basca     }
152*0c56280aSSorin Basca     retval += expected;
153*0c56280aSSorin Basca     return retval;
154*0c56280aSSorin Basca   }
155*0c56280aSSorin Basca 
156*0c56280aSSorin Basca   /**
157*0c56280aSSorin Basca    * The end of line string for this machine.
158*0c56280aSSorin Basca    */
159*0c56280aSSorin Basca   protected String eol = System.getProperty("line.separator", "\n");
160*0c56280aSSorin Basca 
161*0c56280aSSorin Basca   /**
162*0c56280aSSorin Basca    * Used to convert raw characters to their escaped version
163*0c56280aSSorin Basca    * when these raw version cannot be used as part of an ASCII
164*0c56280aSSorin Basca    * string literal.
165*0c56280aSSorin Basca    */
add_escapes(String str)166*0c56280aSSorin Basca   protected String add_escapes(String str) {
167*0c56280aSSorin Basca       StringBuffer retval = new StringBuffer();
168*0c56280aSSorin Basca       char ch;
169*0c56280aSSorin Basca       for (int i = 0; i < str.length(); i++) {
170*0c56280aSSorin Basca         switch (str.charAt(i))
171*0c56280aSSorin Basca         {
172*0c56280aSSorin Basca            case 0 :
173*0c56280aSSorin Basca               continue;
174*0c56280aSSorin Basca            case '\b':
175*0c56280aSSorin Basca               retval.append("\\b");
176*0c56280aSSorin Basca               continue;
177*0c56280aSSorin Basca            case '\t':
178*0c56280aSSorin Basca               retval.append("\\t");
179*0c56280aSSorin Basca               continue;
180*0c56280aSSorin Basca            case '\n':
181*0c56280aSSorin Basca               retval.append("\\n");
182*0c56280aSSorin Basca               continue;
183*0c56280aSSorin Basca            case '\f':
184*0c56280aSSorin Basca               retval.append("\\f");
185*0c56280aSSorin Basca               continue;
186*0c56280aSSorin Basca            case '\r':
187*0c56280aSSorin Basca               retval.append("\\r");
188*0c56280aSSorin Basca               continue;
189*0c56280aSSorin Basca            case '\"':
190*0c56280aSSorin Basca               retval.append("\\\"");
191*0c56280aSSorin Basca               continue;
192*0c56280aSSorin Basca            case '\'':
193*0c56280aSSorin Basca               retval.append("\\\'");
194*0c56280aSSorin Basca               continue;
195*0c56280aSSorin Basca            case '\\':
196*0c56280aSSorin Basca               retval.append("\\\\");
197*0c56280aSSorin Basca               continue;
198*0c56280aSSorin Basca            default:
199*0c56280aSSorin Basca               if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
200*0c56280aSSorin Basca                  String s = "0000" + Integer.toString(ch, 16);
201*0c56280aSSorin Basca                  retval.append("\\u" + s.substring(s.length() - 4, s.length()));
202*0c56280aSSorin Basca               } else {
203*0c56280aSSorin Basca                  retval.append(ch);
204*0c56280aSSorin Basca               }
205*0c56280aSSorin Basca               continue;
206*0c56280aSSorin Basca         }
207*0c56280aSSorin Basca       }
208*0c56280aSSorin Basca       return retval.toString();
209*0c56280aSSorin Basca    }
210*0c56280aSSorin Basca 
211*0c56280aSSorin Basca }
212