]> git.saurik.com Git - bison.git/blame - src/parse-gram.y
Makefile: introduce $(BISON).
[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"
3d2cbc26 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 {
9611cfa2 232 muscle_percent_define_insert ($2, @2, $3);
7eb8a0bc 233 }
2ce4ed68 234| "%defines" { defines_flag = true; }
02975b9a
JD
235| "%defines" STRING
236 {
237 defines_flag = true;
238 spec_defines_file = xstrdup ($2);
239 }
2ce4ed68
AD
240| "%expect" INT { expected_sr_conflicts = $2; }
241| "%expect-rr" INT { expected_rr_conflicts = $2; }
02975b9a
JD
242| "%file-prefix" STRING { spec_file_prefix = $2; }
243| "%file-prefix" "=" STRING { spec_file_prefix = $3; } /* deprecated */
cd3684cf 244| "%glr-parser"
c66dfadd
PE
245 {
246 nondeterministic_parser = true;
247 glr_parser = true;
248 }
e9071366 249| "%initial-action" "{...}"
c66dfadd 250 {
7c0c6181
JD
251 code_props action;
252 code_props_symbol_action_init (&action, $2, @2);
253 code_props_translate_code (&action);
254 gram_scanner_last_string_free ();
255 muscle_code_grow ("initial_action", action.code, @2);
256 code_scanner_last_string_free ();
c66dfadd 257 }
51365192 258| "%language" STRING { language_argmatch ($2, grammar_prio, @1); }
2ce4ed68 259| "%lex-param" "{...}" { add_param ("lex_param", $2, @2); }
02975b9a
JD
260| "%name-prefix" STRING { spec_name_prefix = $2; }
261| "%name-prefix" "=" STRING { spec_name_prefix = $3; } /* deprecated */
2ce4ed68
AD
262| "%no-lines" { no_lines_flag = true; }
263| "%nondeterministic-parser" { nondeterministic_parser = true; }
02975b9a
JD
264| "%output" STRING { spec_outfile = $2; }
265| "%output" "=" STRING { spec_outfile = $3; } /* deprecated */
2ce4ed68 266| "%parse-param" "{...}" { add_param ("parse_param", $2, @2); }
2ce4ed68 267| "%require" STRING { version_check (&@2, $2); }
a7867f53
JD
268| "%skeleton" STRING
269 {
270 char const *skeleton_user = $2;
271 if (strchr (skeleton_user, '/'))
272 {
273 size_t dir_length = strlen (current_file);
274 char *skeleton_build;
275 while (dir_length && current_file[dir_length - 1] != '/')
276 --dir_length;
277 while (dir_length && current_file[dir_length - 1] == '/')
278 --dir_length;
279 skeleton_build =
280 xmalloc (dir_length + 1 + strlen (skeleton_user) + 1);
281 if (dir_length > 0)
282 {
283 strncpy (skeleton_build, current_file, dir_length);
284 skeleton_build[dir_length++] = '/';
285 }
286 strcpy (skeleton_build + dir_length, skeleton_user);
287 skeleton_user = uniqstr_new (skeleton_build);
288 free (skeleton_build);
289 }
51365192 290 skeleton_arg (skeleton_user, grammar_prio, @1);
a7867f53 291 }
2ce4ed68 292| "%token-table" { token_table_flag = true; }
ef1b4273 293| "%verbose" { report_flag |= report_states; }
2ce4ed68 294| "%yacc" { yacc_flag = true; }
cd3684cf 295| /*FIXME: Err? What is this horror doing here? */ ";"
e9955c83
AD
296;
297
2c569025
AD
298grammar_declaration:
299 precedence_declaration
300| symbol_declaration
e9955c83
AD
301| "%start" symbol
302 {
8efe435c 303 grammar_start_symbol_set ($2, @2);
e9955c83 304 }
3be03b13 305| "%destructor" "{...}" generic_symlist
9280d3ef 306 {
3d2cbc26 307 symbol_list *list;
e9071366 308 for (list = $3; list; list = list->next)
7c0c6181 309 symbol_list_destructor_set (list, $2, @2);
e9071366 310 symbol_list_free ($3);
9280d3ef 311 }
3be03b13 312| "%printer" "{...}" generic_symlist
366eea36 313 {
3d2cbc26 314 symbol_list *list;
e9071366 315 for (list = $3; list; list = list->next)
7c0c6181 316 symbol_list_printer_set (list, $2, @2);
e9071366 317 symbol_list_free ($3);
366eea36 318 }
22fccf95 319| "%default-prec"
39a06c25 320 {
22fccf95
PE
321 default_prec = true;
322 }
323| "%no-default-prec"
324 {
325 default_prec = false;
39a06c25 326 }
8e0a5e9e
JD
327| "%code" braceless
328 {
9611cfa2
JD
329 /* Do not invoke muscle_percent_code_grow here since it invokes
330 muscle_user_name_list_grow. */
592d0b1e 331 muscle_code_grow ("percent_code()", $2, @2);
8e0a5e9e
JD
332 code_scanner_last_string_free ();
333 }
16dc6a9e 334| "%code" ID braceless
8e0a5e9e 335 {
9611cfa2 336 muscle_percent_code_grow ($2, @2, $3, @3);
8e0a5e9e 337 code_scanner_last_string_free ();
8e0a5e9e 338 }
2c569025
AD
339;
340
58d7a1a1 341
3c262606
AD
342/*---------.
343| %union. |
344`---------*/
58d7a1a1
AD
345
346%token PERCENT_UNION "%union";
347
348union_name:
349 /* Nothing. */ {}
350| ID { muscle_code_grow ("union_name", $1, @1); }
351;
352
353grammar_declaration:
7ecec4dd 354 "%union" union_name braceless
58d7a1a1 355 {
ddc8ede1 356 union_seen = true;
7ecec4dd
JD
357 muscle_code_grow ("stype", $3, @3);
358 code_scanner_last_string_free ();
58d7a1a1
AD
359 }
360;
361
362
363
364
2c569025
AD
365symbol_declaration:
366 "%nterm" { current_class = nterm_sym; } symbol_defs.1
e9955c83
AD
367 {
368 current_class = unknown_sym;
369 current_type = NULL;
370 }
2c569025 371| "%token" { current_class = token_sym; } symbol_defs.1
e9955c83 372 {
2c569025 373 current_class = unknown_sym;
e9955c83
AD
374 current_type = NULL;
375 }
cb823b6f 376| "%type" TAG symbols.1
e9955c83 377 {
3d2cbc26 378 symbol_list *list;
4f82b42a 379 tag_seen = true;
1e0bab92 380 for (list = $3; list; list = list->next)
3be03b13 381 symbol_type_set (list->content.sym, $2, @2);
dafdc66f 382 symbol_list_free ($3);
e9955c83
AD
383 }
384;
385
2c569025 386precedence_declaration:
cb823b6f 387 precedence_declarator tag.opt symbols.prec
1e0bab92 388 {
3d2cbc26 389 symbol_list *list;
1e0bab92
AD
390 ++current_prec;
391 for (list = $3; list; list = list->next)
392 {
3be03b13
JD
393 symbol_type_set (list->content.sym, current_type, @2);
394 symbol_precedence_set (list->content.sym, current_prec, $1, @1);
1e0bab92 395 }
dafdc66f 396 symbol_list_free ($3);
1e0bab92
AD
397 current_type = NULL;
398 }
e9955c83
AD
399;
400
2c569025 401precedence_declarator:
d78f0ac9
AD
402 "%left" { $$ = left_assoc; }
403| "%right" { $$ = right_assoc; }
404| "%nonassoc" { $$ = non_assoc; }
405| "%precedence" { $$ = precedence_assoc; }
e9955c83
AD
406;
407
cb823b6f 408tag.opt:
87fbb0bf 409 /* Nothing. */ { current_type = NULL; }
cb823b6f 410| TAG { current_type = $1; tag_seen = true; }
e9955c83
AD
411;
412
ab7f29f8
JD
413/* Just like symbols.1 but accept INT for the sake of POSIX. */
414symbols.prec:
415 symbol.prec
416 { $$ = symbol_list_sym_new ($1, @1); }
417| symbols.prec symbol.prec
418 { $$ = symbol_list_prepend ($1, symbol_list_sym_new ($2, @2)); }
419;
420
421symbol.prec:
422 symbol { $$ = $1; }
423 | symbol INT { $$ = $1; symbol_user_token_number_set ($1, $2, @2); }
424 ;
425
3be03b13 426/* One or more symbols to be %typed. */
1e0bab92 427symbols.1:
3be03b13
JD
428 symbol
429 { $$ = symbol_list_sym_new ($1, @1); }
430| symbols.1 symbol
431 { $$ = symbol_list_prepend ($1, symbol_list_sym_new ($2, @2)); }
432;
433
434generic_symlist:
435 generic_symlist_item { $$ = $1; }
436| generic_symlist generic_symlist_item { $$ = symbol_list_prepend ($1, $2); }
437;
438
439generic_symlist_item:
cb823b6f
AD
440 symbol { $$ = symbol_list_sym_new ($1, @1); }
441| TAG { $$ = symbol_list_type_new ($1, @1); }
442| "<*>" { $$ = symbol_list_default_tagged_new (@1); }
443| "<>" { $$ = symbol_list_default_tagless_new (@1); }
e9955c83
AD
444;
445
e9955c83
AD
446/* One token definition. */
447symbol_def:
cb823b6f 448 TAG
e9955c83
AD
449 {
450 current_type = $1;
ddc8ede1 451 tag_seen = true;
e9955c83 452 }
58d7a1a1 453| id
e9955c83 454 {
073f9288 455 symbol_class_set ($1, current_class, @1, true);
1a31ed21 456 symbol_type_set ($1, current_type, @1);
e9955c83 457 }
58d7a1a1 458| id INT
e9955c83 459 {
073f9288 460 symbol_class_set ($1, current_class, @1, true);
1a31ed21 461 symbol_type_set ($1, current_type, @1);
e776192e 462 symbol_user_token_number_set ($1, $2, @2);
e9955c83 463 }
58d7a1a1 464| id string_as_id
e9955c83 465 {
073f9288 466 symbol_class_set ($1, current_class, @1, true);
1a31ed21 467 symbol_type_set ($1, current_type, @1);
a5d50994 468 symbol_make_alias ($1, $2, @$);
e9955c83 469 }
58d7a1a1 470| id INT string_as_id
e9955c83 471 {
073f9288 472 symbol_class_set ($1, current_class, @1, true);
1a31ed21 473 symbol_type_set ($1, current_type, @1);
e776192e 474 symbol_user_token_number_set ($1, $2, @2);
a5d50994 475 symbol_make_alias ($1, $3, @$);
e9955c83
AD
476 }
477;
478
479/* One or more symbol definitions. */
480symbol_defs.1:
481 symbol_def
e9955c83 482| symbol_defs.1 symbol_def
e9955c83
AD
483;
484
2c569025
AD
485
486 /*------------------------------------------.
487 | The grammar section: between the two %%. |
488 `------------------------------------------*/
489
490grammar:
1921f1d7
AD
491 rules_or_grammar_declaration
492| grammar rules_or_grammar_declaration
493;
494
495/* As a Bison extension, one can use the grammar declarations in the
b7295522 496 body of the grammar. */
1921f1d7 497rules_or_grammar_declaration:
e9955c83 498 rules
8d0a98bb 499| grammar_declaration ";"
b275314e
AD
500| error ";"
501 {
502 yyerrok;
503 }
e9955c83
AD
504;
505
506rules:
58d7a1a1 507 id_colon { current_lhs = $1; current_lhs_location = @1; } rhses.1
e9955c83
AD
508;
509
510rhses.1:
8f3596a6
AD
511 rhs { grammar_current_rule_end (@1); }
512| rhses.1 "|" rhs { grammar_current_rule_end (@3); }
8d0a98bb 513| rhses.1 ";"
e9955c83
AD
514;
515
516rhs:
517 /* Nothing. */
8f3596a6 518 { grammar_current_rule_begin (current_lhs, current_lhs_location); }
e9955c83 519| rhs symbol
8efe435c 520 { grammar_current_rule_symbol_append ($2, @2); }
e9071366 521| rhs "{...}"
381ecb06 522 { grammar_current_rule_action_append ($2, @2); }
e9955c83 523| rhs "%prec" symbol
e776192e 524 { grammar_current_rule_prec_set ($3, @3); }
676385e2
PH
525| rhs "%dprec" INT
526 { grammar_current_rule_dprec_set ($3, @3); }
cb823b6f 527| rhs "%merge" TAG
676385e2 528 { grammar_current_rule_merge_set ($3, @3); }
e9955c83
AD
529;
530
58d7a1a1 531
3c262606
AD
532/*---------------------------.
533| variable and content.opt. |
534`---------------------------*/
16dc6a9e
JD
535
536variable:
537 ID
3c262606
AD
538| STRING { $$ = uniqstr_new ($1); } /* deprecated and not M4-friendly */
539;
2ce4ed68 540
592d0b1e 541/* Some content or empty by default. */
2ce4ed68
AD
542content.opt:
543 /* Nothing. */
544 {
592d0b1e 545 $$ = "";
2ce4ed68 546 }
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}