Home | History | Annotate | Download | only in data
      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 
     18 m4_include(b4_pkgdatadir/[java.m4])
     19 
     20 b4_defines_if([b4_fatal([%s: %%defines does not make sense in Java], [b4_skeleton])])
     21 m4_ifval(m4_defn([b4_symbol_destructors]),
     22         [b4_fatal([%s: %%destructor does not make sense in Java], [b4_skeleton])],
     23         [])
     24 
     25 b4_output_begin([b4_parser_file_name])
     26 b4_copyright([Skeleton implementation for Bison LALR(1) parsers in Java],
     27              [2007-2012])
     28 
     29 b4_percent_define_ifdef([package], [package b4_percent_define_get([package]);
     30 ])[/* First part of user declarations.  */
     31 ]b4_pre_prologue
     32 b4_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
     39 b4_abstract_if([abstract ])dnl
     40 b4_final_if([final ])dnl
     41 b4_strictfp_if([strictfp ])dnl
     42 [class ]b4_parser_class_name[]dnl
     43 b4_percent_define_get3([extends], [ extends ])dnl
     44 b4_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 
     51 b4_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 
     98 b4_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 
    155 b4_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], [
    460 b4_dollar_pushdef([yylval], [], [yylloc])dnl
    461 /* User initialization code.  */
    462 b4_user_initial_action
    463 b4_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.  */
    922 b4_percent_code_get[]dnl
    923 
    924 }
    925 
    926 b4_epilogue
    927 b4_output_end()
    928