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