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