1 # Java skeleton
for Bison
-*- autoconf
-*-
3 #
Copyright (C
) 2007-2015 Free Software Foundation
, Inc
.
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
.
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
.
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/>.
18 m4_include(b4_pkgdatadir
/[java
.m4
])
20 b4_defines_if([b4_fatal([%s
: %%defines does not make sense in Java
],
23 # We
do not depend on
%debug in Java
, but pacify warnings about
25 b4_parse_trace_if([0], [0])
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
],
31 [b4_symbol_action_location([$
1], [destructor
])])])])
32 b4_symbol_foreach([b4_symbol_no_destructor_assert
])
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
]]]])
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]])])
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])])
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]])])])
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_
;
70 YYStack yystack
= new YYStack ();
71 int label
= YYNEWSTATE
;
75 ]b4_locations_if([/* The location where the error started. */
76 b4_location_type yyerrloc
= null;
79 b4_location_type yylloc
= new b4_location_type (null, null);])[
81 /* Semantic value of the lookahead. */
82 ]b4_yystype
[ yylval
= null;
85 b4_output_begin([b4_parser_file_name
])
86 b4_copyright([Skeleton implementation
for Bison
LALR(1) parsers in Java
],
89 b4_percent_define_ifdef([package], [package b4_percent_define_get([package]);
90 ])[/* First part of user declarations. */
93 b4_percent_code_get([[imports
]])
95 * A Bison parser, automatically generated from <tt>]m4_bpatsubst(b4_file_name, [^"\(.*\)"$], [\1])[</tt>.
97 * @@author LALR (1) parser skeleton written by Paolo Bonzini.
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 ])[
109 ]b4_error_verbose_if([[
111 * True if verbose error messages are enabled.
113 private boolean yyErrorVerbose
= true;
116 * Return whether verbose error messages are enabled.
118 public final boolean getErrorVerbose() { return yyErrorVerbose
; }
121 * Set the verbosity of error messages.
122 * @@param verbose True to request verbose error messages.
124 public final void setErrorVerbose(boolean verbose
)
125 { yyErrorVerbose
= verbose
; }
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.
135 public class ]b4_location_type
[ {
137 * The first, inclusive, position in the range.
139 public ]b4_position_type
[ begin
;
142 * The first position beyond the range.
144 public ]b4_position_type
[ end
;
147 * Create a <code>]b4_location_type[</code> denoting an empty range located at
149 * @@param loc The position at which the range is anchored.
151 public ]b4_location_type
[ (]b4_position_type
[ loc
) {
152 this.begin
= this.end
= loc
;
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.
160 public ]b4_location_type
[ (]b4_position_type
[ begin
, ]b4_position_type
[ end
) {
166 * Print a representation of the location. For this to be correct,
167 * <code>]b4_position_type[</code> should override the <code>equals</code>
170 public String
toString () {
171 if (begin
.equals (end
))
172 return begin
.toString ();
174 return begin
.toString () + "-" + end
.toString ();
181 private ]b4_location_type
[ yylloc (YYStack rhs
, int n
)
184 return new ]b4_location_type
[ (rhs
.locationAt (n
-1).begin
, rhs
.locationAt (0).end
);
186 return new ]b4_location_type
[ (rhs
.locationAt (0).end
);
190 * Communication interface between the scanner and the Bison-generated
191 * parser <tt>]b4_parser_class_name[</tt>.
193 public interface Lexer
{
194 /** Token returned by the scanner to signal the end of its input. */
195 public static final int EOF
= 0;
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.
203 ]b4_position_type
[ getStartPos ();
206 * Method to retrieve the ending position of the last scanned token.
207 * @@return the first position beyond the last scanned token.
209 ]b4_position_type
[ getEndPos ();]])[
212 * Method to retrieve the semantic value of the last scanned token.
213 * @@return the semantic value of the last scanned token.
215 ]b4_yystype
[ getLVal ();
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.
223 int yylex () ]b4_maybe_throws([b4_lex_throws
])[;
226 * Entry point for error reporting. Emits an error
227 * ]b4_locations_if([referring to the given location ])[in a user-defined way.
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.
233 void yyerror (]b4_locations_if([b4_location_type
[ loc
, ]])[String msg
);]
236 b4_lexer_if([[private class YYLexer
implements Lexer
{
237 ]b4_percent_code_get([[lexer
]])[
241 * The object doing lexical analysis for us.
243 private Lexer yylexer
;
249 * Instantiates the Bison-generated parser.
251 public ]b4_parser_class_name (b4_parse_param_decl([b4_lex_param_decl
])[) ]b4_maybe_throws([b4_init_throws
])[
253 ]b4_percent_code_get([[init
]])[
254 this.yylexer
= new YYLexer(]b4_lex_param_call
[);
255 ]b4_parse_param_cons
[
260 * Instantiates the Bison-generated parser.
261 * @@param yylexer The scanner that will supply tokens to the parser.
263 b4_lexer_if([[protected]], [[public]]) b4_parser_class_name
[ (]b4_parse_param_decl([[Lexer yylexer
]])[) ]b4_maybe_throws([b4_init_throws
])[
265 ]b4_percent_code_get([[init
]])[
266 this.yylexer
= yylexer
;
267 ]b4_parse_param_cons
[
270 private java
.io
.PrintStream yyDebugStream
= System
.err
;
273 * Return the <tt>PrintStream</tt> on which the debugging output is
276 public final java
.io
.PrintStream
getDebugStream () { return yyDebugStream
; }
279 * Set the <tt>PrintStream</tt> on which the debug output is printed.
280 * @@param s The stream that is used for debugging output.
282 public final void setDebugStream(java
.io
.PrintStream s
) { yyDebugStream
= s
; }
284 private int yydebug
= 0;
287 * Answer the verbosity of the debugging output; 0 means that all kinds of
288 * output from the parser are suppressed.
290 public final int getDebugLevel() { return yydebug
; }
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.
297 public final void setDebugLevel(int level
) { yydebug
= level
; }
300 * Print an error message via the lexer.
301 *]b4_locations_if([[ Use a <code>null</code> location.]])[
302 * @@param msg The error message.
304 public final void yyerror (String msg
)
306 yylexer
.yyerror (]b4_locations_if([[(]b4_location_type
[)null, ]])[msg
);
310 * Print an error message via the lexer.
311 * @@param loc The location associated with the message.
312 * @@param msg The error message.
314 public final void yyerror (]b4_location_type
[ loc
, String msg
)
316 yylexer
.yyerror (loc
, msg
);
320 * Print an error message via the lexer.
321 * @@param pos The position associated with the message.
322 * @@param msg The error message.
324 public final void yyerror (]b4_position_type
[ pos
, String msg
)
326 yylexer
.yyerror (new ]b4_location_type
[ (pos
), msg
);
329 [protected final void yycdebug (String s
) {
331 yyDebugStream
.println (s
);
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];
339 public int size
= 16;
340 public int height
= -1;
342 public final void push (int state
, ]b4_yystype
[ value
]dnl
343 b4_locations_if([, ]b4_location_type
[ loc
])[) {
347 int[] newStateStack
= new int[size
* 2];
348 System
.arraycopy (stateStack
, 0, newStateStack
, 0, height
);
349 stateStack
= newStateStack
;
351 ]b4_location_type
[[] newLocStack
= new ]b4_location_type
[[size
* 2];
352 System
.arraycopy (locStack
, 0, newLocStack
, 0, height
);
353 locStack
= newLocStack
;]])
355 b4_yystype
[[] newValueStack
= new ]b4_yystype
[[size
* 2];
356 System
.arraycopy (valueStack
, 0, newValueStack
, 0, height
);
357 valueStack
= newValueStack
;
362 stateStack
[height
] = state
;
363 ]b4_locations_if([[locStack
[height
] = loc
;]])[
364 valueStack
[height
] = value
;
367 public final void pop () {
371 public final void pop (int num
) {
372 // Avoid memory leaks... garbage collection is a white lie!
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);]])[
380 public final int stateAt (int i
) {
381 return stateStack
[height
- i
];
384 ]b4_locations_if([[public final ]b4_location_type
[ locationAt (int i
) {
385 return locStack
[height
- i
];
388 ]])[public final ]b4_yystype
[ valueAt (int i
) {
389 return valueStack
[height
- i
];
392 // Print the state stack on the debug stream.
393 public void print (java
.io
.PrintStream out
)
395 out
.print ("Stack now");
397 for (int i
= 0; i
<= height
; i
++)
400 out
.print (stateStack
[i
]);
407 * Returned by a Bison action in order to stop the parsing process and
408 * return success (<tt>true</tt>).
410 public static final int YYACCEPT
= 0;
413 * Returned by a Bison action in order to stop the parsing process and
414 * return failure (<tt>false</tt>).
416 public static final int YYABORT
= 1;
420 * Returned by a Bison action in order to request a new token.
422 public static final int YYPUSH_MORE
= 4;])[
425 * Returned by a Bison action in order to start error recovery without
426 * printing an error message.
428 public static final int YYERROR
= 2;
431 * Internal return codes that are not supported for user semantic
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. */]])[
442 private int yyerrstatus_
= 0;
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
451 public final boolean recovering ()
453 return yyerrstatus_
== 0;
456 /** Compute post-reduction state.
457 * @@param yystate the current state
458 * @@param yysym the nonterminal to push on the stack
460 private int yy_lr_goto_state_ (int yystate
, int yysym
)
462 int yyr
= yypgoto_
[yysym
- yyntokens_
] + yystate
;
463 if (0 <= yyr
&& yyr
<= yylast_
&& yycheck_
[yyr
] == yystate
)
464 return yytable_
[yyr
];
466 return yydefgoto_
[yysym
- yyntokens_
];
469 private int yyaction (int yyn
, YYStack yystack
, int yylen
) ]b4_maybe_throws([b4_throws
])[
472 ]b4_locations_if([b4_location_type
[ yyloc
= yylloc (yystack
, yylen
);]])[
474 /* If YYLEN is nonzero, implement the default value of the action:
475 '$$ = $1'. Otherwise, use the top of the stack.
477 Otherwise, the following line sets YYVAL to garbage.
478 This behavior is undocumented and Bison
479 users should not rely upon it. */
481 yyval
= yystack
.valueAt (yylen
- 1);
483 yyval
= yystack
.valueAt (0);
485 yy_reduce_print (yyn
, yystack
);
493 yy_symbol_print ("-> $$ =", yyr1_
[yyn
], yyval
]b4_locations_if([, yyloc
])[);
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
])[);
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
)
512 if (yystr
.charAt (0) == '"')
514 StringBuffer yyr
= new StringBuffer ();
515 strip_quotes
: for (int i
= 1; i
< yystr
.length (); i
++)
516 switch (yystr
.charAt (i
))
523 if (yystr
.charAt(++i
) != '\\')
527 yyr
.append (yystr
.charAt (i
));
531 return yyr
.toString ();
534 else if (yystr
.equals ("$end"))
535 return "end of input";
541 /*--------------------------------.
542 | Print this symbol on YYOUTPUT. |
543 `--------------------------------*/
545 private void yy_symbol_print (String s
, int yytype
,
546 ]b4_yystype
[ yyvaluep
]dnl
547 b4_locations_if([, Object yylocationp
])[)
550 yycdebug (s
+ (yytype
< yyntokens_ ?
" token " : " nterm ")
551 + yytname_
[yytype
] + " ("]b4_locations_if([
552 + yylocationp
+ ": "])[
553 + (yyvaluep
== null ?
"(null)" : yyvaluep
.toString ()) + ")");
558 * Parse input from the scanner that was specified at object construction
559 * time. Return whether the end of the input was reached successfully.
561 * @@return <tt>true</tt> if the parsing succeeds. Note that this does not
562 * imply that there were no syntax errors.
564 public boolean parse () ]b4_maybe_throws([b4_list2([b4_lex_throws
], [b4_throws
])])[]])[
567 * Push Parse input from external lexer
569 * @@param yylextoken current token
570 * @@param yylexval current lval
571 ]b4_locations_if([ * @@param yylexloc current position])[
573 * @@return <tt>YYACCEPT, YYABORT, YYPUSH_MORE</tt>
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
])])])[
578 ]b4_locations_if([/* @@$. */
579 b4_location_type yyloc
;])[
582 yycdebug ("Starting parse\n");
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
595 if (!this.push_parse_initialized
)
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
604 yycdebug ("Starting parse\n");
609 boolean push_token_consumed
= true;
614 /* New state. Unlike in the C/C++ skeletons, the state is already
615 pushed when we come here. */
617 yycdebug ("Entering state " + yystate
+ "\n");
619 yystack
.print (yyDebugStream
);
622 if (yystate
== yyfinal_
)
623 ]b4_push_if([{label
= YYACCEPT
; break;}],
626 /* Take a decision. First try without lookahead. */
627 yyn
= yypact_
[yystate
];
628 if (yy_pact_value_is_default_ (yyn
))
633 ]b4_push_if([ /* Fall Through */
636 /* Read a lookahead token. */
637 if (yychar
== yyempty_
)
640 if (!push_token_consumed
)
642 yycdebug ("Reading a token: ");
644 yylval
= yylexval
;]b4_locations_if([
645 yylloc
= yylexloc
;])[
646 push_token_consumed
= false;]])[
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 ());])[
656 /* Convert token to internal form. */
657 if (yychar
<= Lexer
.EOF
)
659 yychar
= yytoken
= Lexer
.EOF
;
660 yycdebug ("Now at end of input.\n");
664 yytoken
= yytranslate_ (yychar
);
665 yy_symbol_print ("Next token is", yytoken
,
666 yylval
]b4_locations_if([, yylloc
])[);
669 /* If the proper action on seeing token YYTOKEN is to reduce or to
670 detect an error, take that action. */
672 if (yyn
< 0 || yylast_
< yyn
|| yycheck_
[yyn
] != yytoken
)
675 /* <= 0 means reduce or error. */
676 else if ((yyn
= yytable_
[yyn
]) <= 0)
678 if (yy_table_value_is_error_ (yyn
))
689 /* Shift the lookahead token. */
690 yy_symbol_print ("Shifting", yytoken
,
691 yylval
]b4_locations_if([, yylloc
])[);
693 /* Discard the token being shifted. */
696 /* Count tokens shifted since error; after three, turn off error
698 if (yyerrstatus_
> 0)
702 yystack
.push (yystate
, yylval
]b4_locations_if([, yylloc
])[);
707 /*-----------------------------------------------------------.
708 | yydefault -- do the default action for the current state. |
709 `-----------------------------------------------------------*/
711 yyn
= yydefact_
[yystate
];
718 /*-----------------------------.
719 | yyreduce -- Do a reduction. |
720 `-----------------------------*/
723 label
= yyaction (yyn
, yystack
, yylen
);
724 yystate
= yystack
.stateAt (0);
727 /*------------------------------------.
728 | yyerrlab -- here on detecting error |
729 `------------------------------------*/
731 /* If not already recovering from an error, report this error. */
732 if (yyerrstatus_
== 0)
735 if (yychar
== yyempty_
)
737 yyerror (]b4_locations_if([yylloc
, ])[yysyntax_error (yystate
, yytoken
));
740 ]b4_locations_if([yyerrloc
= yylloc
;])[
741 if (yyerrstatus_
== 3)
743 /* If just tried and failed to reuse lookahead token after an
744 error, discard it. */
746 if (yychar
<= Lexer
.EOF
)
748 /* Return failure if at end of input. */
749 if (yychar
== Lexer
.EOF
)
750 ]b4_push_if([{label
= YYABORT
; break;}],[return false;])[
756 /* Else will try to reuse lookahead token after shifting the error
761 /*-------------------------------------------------.
762 | errorlab -- error raised explicitly by YYERROR. |
763 `-------------------------------------------------*/
766 ]b4_locations_if([yyerrloc
= yystack
.locationAt (yylen
- 1);])[
767 /* Do not reclaim the symbols of the rule which action triggered
771 yystate
= yystack
.stateAt (0);
775 /*-------------------------------------------------------------.
776 | yyerrlab1 -- common code for both syntax error and YYERROR. |
777 `-------------------------------------------------------------*/
779 yyerrstatus_
= 3; /* Each real token shifted decrements this. */
783 yyn
= yypact_
[yystate
];
784 if (!yy_pact_value_is_default_ (yyn
))
787 if (0 <= yyn
&& yyn
<= yylast_
&& yycheck_
[yyn
] == yyterror_
)
795 /* Pop the current state because it cannot handle the
797 if (yystack
.height
== 0)
798 ]b4_push_if([{label
= YYABORT
; break;}],[return false;])[
800 ]b4_locations_if([yyerrloc
= yystack
.locationAt (0);])[
802 yystate
= yystack
.stateAt (0);
804 yystack
.print (yyDebugStream
);
807 if (label
== YYABORT
)
808 /* Leave the switch. */
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);
818 /* Shift the error token. */
819 yy_symbol_print ("Shifting", yystos_
[yyn
],
820 yylval
]b4_locations_if([, yyloc
])[);
823 yystack
.push (yyn
, yylval
]b4_locations_if([, yyloc
])[);
829 ]b4_push_if([this.push_parse_initialized
= false; return YYACCEPT
;],
834 ]b4_push_if([this.push_parse_initialized
= false; return YYABORT
;],
839 boolean push_parse_initialized
= false;
842 * (Re-)Initialize the state of the push parser.
844 public void push_parse_initialize()
846 /* Lookahead and lookahead in internal form. */
847 this.yychar
= yyempty_
;
854 this.yystack
= new YYStack ();
855 this.label
= YYNEWSTATE
;
857 /* Error handling. */
859 ]b4_locations_if([/* The location where the error started. */
860 this.yyerrloc
= null;
861 this.yylloc
= new b4_location_type (null, null);])[
863 /* Semantic value of the lookahead. */
866 yystack
.push (this.yystate
, this.yylval
]b4_locations_if([, this.yylloc
])[);
868 this.push_parse_initialized
= true;
873 * Push parse given input from an external lexer.
875 * @@param yylextoken current token
876 * @@param yylexval current lval
877 * @@param yyylexpos current position
879 * @@return <tt>YYACCEPT, YYABORT, YYPUSH_MORE</tt>
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
])])
884 return push_parse (yylextoken
, yylexval
, new b4_location_type (yylexpos
));
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.
894 * @@return <tt>true</tt> if the parsing succeeds. Note that this does not
895 * imply that there were no syntax errors.
897 public boolean parse () ]b4_maybe_throws([b4_list2([b4_lex_throws
], [b4_throws
])])[
900 throw new NullPointerException("Null Lexer");
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
);
915 // Generate an error message.
916 private String
yysyntax_error (int yystate
, int tok
)
917 {]b4_error_verbose_if([[
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.
948 /* FIXME: This method of building the message is not compatible
949 with internationalization. */
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
))
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
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_
;
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
]))
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
]))
976 res
.append (count
++ == 0 ?
", expecting " : " or ");
977 res
.append (yytnamerr_ (yytname_
[x
]));
981 return res
.toString ();
985 return "syntax error";
989 * Whether the given <code>yypact_</code> value indicates a defaulted state.
990 * @@param yyvalue the value to check
992 private static boolean yy_pact_value_is_default_ (int yyvalue
)
994 return yyvalue
== yypact_ninf_
;
998 * Whether the given <code>yytable_</code>
999 * value indicates a syntax error.
1000 * @@param yyvalue the value to check
1002 private static boolean yy_table_value_is_error_ (int yyvalue
)
1004 return yyvalue
== yytable_ninf_
;
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
[;
1010 ]b4_parser_tables_define
[
1011 ]b4_integral_parser_table_define([token_number
], [b4_toknum
],
1012 [[YYTOKEN_NUMBER
[YYLEX
-NUM
] -- Internal symbol number corresponding
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
])[
1019 ]b4_integral_parser_table_define([rline
], [b4_rline
],
1020 [[YYRLINE
[YYN
] -- Source line where rule number YYN was defined
.]])[
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
)
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
+ "), ");
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)])[);
1043 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
1044 ]b4_integral_parser_table_define([translate_table
], [b4_translate
])[
1046 private static final ]b4_int_type_for([b4_translate
])[ yytranslate_ (int t
)
1048 if (t
>= 0 && t
<= yyuser_token_number_max_
)
1049 return yytranslate_table_
[t
];
1051 return yyundef_token_
;
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
[;
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
[;
1065 ]/* User implementation code. */
1066 b4_percent_code_get
[]dnl