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