]> git.saurik.com Git - bison.git/blame - data/lalr1.java
tests: minor fixes/simplifications
[bison.git] / data / lalr1.java
CommitLineData
8405b70c
PB
1# Java skeleton for Bison -*- autoconf -*-
2
34136e65 3# Copyright (C) 2007-2012 Free Software Foundation, Inc.
8405b70c 4
f16b0819 5# This program is free software: you can redistribute it and/or modify
8405b70c 6# it under the terms of the GNU General Public License as published by
f16b0819 7# the Free Software Foundation, either version 3 of the License, or
8405b70c 8# (at your option) any later version.
f16b0819 9#
8405b70c
PB
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
f16b0819 14#
8405b70c 15# You should have received a copy of the GNU General Public License
f16b0819 16# along with this program. If not, see <http://www.gnu.org/licenses/>.
8405b70c
PB
17
18m4_include(b4_pkgdatadir/[java.m4])
19
3bb21113
AD
20b4_defines_if([b4_fatal([%s: %%defines does not make sense in Java],
21 [b4_skeleton])])
22
0ce61575 23# We don't depend on %debug in Java, but pacify warnings about non-used flags.
fa819509 24b4_parse_trace_if([0], [0])
0ce61575 25
3bb21113
AD
26m4_define([b4_symbol_no_destructor_assert],
27[b4_symbol_if([$1], [has_destructor],
28 [b4_fatal([%s: %s: %%destructor does not make sense in Java],
29 [b4_skeleton],
30 [b4_symbol_action_location([$1], [destructor])])])])
31b4_symbol_foreach([b4_symbol_no_destructor_assert])
8405b70c
PB
32
33m4_divert_push(0)dnl
a0d4650a 34@output(b4_parser_file_name@)@
8405b70c 35b4_copyright([Skeleton implementation for Bison LALR(1) parsers in Java],
34136e65 36 [2007-2012])
8405b70c
PB
37
38b4_percent_define_ifdef([package], [package b4_percent_define_get([package]);
39])[/* First part of user declarations. */
1979121c
DJ
40]b4_user_pre_prologue
41b4_user_post_prologue
8405b70c
PB
42b4_percent_code_get([[imports]])
43[/**
74d6c0fe 44 * A Bison parser, automatically generated from <tt>]m4_bpatsubst(b4_file_name, [^"\(.*\)"$], [\1])[</tt>.
8405b70c
PB
45 *
46 * @@author LALR (1) parser skeleton written by Paolo Bonzini.
47 */
1979121c
DJ
48]b4_percent_define_get3([annotations], [], [ ])dnl
49b4_public_if([public ])dnl
e254a580
DJ
50b4_abstract_if([abstract ])dnl
51b4_final_if([final ])dnl
52b4_strictfp_if([strictfp ])dnl
53[class ]b4_parser_class_name[]dnl
54b4_percent_define_get3([extends], [ extends ])dnl
55b4_percent_define_get3([implements], [ implements ])[
8405b70c
PB
56{
57 ]b4_identification[
1979121c 58]b4_error_verbose_if([[
8405b70c 59 /** True if verbose error messages are enabled. */
1979121c
DJ
60 private boolean yyErrorVerbose = true;
61
62 /**
63 * Return whether verbose error messages are enabled.
64 */
65 public final boolean getErrorVerbose() { return yyErrorVerbose; }
66
67 /**
68 * Set the verbosity of error messages.
69 * @@param verbose True to request verbose error messages.
70 */
71 public final void setErrorVerbose(boolean verbose)
72 { yyErrorVerbose = verbose; }
73]])
8405b70c
PB
74
75b4_locations_if([[
76 /**
77 * A class defining a pair of positions. Positions, defined by the
78 * <code>]b4_position_type[</code> class, denote a point in the input.
79 * Locations represent a part of the input through the beginning
80 * and ending positions. */
81 public class ]b4_location_type[ {
82 /** The first, inclusive, position in the range. */
83 public ]b4_position_type[ begin;
84
85 /** The first position beyond the range. */
86 public ]b4_position_type[ end;
87
88 /**
e254a580 89 * Create a <code>]b4_location_type[</code> denoting an empty range located at
8405b70c
PB
90 * a given point.
91 * @@param loc The position at which the range is anchored. */
92 public ]b4_location_type[ (]b4_position_type[ loc) {
93 this.begin = this.end = loc;
94 }
95
96 /**
97 * Create a <code>]b4_location_type[</code> from the endpoints of the range.
98 * @@param begin The first position included in the range.
74d6c0fe 99 * @@param end The first position beyond the range. */
8405b70c
PB
100 public ]b4_location_type[ (]b4_position_type[ begin, ]b4_position_type[ end) {
101 this.begin = begin;
102 this.end = end;
103 }
104
105 /**
106 * Print a representation of the location. For this to be correct,
107 * <code>]b4_position_type[</code> should override the <code>equals</code>
108 * method. */
109 public String toString () {
110 if (begin.equals (end))
111 return begin.toString ();
112 else
113 return begin.toString () + "-" + end.toString ();
114 }
115 }
116
117]])
118
8405b70c 119 b4_locations_if([[
d3b12988 120 private ]b4_location_type[ yylloc (YYStack rhs, int n)
8405b70c
PB
121 {
122 if (n > 0)
aa3bcdf3 123 return new ]b4_location_type[ (rhs.locationAt (n-1).begin, rhs.locationAt (0).end);
8405b70c
PB
124 else
125 return new ]b4_location_type[ (rhs.locationAt (0).end);
74d6c0fe 126 }]])[
8405b70c 127
01b477c6 128 /**
8405b70c
PB
129 * Communication interface between the scanner and the Bison-generated
130 * parser <tt>]b4_parser_class_name[</tt>.
131 */
132 public interface Lexer {
1979121c
DJ
133 /** Token returned by the scanner to signal the end of its input. */
134 public static final int EOF = 0;
135
136]b4_token_enums(b4_tokens)[
137
8405b70c
PB
138 ]b4_locations_if([[/**
139 * Method to retrieve the beginning position of the last scanned token.
140 * @@return the position at which the last scanned token starts. */
141 ]b4_position_type[ getStartPos ();
142
143 /**
144 * Method to retrieve the ending position of the last scanned token.
145 * @@return the first position beyond the last scanned token. */
146 ]b4_position_type[ getEndPos ();]])[
147
148 /**
149 * Method to retrieve the semantic value of the last scanned token.
150 * @@return the semantic value of the last scanned token. */
d0ee4105 151 ]b4_yystype[ getLVal ();
8405b70c
PB
152
153 /**
8405b70c 154 * Entry point for the scanner. Returns the token identifier corresponding
d0ee4105 155 * to the next token and prepares to return the semantic value
a0d4650a 156 * ]b4_locations_if([and beginning/ending positions ])[of the token.
8405b70c 157 * @@return the token identifier corresponding to the next token. */
01b477c6 158 int yylex () ]b4_maybe_throws([b4_lex_throws])[;
8405b70c
PB
159
160 /**
161 * Entry point for error reporting. Emits an error
e254a580 162 * ]b4_locations_if([referring to the given location ])[in a user-defined way.
8405b70c 163 *
74d6c0fe 164 * ]b4_locations_if([[@@param loc The location of the element to which the
8405b70c 165 * error message is related]])[
1979121c
DJ
166 * @@param msg The string for the error message. */
167 void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String msg);]
01b477c6
PB
168 }
169
170 b4_lexer_if([[private class YYLexer implements Lexer {
171]b4_percent_code_get([[lexer]])[
172 }
8405b70c 173
01b477c6
PB
174 ]])[/** The object doing lexical analysis for us. */
175 private Lexer yylexer;
176 ]
177 b4_parse_param_vars
8405b70c 178
01b477c6 179b4_lexer_if([[
8405b70c 180 /**
01b477c6 181 * Instantiates the Bison-generated parser.
8405b70c 182 */
1979121c
DJ
183 public ]b4_parser_class_name (b4_parse_param_decl([b4_lex_param_decl])[) ]b4_maybe_throws([b4_init_throws])[
184 {
185 ]b4_percent_code_get([[init]])[
01b477c6
PB
186 this.yylexer = new YYLexer(]b4_lex_param_call[);
187 ]b4_parse_param_cons[
188 }
189]])
190
191 /**
192 * Instantiates the Bison-generated parser.
74d6c0fe 193 * @@param yylexer The scanner that will supply tokens to the parser.
01b477c6 194 */
1979121c
DJ
195 b4_lexer_if([[protected]], [[public]]) b4_parser_class_name[ (]b4_parse_param_decl([[Lexer yylexer]])[) ]b4_maybe_throws([b4_init_throws])[
196 {
197 ]b4_percent_code_get([[init]])[
01b477c6
PB
198 this.yylexer = yylexer;
199 ]b4_parse_param_cons[
8405b70c
PB
200 }
201
d3b12988 202 private java.io.PrintStream yyDebugStream = System.err;
8405b70c
PB
203
204 /**
205 * Return the <tt>PrintStream</tt> on which the debugging output is
206 * printed.
207 */
d3b12988 208 public final java.io.PrintStream getDebugStream () { return yyDebugStream; }
8405b70c
PB
209
210 /**
211 * Set the <tt>PrintStream</tt> on which the debug output is printed.
212 * @@param s The stream that is used for debugging output.
213 */
d3b12988 214 public final void setDebugStream(java.io.PrintStream s) { yyDebugStream = s; }
8405b70c
PB
215
216 private int yydebug = 0;
217
218 /**
219 * Answer the verbosity of the debugging output; 0 means that all kinds of
220 * output from the parser are suppressed.
221 */
222 public final int getDebugLevel() { return yydebug; }
223
224 /**
225 * Set the verbosity of the debugging output; 0 means that all kinds of
226 * output from the parser are suppressed.
227 * @@param level The verbosity level for debugging output.
228 */
229 public final void setDebugLevel(int level) { yydebug = level; }
230
1979121c
DJ
231 /**
232 * Print an error message via the lexer.
233 *]b4_locations_if([[ Use a <code>null</code> location.]])[
234 * @@param msg The error message.
235 */
236 public final void yyerror (String msg)
237 {
238 yylexer.yyerror (]b4_locations_if([[(]b4_location_type[)null, ]])[msg);
8405b70c 239 }
1979121c
DJ
240]b4_locations_if([[
241 /**
242 * Print an error message via the lexer.
243 * @@param loc The location associated with the message.
244 * @@param msg The error message.
245 */
246 public final void yyerror (]b4_location_type[ loc, String msg)
247 {
248 yylexer.yyerror (loc, msg);
01b477c6
PB
249 }
250
1979121c
DJ
251 /**
252 * Print an error message via the lexer.
253 * @@param pos The position associated with the message.
254 * @@param msg The error message.
255 */
256 public final void yyerror (]b4_position_type[ pos, String msg)
257 {
258 yylexer.yyerror (new ]b4_location_type[ (pos), msg);
259 }]])
8405b70c
PB
260
261 [protected final void yycdebug (String s) {
262 if (yydebug > 0)
d3b12988 263 yyDebugStream.println (s);
8405b70c
PB
264 }
265
d3b12988 266 private final class YYStack {
8405b70c
PB
267 private int[] stateStack = new int[16];
268 ]b4_locations_if([[private ]b4_location_type[[] locStack = new ]b4_location_type[[16];]])[
01b477c6 269 private ]b4_yystype[[] valueStack = new ]b4_yystype[[16];
8405b70c 270
8a93f8e6
PB
271 public int size = 16;
272 public int height = -1;
a0d4650a 273
01b477c6 274 public final void push (int state, ]b4_yystype[ value]dnl
11707b2b 275 b4_locations_if([, ]b4_location_type[ loc])[) {
8405b70c 276 height++;
a0d4650a 277 if (size == height)
8405b70c 278 {
11707b2b
AD
279 int[] newStateStack = new int[size * 2];
280 System.arraycopy (stateStack, 0, newStateStack, 0, height);
281 stateStack = newStateStack;
282 ]b4_locations_if([[
283 ]b4_location_type[[] newLocStack = new ]b4_location_type[[size * 2];
284 System.arraycopy (locStack, 0, newLocStack, 0, height);
285 locStack = newLocStack;]])
286
287 b4_yystype[[] newValueStack = new ]b4_yystype[[size * 2];
288 System.arraycopy (valueStack, 0, newValueStack, 0, height);
289 valueStack = newValueStack;
290
291 size *= 2;
292 }
8405b70c
PB
293
294 stateStack[height] = state;
295 ]b4_locations_if([[locStack[height] = loc;]])[
296 valueStack[height] = value;
297 }
298
299 public final void pop () {
1a33f4f6 300 pop (1);
8405b70c
PB
301 }
302
303 public final void pop (int num) {
304 // Avoid memory leaks... garbage collection is a white lie!
305 if (num > 0) {
3f8ffd15 306 java.util.Arrays.fill (valueStack, height - num + 1, height + 1, null);
1a33f4f6 307 ]b4_locations_if([[java.util.Arrays.fill (locStack, height - num + 1, height + 1, null);]])[
8405b70c
PB
308 }
309 height -= num;
310 }
311
312 public final int stateAt (int i) {
313 return stateStack[height - i];
314 }
315
316 ]b4_locations_if([[public final ]b4_location_type[ locationAt (int i) {
317 return locStack[height - i];
318 }
319
01b477c6 320 ]])[public final ]b4_yystype[ valueAt (int i) {
8405b70c
PB
321 return valueStack[height - i];
322 }
323
324 // Print the state stack on the debug stream.
8a93f8e6 325 public void print (java.io.PrintStream out)
8405b70c
PB
326 {
327 out.print ("Stack now");
a0d4650a 328
02803d55 329 for (int i = 0; i <= height; i++)
8405b70c 330 {
11707b2b
AD
331 out.print (' ');
332 out.print (stateStack[i]);
8405b70c
PB
333 }
334 out.println ();
335 }
336 }
337
338 /**
339 * Returned by a Bison action in order to stop the parsing process and
340 * return success (<tt>true</tt>). */
341 public static final int YYACCEPT = 0;
342
343 /**
344 * Returned by a Bison action in order to stop the parsing process and
345 * return failure (<tt>false</tt>). */
346 public static final int YYABORT = 1;
347
348 /**
349 * Returned by a Bison action in order to start error recovery without
350 * printing an error message. */
351 public static final int YYERROR = 2;
352
4395a9ff
JD
353 // Internal return codes that are not supported for user semantic
354 // actions.
355 private static final int YYERRLAB = 3;
8405b70c
PB
356 private static final int YYNEWSTATE = 4;
357 private static final int YYDEFAULT = 5;
358 private static final int YYREDUCE = 6;
359 private static final int YYERRLAB1 = 7;
360 private static final int YYRETURN = 8;
361
362 private int yyerrstatus_ = 0;
363
364 /**
365 * Return whether error recovery is being done. In this state, the parser
366 * reads token until it reaches a known state, and then restarts normal
367 * operation. */
d3b12988 368 public final boolean recovering ()
8405b70c
PB
369 {
370 return yyerrstatus_ == 0;
371 }
372
e254a580 373 private int yyaction (int yyn, YYStack yystack, int yylen) ]b4_maybe_throws([b4_throws])[
8405b70c 374 {
01b477c6 375 ]b4_yystype[ yyval;
8405b70c
PB
376 ]b4_locations_if([b4_location_type[ yyloc = yylloc (yystack, yylen);]])[
377
378 /* If YYLEN is nonzero, implement the default value of the action:
379 `$$ = $1'. Otherwise, use the top of the stack.
a0d4650a 380
8405b70c
PB
381 Otherwise, the following line sets YYVAL to garbage.
382 This behavior is undocumented and Bison
383 users should not rely upon it. */
384 if (yylen > 0)
385 yyval = yystack.valueAt (yylen - 1);
386 else
387 yyval = yystack.valueAt (0);
a0d4650a 388
8405b70c
PB
389 yy_reduce_print (yyn, yystack);
390
391 switch (yyn)
392 {
11707b2b
AD
393 ]b4_user_actions[
394 default: break;
8405b70c
PB
395 }
396
397 yy_symbol_print ("-> $$ =", yyr1_[yyn], yyval]b4_locations_if([, yyloc])[);
398
399 yystack.pop (yylen);
400 yylen = 0;
401
402 /* Shift the result of the reduction. */
403 yyn = yyr1_[yyn];
404 int yystate = yypgoto_[yyn - yyntokens_] + yystack.stateAt (0);
405 if (0 <= yystate && yystate <= yylast_
11707b2b 406 && yycheck_[yystate] == yystack.stateAt (0))
8405b70c
PB
407 yystate = yytable_[yystate];
408 else
409 yystate = yydefgoto_[yyn - yyntokens_];
410
411 yystack.push (yystate, yyval]b4_locations_if([, yyloc])[);
412 return YYNEWSTATE;
413 }
414
1979121c 415]b4_error_verbose_if([[
8405b70c
PB
416 /* Return YYSTR after stripping away unnecessary quotes and
417 backslashes, so that it's suitable for yyerror. The heuristic is
418 that double-quoting is unnecessary unless the string contains an
419 apostrophe, a comma, or backslash (other than backslash-backslash).
420 YYSTR is taken from yytname. */
421 private final String yytnamerr_ (String yystr)
422 {
423 if (yystr.charAt (0) == '"')
424 {
425 StringBuffer yyr = new StringBuffer ();
426 strip_quotes: for (int i = 1; i < yystr.length (); i++)
427 switch (yystr.charAt (i))
428 {
429 case '\'':
430 case ',':
431 break strip_quotes;
432
433 case '\\':
11707b2b 434 if (yystr.charAt(++i) != '\\')
8405b70c
PB
435 break strip_quotes;
436 /* Fall through. */
437 default:
438 yyr.append (yystr.charAt (i));
439 break;
440
441 case '"':
442 return yyr.toString ();
443 }
444 }
445 else if (yystr.equals ("$end"))
446 return "end of input";
447
448 return yystr;
449 }
1979121c 450]])[
8405b70c
PB
451
452 /*--------------------------------.
453 | Print this symbol on YYOUTPUT. |
454 `--------------------------------*/
455
456 private void yy_symbol_print (String s, int yytype,
11707b2b
AD
457 ]b4_yystype[ yyvaluep]dnl
458 b4_locations_if([, Object yylocationp])[)
8405b70c
PB
459 {
460 if (yydebug > 0)
461 yycdebug (s + (yytype < yyntokens_ ? " token " : " nterm ")
11707b2b
AD
462 + yytname_[yytype] + " ("]b4_locations_if([
463 + yylocationp + ": "])[
464 + (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")");
8405b70c
PB
465 }
466
467 /**
468 * Parse input from the scanner that was specified at object construction
469 * time. Return whether the end of the input was reached successfully.
470 *
471 * @@return <tt>true</tt> if the parsing succeeds. Note that this does not
472 * imply that there were no syntax errors.
473 */
e254a580 474 public boolean parse () ]b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])[
8405b70c
PB
475 {
476 /// Lookahead and lookahead in internal form.
477 int yychar = yyempty_;
478 int yytoken = 0;
479
480 /* State. */
481 int yyn = 0;
482 int yylen = 0;
483 int yystate = 0;
484
d3b12988 485 YYStack yystack = new YYStack ();
8405b70c
PB
486
487 /* Error handling. */
488 int yynerrs_ = 0;
489 ]b4_locations_if([/// The location where the error started.
490 ]b4_location_type[ yyerrloc = null;
491
492 /// ]b4_location_type[ of the lookahead.
493 ]b4_location_type[ yylloc = new ]b4_location_type[ (null, null);
494
495 /// @@$.
496 ]b4_location_type[ yyloc;])
497
498 /// Semantic value of the lookahead.
01b477c6 499 b4_yystype[ yylval = null;
8405b70c 500
8405b70c
PB
501 yycdebug ("Starting parse\n");
502 yyerrstatus_ = 0;
503
504]m4_ifdef([b4_initial_action], [
505m4_pushdef([b4_at_dollar], [yylloc])dnl
506m4_pushdef([b4_dollar_dollar], [yylval])dnl
507 /* User initialization code. */
508 b4_user_initial_action
509m4_popdef([b4_dollar_dollar])dnl
510m4_popdef([b4_at_dollar])])dnl
511
512 [ /* Initialize the stack. */
513 yystack.push (yystate, yylval]b4_locations_if([, yylloc])[);
514
515 int label = YYNEWSTATE;
516 for (;;)
517 switch (label)
518 {
519 /* New state. Unlike in the C/C++ skeletons, the state is already
11707b2b 520 pushed when we come here. */
8405b70c
PB
521 case YYNEWSTATE:
522 yycdebug ("Entering state " + yystate + "\n");
523 if (yydebug > 0)
d3b12988 524 yystack.print (yyDebugStream);
a0d4650a 525
8405b70c
PB
526 /* Accept? */
527 if (yystate == yyfinal_)
528 return true;
a0d4650a 529
8405b70c
PB
530 /* Take a decision. First try without lookahead. */
531 yyn = yypact_[yystate];
f2b30bdf 532 if (yy_pact_value_is_default_ (yyn))
8405b70c
PB
533 {
534 label = YYDEFAULT;
11707b2b 535 break;
8405b70c 536 }
a0d4650a 537
8405b70c
PB
538 /* Read a lookahead token. */
539 if (yychar == yyempty_)
540 {
c4ddc0fb
AD
541 yycdebug ("Reading a token: ");
542 yychar = yylexer.yylex ();]
01b477c6 543 b4_locations_if([[
c4ddc0fb 544 yylloc = new ]b4_location_type[(yylexer.getStartPos (),
1979121c 545 yylexer.getEndPos ());]])
01b477c6 546 yylval = yylexer.getLVal ();[
8405b70c 547 }
a0d4650a 548
8405b70c 549 /* Convert token to internal form. */
1979121c 550 if (yychar <= Lexer.EOF)
8405b70c 551 {
c4ddc0fb
AD
552 yychar = yytoken = Lexer.EOF;
553 yycdebug ("Now at end of input.\n");
8405b70c
PB
554 }
555 else
556 {
11707b2b
AD
557 yytoken = yytranslate_ (yychar);
558 yy_symbol_print ("Next token is", yytoken,
559 yylval]b4_locations_if([, yylloc])[);
8405b70c 560 }
a0d4650a 561
8405b70c
PB
562 /* If the proper action on seeing token YYTOKEN is to reduce or to
563 detect an error, take that action. */
564 yyn += yytoken;
565 if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken)
566 label = YYDEFAULT;
a0d4650a 567
8405b70c
PB
568 /* <= 0 means reduce or error. */
569 else if ((yyn = yytable_[yyn]) <= 0)
570 {
f2b30bdf 571 if (yy_table_value_is_error_ (yyn))
4395a9ff 572 label = YYERRLAB;
11707b2b
AD
573 else
574 {
575 yyn = -yyn;
576 label = YYREDUCE;
577 }
8405b70c 578 }
a0d4650a 579
8405b70c
PB
580 else
581 {
582 /* Shift the lookahead token. */
11707b2b
AD
583 yy_symbol_print ("Shifting", yytoken,
584 yylval]b4_locations_if([, yylloc])[);
a0d4650a 585
8405b70c
PB
586 /* Discard the token being shifted. */
587 yychar = yyempty_;
a0d4650a 588
8405b70c
PB
589 /* Count tokens shifted since error; after three, turn off error
590 status. */
591 if (yyerrstatus_ > 0)
592 --yyerrstatus_;
a0d4650a 593
8405b70c
PB
594 yystate = yyn;
595 yystack.push (yystate, yylval]b4_locations_if([, yylloc])[);
596 label = YYNEWSTATE;
597 }
598 break;
a0d4650a 599
8405b70c
PB
600 /*-----------------------------------------------------------.
601 | yydefault -- do the default action for the current state. |
602 `-----------------------------------------------------------*/
603 case YYDEFAULT:
604 yyn = yydefact_[yystate];
605 if (yyn == 0)
4395a9ff 606 label = YYERRLAB;
8405b70c
PB
607 else
608 label = YYREDUCE;
609 break;
a0d4650a 610
8405b70c
PB
611 /*-----------------------------.
612 | yyreduce -- Do a reduction. |
613 `-----------------------------*/
614 case YYREDUCE:
615 yylen = yyr2_[yyn];
616 label = yyaction (yyn, yystack, yylen);
11707b2b 617 yystate = yystack.stateAt (0);
8405b70c 618 break;
a0d4650a 619
8405b70c
PB
620 /*------------------------------------.
621 | yyerrlab -- here on detecting error |
622 `------------------------------------*/
4395a9ff 623 case YYERRLAB:
8405b70c
PB
624 /* If not already recovering from an error, report this error. */
625 if (yyerrstatus_ == 0)
626 {
11707b2b 627 ++yynerrs_;
d2060f06
JD
628 if (yychar == yyempty_)
629 yytoken = yyempty_;
11707b2b 630 yyerror (]b4_locations_if([yylloc, ])[yysyntax_error (yystate, yytoken));
8405b70c 631 }
a0d4650a 632
8405b70c
PB
633 ]b4_locations_if([yyerrloc = yylloc;])[
634 if (yyerrstatus_ == 3)
635 {
1979121c
DJ
636 /* If just tried and failed to reuse lookahead token after an
637 error, discard it. */
a0d4650a 638
1979121c
DJ
639 if (yychar <= Lexer.EOF)
640 {
641 /* Return failure if at end of input. */
642 if (yychar == Lexer.EOF)
643 return false;
644 }
645 else
11707b2b 646 yychar = yyempty_;
8405b70c 647 }
a0d4650a 648
8405b70c
PB
649 /* Else will try to reuse lookahead token after shifting the error
650 token. */
651 label = YYERRLAB1;
652 break;
a0d4650a 653
8405b70c
PB
654 /*---------------------------------------------------.
655 | errorlab -- error raised explicitly by YYERROR. |
656 `---------------------------------------------------*/
657 case YYERROR:
a0d4650a 658
8405b70c
PB
659 ]b4_locations_if([yyerrloc = yystack.locationAt (yylen - 1);])[
660 /* Do not reclaim the symbols of the rule which action triggered
661 this YYERROR. */
662 yystack.pop (yylen);
663 yylen = 0;
664 yystate = yystack.stateAt (0);
665 label = YYERRLAB1;
666 break;
a0d4650a 667
8405b70c
PB
668 /*-------------------------------------------------------------.
669 | yyerrlab1 -- common code for both syntax error and YYERROR. |
670 `-------------------------------------------------------------*/
671 case YYERRLAB1:
11707b2b 672 yyerrstatus_ = 3; /* Each real token shifted decrements this. */
a0d4650a 673
8405b70c
PB
674 for (;;)
675 {
11707b2b 676 yyn = yypact_[yystate];
f2b30bdf 677 if (!yy_pact_value_is_default_ (yyn))
11707b2b
AD
678 {
679 yyn += yyterror_;
680 if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
681 {
682 yyn = yytable_[yyn];
683 if (0 < yyn)
684 break;
685 }
686 }
687
688 /* Pop the current state because it cannot handle the error token. */
689 if (yystack.height == 1)
690 return false;
691
692 ]b4_locations_if([yyerrloc = yystack.locationAt (0);])[
693 yystack.pop ();
694 yystate = yystack.stateAt (0);
695 if (yydebug > 0)
696 yystack.print (yyDebugStream);
8405b70c 697 }
a0d4650a 698
11707b2b
AD
699 ]b4_locations_if([
700 /* Muck with the stack to setup for yylloc. */
701 yystack.push (0, null, yylloc);
702 yystack.push (0, null, yyerrloc);
8405b70c 703 yyloc = yylloc (yystack, 2);
11707b2b 704 yystack.pop (2);])[
8405b70c
PB
705
706 /* Shift the error token. */
707 yy_symbol_print ("Shifting", yystos_[yyn],
11707b2b 708 yylval]b4_locations_if([, yyloc])[);
a0d4650a 709
8405b70c 710 yystate = yyn;
11707b2b 711 yystack.push (yyn, yylval]b4_locations_if([, yyloc])[);
8405b70c
PB
712 label = YYNEWSTATE;
713 break;
a0d4650a 714
8405b70c
PB
715 /* Accept. */
716 case YYACCEPT:
717 return true;
a0d4650a 718
8405b70c
PB
719 /* Abort. */
720 case YYABORT:
721 return false;
722 }
723 }
724
725 // Generate an error message.
726 private String yysyntax_error (int yystate, int tok)
1979121c
DJ
727 {]b4_error_verbose_if([[
728 if (yyErrorVerbose)
8405b70c 729 {
d2060f06
JD
730 /* There are many possibilities here to consider:
731 - Assume YYFAIL is not used. It's too flawed to consider.
732 See
733 <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
734 for details. YYERROR is fine as it does not invoke this
735 function.
736 - If this state is a consistent state with a default action,
737 then the only way this function was invoked is if the
738 default action is an error action. In that case, don't
739 check for expected tokens because there are none.
740 - The only way there can be no lookahead present (in tok) is
741 if this state is a consistent state with a default action.
742 Thus, detecting the absence of a lookahead is sufficient to
743 determine that there is no unexpected or expected token to
744 report. In that case, just report a simple "syntax error".
745 - Don't assume there isn't a lookahead just because this
746 state is a consistent state with a default action. There
747 might have been a previous inconsistent state, consistent
748 state with a non-default action, or user semantic action
749 that manipulated yychar. (However, yychar is currently out
750 of scope during semantic actions.)
751 - Of course, the expected token list depends on states to
752 have correct lookahead information, and it depends on the
753 parser not to perform extra reductions after fetching a
754 lookahead from the scanner and before detecting a syntax
755 error. Thus, state merging (from LALR or IELR) and default
756 reductions corrupt the expected token list. However, the
757 list is correct for canonical LR with one exception: it
758 will still contain any token that will not be accepted due
759 to an error action in a later state.
760 */
761 if (tok != yyempty_)
8405b70c 762 {
d2060f06
JD
763 // FIXME: This method of building the message is not compatible
764 // with internationalization.
765 StringBuffer res =
766 new StringBuffer ("syntax error, unexpected ");
767 res.append (yytnamerr_ (yytname_[tok]));
768 int yyn = yypact_[yystate];
769 if (!yy_pact_value_is_default_ (yyn))
770 {
b4bbc4a0
JD
771 /* Start YYX at -YYN if negative to avoid negative
772 indexes in YYCHECK. In other words, skip the first
773 -YYN actions for this state because they are default
774 actions. */
775 int yyxbegin = yyn < 0 ? -yyn : 0;
b4bbc4a0
JD
776 /* Stay within bounds of both yycheck and yytname. */
777 int yychecklim = yylast_ - yyn + 1;
778 int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
779 int count = 0;
780 for (int x = yyxbegin; x < yyxend; ++x)
781 if (yycheck_[x + yyn] == x && x != yyterror_
782 && !yy_table_value_is_error_ (yytable_[x + yyn]))
783 ++count;
b4bbc4a0
JD
784 if (count < 5)
785 {
786 count = 0;
787 for (int x = yyxbegin; x < yyxend; ++x)
788 if (yycheck_[x + yyn] == x && x != yyterror_
789 && !yy_table_value_is_error_ (yytable_[x + yyn]))
790 {
791 res.append (count++ == 0 ? ", expecting " : " or ");
792 res.append (yytnamerr_ (yytname_[x]));
793 }
794 }
d2060f06 795 }
2b008529 796 return res.toString ();
8405b70c
PB
797 }
798 }
1979121c 799]])[
8405b70c
PB
800 return "syntax error";
801 }
802
f2b30bdf
JD
803 /**
804 * Whether the given <code>yypact_</code> value indicates a defaulted state.
805 * @@param yyvalue the value to check
806 */
807 private static boolean yy_pact_value_is_default_ (int yyvalue)
808 {
809 return yyvalue == yypact_ninf_;
810 }
811
812 /**
813 * Whether the given <code>yytable_</code> value indicates a syntax error.
814 * @@param yyvalue the value to check
815 */
816 private static boolean yy_table_value_is_error_ (int yyvalue)
817 {
aa0cb40d 818 return yyvalue == yytable_ninf_;
f2b30bdf
JD
819 }
820
8405b70c 821 private static final ]b4_int_type_for([b4_pact])[ yypact_ninf_ = ]b4_pact_ninf[;
8405b70c 822 private static final ]b4_int_type_for([b4_table])[ yytable_ninf_ = ]b4_table_ninf[;
8405b70c 823
2c1bf9bd
AD
824 ]b4_parser_tables_define[
825 ]b4_integral_parser_table_define([token_number], [b4_toknum],
826 [TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
827 to YYLEX-NUM.])[
8405b70c
PB
828
829 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
830 First, the terminals, then, starting at \a yyntokens_, nonterminals. */
2c1bf9bd 831 ]b4_typed_parser_table_define([String], [tname], [b4_tname])[
8405b70c 832
2c1bf9bd
AD
833 ]b4_integral_parser_table_define([rline], [b4_rline],
834 [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[
8405b70c
PB
835
836 // Report on the debug stream that the rule yyrule is going to be reduced.
d3b12988 837 private void yy_reduce_print (int yyrule, YYStack yystack)
8405b70c
PB
838 {
839 if (yydebug == 0)
840 return;
841
842 int yylno = yyrline_[yyrule];
843 int yynrhs = yyr2_[yyrule];
844 /* Print the symbols being reduced, and their result. */
845 yycdebug ("Reducing stack by rule " + (yyrule - 1)
11707b2b 846 + " (line " + yylno + "), ");
8405b70c
PB
847
848 /* The symbols being reduced. */
849 for (int yyi = 0; yyi < yynrhs; yyi++)
850 yy_symbol_print (" $" + (yyi + 1) + " =",
2d404819 851 yystos_[yystack.stateAt(yynrhs - (yyi + 1))],
11707b2b
AD
852 ]b4_rhs_value(yynrhs, yyi + 1)b4_locations_if([,
853 b4_rhs_location(yynrhs, yyi + 1)])[);
8405b70c
PB
854 }
855
856 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
2c1bf9bd 857 ]b4_integral_parser_table_define([translate_table], [b4_translate])[
8405b70c
PB
858
859 private static final ]b4_int_type_for([b4_translate])[ yytranslate_ (int t)
860 {
861 if (t >= 0 && t <= yyuser_token_number_max_)
862 return yytranslate_table_[t];
863 else
864 return yyundef_token_;
865 }
866
867 private static final int yylast_ = ]b4_last[;
868 private static final int yynnts_ = ]b4_nterms_number[;
869 private static final int yyempty_ = -2;
870 private static final int yyfinal_ = ]b4_final_state_number[;
871 private static final int yyterror_ = 1;
872 private static final int yyerrcode_ = 256;
873 private static final int yyntokens_ = ]b4_tokens_number[;
874
875 private static final int yyuser_token_number_max_ = ]b4_user_token_number_max[;
876 private static final int yyundef_token_ = ]b4_undef_token_number[;
877
878]/* User implementation code. */
879b4_percent_code_get[]dnl
880
881}
882
4524c55b 883b4_epilogue[]dnl
8405b70c 884m4_divert_pop(0)dnl