]> git.saurik.com Git - bison.git/blame - src/parse-gram.y
data/Makefile.am (xsltdir): New variable.
[bison.git] / src / parse-gram.y
CommitLineData
12ffdd28 1%{/* Bison Grammar Parser -*- C -*-
a737b216 2
7c0c6181
JD
3 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation,
4 Inc.
e9955c83
AD
5
6 This file is part of Bison, the GNU Compiler Compiler.
7
f16b0819 8 This program is free software: you can redistribute it and/or modify
e9955c83 9 it under the terms of the GNU General Public License as published by
f16b0819 10 the Free Software Foundation, either version 3 of the License, or
e9955c83
AD
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
f16b0819 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
e9955c83 20
2cec9080 21#include <config.h>
e9955c83 22#include "system.h"
3d2cbc26 23
cb48f191
PE
24#include <strverscmp.h>
25
b275314e 26#include "complain.h"
3d2cbc26 27#include "conflicts.h"
e9955c83
AD
28#include "files.h"
29#include "getargs.h"
e9955c83 30#include "gram.h"
3d2cbc26 31#include "muscle_tab.h"
ca407bdf 32#include "quotearg.h"
e9955c83 33#include "reader.h"
3d2cbc26 34#include "symlist.h"
e9071366
AD
35#include "scan-gram.h"
36#include "scan-code.h"
e9955c83 37
b7295522
PE
38#define YYLLOC_DEFAULT(Current, Rhs, N) (Current) = lloc_default (Rhs, N)
39static YYLTYPE lloc_default (YYLTYPE const *, int);
4cdb01db 40
b233d555 41#define YY_LOCATION_PRINT(File, Loc) \
f0064700 42 location_print (File, Loc)
b233d555 43
b50d2359
AD
44static void version_check (location const *loc, char const *version);
45
6e649e65 46/* Request detailed syntax error messages, and pass them to GRAM_ERROR.
ad8a3efc 47 FIXME: depends on the undocumented availability of YYLLOC. */
e9955c83
AD
48#undef yyerror
49#define yyerror(Msg) \
f0064700 50 gram_error (&yylloc, Msg)
3d2cbc26 51static void gram_error (location const *, char const *);
e9955c83 52
33ad1a9c
PE
53static char const *char_name (char);
54
2ce4ed68
AD
55/** Add a lex-param or a parse-param.
56 *
57 * \param type \a lex_param or \a parse_param
58 * \param decl the formal argument
59 * \param loc the location in the source.
60 */
61static void add_param (char const *type, char *decl, location loc);
62
1773ceee 63
04098407 64static symbol_class current_class = unknown_sym;
ddc8ede1 65static uniqstr current_type = NULL;
877519f8
PE
66static symbol *current_lhs;
67static location current_lhs_location;
04098407 68static int current_prec = 0;
d42cf844 69
cb48f191
PE
70#define YYTYPE_INT16 int_fast16_t
71#define YYTYPE_INT8 int_fast8_t
72#define YYTYPE_UINT16 uint_fast16_t
73#define YYTYPE_UINT8 uint_fast8_t
e9955c83
AD
74%}
75
12ffdd28 76%debug
82b248ad 77%verbose
12ffdd28
PE
78%defines
79%locations
80%pure-parser
81%error-verbose
12ffdd28 82%name-prefix="gram_"
219741d8 83%expect 0
12ffdd28 84
cd3684cf
AD
85%initial-action
86{
87 /* Bison's grammar can initial empty locations, hence a default
88 location is needed. */
4a678af8
JD
89 boundary_set (&@$.start, current_file, 1, 1);
90 boundary_set (&@$.end, current_file, 1, 1);
cd3684cf 91}
e9955c83 92
e9955c83
AD
93%union
94{
3d2cbc26
PE
95 symbol *symbol;
96 symbol_list *list;
e9955c83 97 int integer;
eb095650
PE
98 char const *chars;
99 char *code;
3d2cbc26
PE
100 assoc assoc;
101 uniqstr uniqstr;
58d7a1a1 102 unsigned char character;
e9955c83
AD
103};
104
f9a85a15 105/* Define the tokens together with their human representation. */
3d38c03a
AD
106%token GRAM_EOF 0 "end of file"
107%token STRING "string"
3d38c03a 108%token INT "integer"
e9955c83 109
9280d3ef
AD
110%token PERCENT_TOKEN "%token"
111%token PERCENT_NTERM "%nterm"
366eea36 112
9280d3ef 113%token PERCENT_TYPE "%type"
e9071366
AD
114%token PERCENT_DESTRUCTOR "%destructor"
115%token PERCENT_PRINTER "%printer"
366eea36 116
9280d3ef
AD
117%token PERCENT_LEFT "%left"
118%token PERCENT_RIGHT "%right"
119%token PERCENT_NONASSOC "%nonassoc"
04e60654 120
3d38c03a
AD
121%token PERCENT_PREC "%prec"
122%token PERCENT_DPREC "%dprec"
123%token PERCENT_MERGE "%merge"
e9955c83 124
e9955c83 125
ae7453f2
AD
126/*----------------------.
127| Global Declarations. |
128`----------------------*/
129
130%token
136a0f76 131 PERCENT_CODE "%code"
cd3684cf 132 PERCENT_DEBUG "%debug"
39a06c25 133 PERCENT_DEFAULT_PREC "%default-prec"
cd3684cf
AD
134 PERCENT_DEFINE "%define"
135 PERCENT_DEFINES "%defines"
136 PERCENT_ERROR_VERBOSE "%error-verbose"
137 PERCENT_EXPECT "%expect"
d6328241 138 PERCENT_EXPECT_RR "%expect-rr"
cd3684cf
AD
139 PERCENT_FILE_PREFIX "%file-prefix"
140 PERCENT_GLR_PARSER "%glr-parser"
e9071366 141 PERCENT_INITIAL_ACTION "%initial-action"
0e021770 142 PERCENT_LANGUAGE "%language"
e9071366 143 PERCENT_LEX_PARAM "%lex-param"
cd3684cf
AD
144 PERCENT_LOCATIONS "%locations"
145 PERCENT_NAME_PREFIX "%name-prefix"
22fccf95 146 PERCENT_NO_DEFAULT_PREC "%no-default-prec"
cd3684cf
AD
147 PERCENT_NO_LINES "%no-lines"
148 PERCENT_NONDETERMINISTIC_PARSER
f0064700 149 "%nondeterministic-parser"
cd3684cf 150 PERCENT_OUTPUT "%output"
e9071366 151 PERCENT_PARSE_PARAM "%parse-param"
cd3684cf 152 PERCENT_PURE_PARSER "%pure-parser"
31c10e38 153 PERCENT_PUSH_PARSER "%push-parser"
7172e23e
JD
154 PERCENT_PUSH_PULL_PARSER
155 "%push-pull-parser"
f0064700 156 PERCENT_REQUIRE "%require"
cd3684cf
AD
157 PERCENT_SKELETON "%skeleton"
158 PERCENT_START "%start"
159 PERCENT_TOKEN_TABLE "%token-table"
160 PERCENT_VERBOSE "%verbose"
161 PERCENT_YACC "%yacc"
ae7453f2 162;
e9955c83 163
58d7a1a1
AD
164%token BRACED_CODE "{...}"
165%token CHAR "char"
166%token EPILOGUE "epilogue"
3d38c03a 167%token EQUAL "="
3d38c03a 168%token ID "identifier"
b7295522 169%token ID_COLON "identifier:"
e9955c83 170%token PERCENT_PERCENT "%%"
58d7a1a1 171%token PIPE "|"
3d38c03a 172%token PROLOGUE "%{...%}"
58d7a1a1
AD
173%token SEMICOLON ";"
174%token TYPE "type"
12e35840 175%token TYPE_TAG_ANY "<*>"
3ebecc24 176%token TYPE_TAG_NONE "<>"
58d7a1a1
AD
177
178%type <character> CHAR
33ad1a9c 179%printer { fputs (char_name ($$), stderr); } CHAR
3d38c03a 180
2ce4ed68 181/* braceless is not to be used for rule or symbol actions, as it
7c0c6181 182 calls code_props_plain_init. */
6afc30cc 183%type <chars> STRING "%{...%}" EPILOGUE braceless content.opt
eb095650 184%type <code> "{...}"
33ad1a9c 185%printer { fputs (quotearg_style (c_quoting_style, $$), stderr); }
eb095650 186 STRING
2ce4ed68 187%printer { fprintf (stderr, "{\n%s\n}", $$); }
6afc30cc 188 braceless content.opt "{...}" "%{...%}" EPILOGUE
58d7a1a1 189
16dc6a9e 190%type <uniqstr> TYPE ID ID_COLON variable
82b248ad 191%printer { fprintf (stderr, "<%s>", $$); } TYPE
16dc6a9e 192%printer { fputs ($$, stderr); } ID variable
58d7a1a1
AD
193%printer { fprintf (stderr, "%s:", $$); } ID_COLON
194
e9955c83 195%type <integer> INT
82b248ad 196%printer { fprintf (stderr, "%d", $$); } INT
58d7a1a1
AD
197
198%type <symbol> id id_colon symbol string_as_id
199%printer { fprintf (stderr, "%s", $$->tag); } id symbol string_as_id
200%printer { fprintf (stderr, "%s:", $$->tag); } id_colon
201
2c569025 202%type <assoc> precedence_declarator
3be03b13 203%type <list> symbols.1 generic_symlist generic_symlist_item
e9955c83 204%%
2c569025 205
8efe435c 206input:
2ce4ed68 207 prologue_declarations "%%" grammar epilogue.opt
e9955c83
AD
208;
209
2c569025
AD
210
211 /*------------------------------------.
212 | Declarations: before the first %%. |
213 `------------------------------------*/
214
2ce4ed68 215prologue_declarations:
e9955c83 216 /* Nothing */
2ce4ed68 217| prologue_declarations prologue_declaration
e9955c83
AD
218;
219
2ce4ed68 220prologue_declaration:
2c569025 221 grammar_declaration
7c0c6181
JD
222| "%{...%}"
223 {
224 code_props plain_code;
225 code_props_plain_init (&plain_code, $1, @1);
226 code_props_translate_code (&plain_code);
227 gram_scanner_last_string_free ();
7ecec4dd
JD
228 muscle_code_grow (union_seen ? "post_prologue" : "pre_prologue",
229 plain_code.code, @1);
7c0c6181
JD
230 code_scanner_last_string_free ();
231 }
2ce4ed68 232| "%debug" { debug_flag = true; }
16dc6a9e 233| "%define" variable content.opt
7eb8a0bc 234 {
9611cfa2 235 muscle_percent_define_insert ($2, @2, $3);
7eb8a0bc 236 }
2ce4ed68 237| "%defines" { defines_flag = true; }
02975b9a
JD
238| "%defines" STRING
239 {
240 defines_flag = true;
241 spec_defines_file = xstrdup ($2);
242 }
2ce4ed68
AD
243| "%error-verbose" { error_verbose = true; }
244| "%expect" INT { expected_sr_conflicts = $2; }
245| "%expect-rr" INT { expected_rr_conflicts = $2; }
02975b9a
JD
246| "%file-prefix" STRING { spec_file_prefix = $2; }
247| "%file-prefix" "=" STRING { spec_file_prefix = $3; } /* deprecated */
cd3684cf 248| "%glr-parser"
c66dfadd
PE
249 {
250 nondeterministic_parser = true;
251 glr_parser = true;
252 }
e9071366 253| "%initial-action" "{...}"
c66dfadd 254 {
7c0c6181
JD
255 code_props action;
256 code_props_symbol_action_init (&action, $2, @2);
257 code_props_translate_code (&action);
258 gram_scanner_last_string_free ();
259 muscle_code_grow ("initial_action", action.code, @2);
260 code_scanner_last_string_free ();
c66dfadd 261 }
0e021770 262| "%language" STRING { language_argmatch ($2, 1, &@1); }
2ce4ed68
AD
263| "%lex-param" "{...}" { add_param ("lex_param", $2, @2); }
264| "%locations" { locations_flag = true; }
02975b9a
JD
265| "%name-prefix" STRING { spec_name_prefix = $2; }
266| "%name-prefix" "=" STRING { spec_name_prefix = $3; } /* deprecated */
2ce4ed68
AD
267| "%no-lines" { no_lines_flag = true; }
268| "%nondeterministic-parser" { nondeterministic_parser = true; }
02975b9a
JD
269| "%output" STRING { spec_outfile = $2; }
270| "%output" "=" STRING { spec_outfile = $3; } /* deprecated */
2ce4ed68
AD
271| "%parse-param" "{...}" { add_param ("parse_param", $2, @2); }
272| "%pure-parser" { pure_parser = true; }
7172e23e
JD
273| "%push-parser" { push_parser = true; pull_parser = false; }
274| "%push-pull-parser" { push_parser = true; pull_parser = true; }
2ce4ed68 275| "%require" STRING { version_check (&@2, $2); }
a7867f53
JD
276| "%skeleton" STRING
277 {
278 char const *skeleton_user = $2;
279 if (strchr (skeleton_user, '/'))
280 {
281 size_t dir_length = strlen (current_file);
282 char *skeleton_build;
283 while (dir_length && current_file[dir_length - 1] != '/')
284 --dir_length;
285 while (dir_length && current_file[dir_length - 1] == '/')
286 --dir_length;
287 skeleton_build =
288 xmalloc (dir_length + 1 + strlen (skeleton_user) + 1);
289 if (dir_length > 0)
290 {
291 strncpy (skeleton_build, current_file, dir_length);
292 skeleton_build[dir_length++] = '/';
293 }
294 strcpy (skeleton_build + dir_length, skeleton_user);
295 skeleton_user = uniqstr_new (skeleton_build);
296 free (skeleton_build);
297 }
298 skeleton_arg (skeleton_user, 1, &@1);
299 }
2ce4ed68
AD
300| "%token-table" { token_table_flag = true; }
301| "%verbose" { report_flag = report_states; }
302| "%yacc" { yacc_flag = true; }
cd3684cf 303| /*FIXME: Err? What is this horror doing here? */ ";"
e9955c83
AD
304;
305
2c569025
AD
306grammar_declaration:
307 precedence_declaration
308| symbol_declaration
e9955c83
AD
309| "%start" symbol
310 {
8efe435c 311 grammar_start_symbol_set ($2, @2);
e9955c83 312 }
3be03b13 313| "%destructor" "{...}" generic_symlist
9280d3ef 314 {
3d2cbc26 315 symbol_list *list;
e9071366 316 for (list = $3; list; list = list->next)
7c0c6181 317 symbol_list_destructor_set (list, $2, @2);
e9071366 318 symbol_list_free ($3);
9280d3ef 319 }
3be03b13 320| "%printer" "{...}" generic_symlist
366eea36 321 {
3d2cbc26 322 symbol_list *list;
e9071366 323 for (list = $3; list; list = list->next)
7c0c6181 324 symbol_list_printer_set (list, $2, @2);
e9071366 325 symbol_list_free ($3);
366eea36 326 }
22fccf95 327| "%default-prec"
39a06c25 328 {
22fccf95
PE
329 default_prec = true;
330 }
331| "%no-default-prec"
332 {
333 default_prec = false;
39a06c25 334 }
8e0a5e9e
JD
335| "%code" braceless
336 {
9611cfa2
JD
337 /* Do not invoke muscle_percent_code_grow here since it invokes
338 muscle_user_name_list_grow. */
592d0b1e 339 muscle_code_grow ("percent_code()", $2, @2);
8e0a5e9e
JD
340 code_scanner_last_string_free ();
341 }
16dc6a9e 342| "%code" ID braceless
8e0a5e9e 343 {
9611cfa2 344 muscle_percent_code_grow ($2, @2, $3, @3);
8e0a5e9e 345 code_scanner_last_string_free ();
8e0a5e9e 346 }
2c569025
AD
347;
348
58d7a1a1
AD
349
350/*----------*
351 | %union. |
352 *----------*/
353
354%token PERCENT_UNION "%union";
355
356union_name:
357 /* Nothing. */ {}
358| ID { muscle_code_grow ("union_name", $1, @1); }
359;
360
361grammar_declaration:
7ecec4dd 362 "%union" union_name braceless
58d7a1a1 363 {
ddc8ede1 364 union_seen = true;
7ecec4dd
JD
365 muscle_code_grow ("stype", $3, @3);
366 code_scanner_last_string_free ();
58d7a1a1
AD
367 }
368;
369
370
371
372
2c569025
AD
373symbol_declaration:
374 "%nterm" { current_class = nterm_sym; } symbol_defs.1
e9955c83
AD
375 {
376 current_class = unknown_sym;
377 current_type = NULL;
378 }
2c569025 379| "%token" { current_class = token_sym; } symbol_defs.1
e9955c83 380 {
2c569025 381 current_class = unknown_sym;
e9955c83
AD
382 current_type = NULL;
383 }
1e0bab92 384| "%type" TYPE symbols.1
e9955c83 385 {
3d2cbc26 386 symbol_list *list;
4f82b42a 387 tag_seen = true;
1e0bab92 388 for (list = $3; list; list = list->next)
3be03b13 389 symbol_type_set (list->content.sym, $2, @2);
dafdc66f 390 symbol_list_free ($3);
e9955c83
AD
391 }
392;
393
2c569025 394precedence_declaration:
1e0bab92
AD
395 precedence_declarator type.opt symbols.1
396 {
3d2cbc26 397 symbol_list *list;
1e0bab92
AD
398 ++current_prec;
399 for (list = $3; list; list = list->next)
400 {
3be03b13
JD
401 symbol_type_set (list->content.sym, current_type, @2);
402 symbol_precedence_set (list->content.sym, current_prec, $1, @1);
1e0bab92 403 }
dafdc66f 404 symbol_list_free ($3);
1e0bab92
AD
405 current_type = NULL;
406 }
e9955c83
AD
407;
408
2c569025 409precedence_declarator:
e9955c83
AD
410 "%left" { $$ = left_assoc; }
411| "%right" { $$ = right_assoc; }
412| "%nonassoc" { $$ = non_assoc; }
413;
414
415type.opt:
87fbb0bf 416 /* Nothing. */ { current_type = NULL; }
ddc8ede1 417| TYPE { current_type = $1; tag_seen = true; }
e9955c83
AD
418;
419
3be03b13 420/* One or more symbols to be %typed. */
1e0bab92 421symbols.1:
3be03b13
JD
422 symbol
423 { $$ = symbol_list_sym_new ($1, @1); }
424| symbols.1 symbol
425 { $$ = symbol_list_prepend ($1, symbol_list_sym_new ($2, @2)); }
426;
427
428generic_symlist:
429 generic_symlist_item { $$ = $1; }
430| generic_symlist generic_symlist_item { $$ = symbol_list_prepend ($1, $2); }
431;
432
433generic_symlist_item:
434 symbol { $$ = symbol_list_sym_new ($1, @1); }
435| TYPE { $$ = symbol_list_type_new ($1, @1); }
12e35840 436| "<*>" { $$ = symbol_list_default_tagged_new (@1); }
3ebecc24 437| "<>" { $$ = symbol_list_default_tagless_new (@1); }
e9955c83
AD
438;
439
e9955c83
AD
440/* One token definition. */
441symbol_def:
442 TYPE
443 {
444 current_type = $1;
ddc8ede1 445 tag_seen = true;
e9955c83 446 }
58d7a1a1 447| id
e9955c83 448 {
073f9288 449 symbol_class_set ($1, current_class, @1, true);
1a31ed21 450 symbol_type_set ($1, current_type, @1);
e9955c83 451 }
58d7a1a1 452| id INT
e9955c83 453 {
073f9288 454 symbol_class_set ($1, current_class, @1, true);
1a31ed21 455 symbol_type_set ($1, current_type, @1);
e776192e 456 symbol_user_token_number_set ($1, $2, @2);
e9955c83 457 }
58d7a1a1 458| id string_as_id
e9955c83 459 {
073f9288 460 symbol_class_set ($1, current_class, @1, true);
1a31ed21 461 symbol_type_set ($1, current_type, @1);
a5d50994 462 symbol_make_alias ($1, $2, @$);
e9955c83 463 }
58d7a1a1 464| id INT string_as_id
e9955c83 465 {
073f9288 466 symbol_class_set ($1, current_class, @1, true);
1a31ed21 467 symbol_type_set ($1, current_type, @1);
e776192e 468 symbol_user_token_number_set ($1, $2, @2);
a5d50994 469 symbol_make_alias ($1, $3, @$);
e9955c83
AD
470 }
471;
472
473/* One or more symbol definitions. */
474symbol_defs.1:
475 symbol_def
e9955c83 476| symbol_defs.1 symbol_def
e9955c83
AD
477;
478
2c569025
AD
479
480 /*------------------------------------------.
481 | The grammar section: between the two %%. |
482 `------------------------------------------*/
483
484grammar:
1921f1d7
AD
485 rules_or_grammar_declaration
486| grammar rules_or_grammar_declaration
487;
488
489/* As a Bison extension, one can use the grammar declarations in the
b7295522 490 body of the grammar. */
1921f1d7 491rules_or_grammar_declaration:
e9955c83 492 rules
8d0a98bb 493| grammar_declaration ";"
b275314e
AD
494| error ";"
495 {
496 yyerrok;
497 }
e9955c83
AD
498;
499
500rules:
58d7a1a1 501 id_colon { current_lhs = $1; current_lhs_location = @1; } rhses.1
e9955c83
AD
502;
503
504rhses.1:
8f3596a6
AD
505 rhs { grammar_current_rule_end (@1); }
506| rhses.1 "|" rhs { grammar_current_rule_end (@3); }
8d0a98bb 507| rhses.1 ";"
e9955c83
AD
508;
509
510rhs:
511 /* Nothing. */
8f3596a6 512 { grammar_current_rule_begin (current_lhs, current_lhs_location); }
e9955c83 513| rhs symbol
8efe435c 514 { grammar_current_rule_symbol_append ($2, @2); }
e9071366 515| rhs "{...}"
381ecb06 516 { grammar_current_rule_action_append ($2, @2); }
e9955c83 517| rhs "%prec" symbol
e776192e 518 { grammar_current_rule_prec_set ($3, @3); }
676385e2
PH
519| rhs "%dprec" INT
520 { grammar_current_rule_dprec_set ($3, @3); }
521| rhs "%merge" TYPE
522 { grammar_current_rule_merge_set ($3, @3); }
e9955c83
AD
523;
524
58d7a1a1 525
16dc6a9e
JD
526/*----------------------------*
527 | variable and content.opt. |
528 *---------------------------*/
529
530variable:
531 ID
532 | STRING { $$ = uniqstr_new ($1); } /* deprecated and not M4-friendly */
533 ;
2ce4ed68 534
592d0b1e 535/* Some content or empty by default. */
2ce4ed68
AD
536content.opt:
537 /* Nothing. */
538 {
592d0b1e 539 $$ = "";
2ce4ed68 540 }
6afc30cc 541| STRING
2ce4ed68
AD
542;
543
544
6afc30cc
JD
545/*-------------*
546 | braceless. |
547 *-------------*/
548
2ce4ed68
AD
549braceless:
550 "{...}"
551 {
7c0c6181 552 code_props plain_code;
2ce4ed68 553 $1[strlen ($1) - 1] = '\n';
7c0c6181
JD
554 code_props_plain_init (&plain_code, $1+1, @1);
555 code_props_translate_code (&plain_code);
556 gram_scanner_last_string_free ();
557 $$ = plain_code.code;
2ce4ed68
AD
558 }
559;
560
561
58d7a1a1
AD
562/*---------------*
563 | Identifiers. |
564 *---------------*/
565
33ad1a9c
PE
566/* Identifiers are returned as uniqstr values by the scanner.
567 Depending on their use, we may need to make them genuine symbols. */
58d7a1a1
AD
568
569id:
33ad1a9c 570 ID
203b9274 571 { $$ = symbol_from_uniqstr ($1, @1); }
33ad1a9c
PE
572| CHAR
573 {
574 $$ = symbol_get (char_name ($1), @1);
575 symbol_class_set ($$, token_sym, @1, false);
576 symbol_user_token_number_set ($$, $1, @1);
577 }
58d7a1a1
AD
578;
579
580id_colon:
203b9274 581 ID_COLON { $$ = symbol_from_uniqstr ($1, @1); }
58d7a1a1
AD
582;
583
584
e9955c83 585symbol:
58d7a1a1
AD
586 id
587| string_as_id
e9955c83
AD
588;
589
ca407bdf 590/* A string used as an ID: quote it. */
e9955c83
AD
591string_as_id:
592 STRING
593 {
ca407bdf 594 $$ = symbol_get (quotearg_style (c_quoting_style, $1), @1);
db89d400 595 symbol_class_set ($$, token_sym, @1, false);
e9955c83
AD
596 }
597;
598
e9955c83
AD
599epilogue.opt:
600 /* Nothing. */
e9955c83
AD
601| "%%" EPILOGUE
602 {
7c0c6181
JD
603 code_props plain_code;
604 code_props_plain_init (&plain_code, $2, @2);
605 code_props_translate_code (&plain_code);
e9071366 606 gram_scanner_last_string_free ();
7c0c6181
JD
607 muscle_code_grow ("epilogue", plain_code.code, @2);
608 code_scanner_last_string_free ();
e9955c83
AD
609 }
610;
611
e9955c83 612%%
b7295522
PE
613
614
615/* Return the location of the left-hand side of a rule whose
616 right-hand side is RHS[1] ... RHS[N]. Ignore empty nonterminals in
617 the right-hand side, and return an empty location equal to the end
618 boundary of RHS[0] if the right-hand side is empty. */
619
620static YYLTYPE
621lloc_default (YYLTYPE const *rhs, int n)
622{
623 int i;
a737b216 624 YYLTYPE loc;
62cb8a99
PE
625
626 /* SGI MIPSpro 7.4.1m miscompiles "loc.start = loc.end = rhs[n].end;".
627 The bug is fixed in 7.4.2m, but play it safe for now. */
628 loc.start = rhs[n].end;
629 loc.end = rhs[n].end;
b7295522 630
5320ca4d
PE
631 /* Ignore empty nonterminals the start of the the right-hand side.
632 Do not bother to ignore them at the end of the right-hand side,
633 since empty nonterminals have the same end as their predecessors. */
b7295522
PE
634 for (i = 1; i <= n; i++)
635 if (! equal_boundaries (rhs[i].start, rhs[i].end))
636 {
a737b216 637 loc.start = rhs[i].start;
b7295522
PE
638 break;
639 }
640
a737b216 641 return loc;
b7295522
PE
642}
643
644
645/* Add a lex-param or a parse-param (depending on TYPE) with
646 declaration DECL and location LOC. */
647
1773ceee 648static void
e9ce5688 649add_param (char const *type, char *decl, location loc)
1773ceee 650{
ead9e56e 651 static char const alphanum[26 + 26 + 1 + 10] =
1773ceee
PE
652 "abcdefghijklmnopqrstuvwxyz"
653 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
ead9e56e
PE
654 "_"
655 "0123456789";
1773ceee 656 char const *name_start = NULL;
e9ce5688 657 char *p;
1773ceee 658
e503aa60
AD
659 /* Stop on last actual character. */
660 for (p = decl; p[1]; p++)
ead9e56e
PE
661 if ((p == decl
662 || ! memchr (alphanum, p[-1], sizeof alphanum))
663 && memchr (alphanum, p[0], sizeof alphanum - 10))
1773ceee
PE
664 name_start = p;
665
ead9e56e
PE
666 /* Strip the surrounding '{' and '}', and any blanks just inside
667 the braces. */
668 while (*--p == ' ' || *p == '\t')
669 continue;
e503aa60 670 p[1] = '\0';
ead9e56e
PE
671 while (*++decl == ' ' || *decl == '\t')
672 continue;
e9ce5688 673
1773ceee
PE
674 if (! name_start)
675 complain_at (loc, _("missing identifier in parameter declaration"));
676 else
677 {
678 char *name;
679 size_t name_len;
680
681 for (name_len = 1;
ead9e56e 682 memchr (alphanum, name_start[name_len], sizeof alphanum);
1773ceee
PE
683 name_len++)
684 continue;
685
686 name = xmalloc (name_len + 1);
687 memcpy (name, name_start, name_len);
688 name[name_len] = '\0';
689 muscle_pair_list_grow (type, decl, name);
690 free (name);
691 }
692
e9071366 693 gram_scanner_last_string_free ();
1773ceee
PE
694}
695
2ce4ed68 696
b50d2359
AD
697static void
698version_check (location const *loc, char const *version)
699{
700 if (strverscmp (version, PACKAGE_VERSION) > 0)
9b8a5ce0
AD
701 {
702 complain_at (*loc, "require bison %s, but have %s",
703 version, PACKAGE_VERSION);
704 exit (63);
705 }
b50d2359
AD
706}
707
1fec91df 708static void
3d2cbc26 709gram_error (location const *loc, char const *msg)
e9955c83 710{
ad8a3efc 711 complain_at (*loc, "%s", msg);
e9955c83 712}
e9ce5688
PE
713
714char const *
715token_name (int type)
716{
fc01665e 717 return yytname[YYTRANSLATE (type)];
e9ce5688 718}
33ad1a9c
PE
719
720static char const *
721char_name (char c)
722{
723 if (c == '\'')
724 return "'\\''";
725 else
726 {
727 char buf[4];
728 buf[0] = '\''; buf[1] = c; buf[2] = '\''; buf[3] = '\0';
729 return quotearg_style (escape_quoting_style, buf);
730 }
731}