]> git.saurik.com Git - bison.git/blame - src/parse-gram.y
style: avoid %{...%} in our parser
[bison.git] / src / parse-gram.y
CommitLineData
3f21a394 1/* Bison Grammar Parser -*- C -*-
a737b216 2
7d6bad19 3 Copyright (C) 2002-2013 Free Software Foundation, Inc.
e9955c83
AD
4
5 This file is part of Bison, the GNU Compiler Compiler.
6
f16b0819 7 This program is free software: you can redistribute it and/or modify
e9955c83 8 it under the terms of the GNU General Public License as published by
f16b0819 9 the Free Software Foundation, either version 3 of the License, or
e9955c83
AD
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
f16b0819 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
e9955c83 19
3f21a394
AD
20%code requires
21{
22 #include "symlist.h"
23 #include "symtab.h"
24}
e9955c83 25
a7706735
AD
26%code
27{
3f21a394
AD
28 #include <config.h>
29 #include "system.h"
30
31 #include "c-ctype.h"
32 #include "complain.h"
33 #include "conflicts.h"
34 #include "files.h"
35 #include "getargs.h"
36 #include "gram.h"
37 #include "named-ref.h"
38 #include "quotearg.h"
39 #include "reader.h"
40 #include "scan-gram.h"
41 #include "scan-code.h"
42 #include "xmemdup0.h"
43
eaca4c11 44 static int current_prec = 0;
a7706735
AD
45 static location current_lhs_location;
46 static named_ref *current_lhs_named_ref;
a4d1bf6a 47 static symbol *current_lhs_symbol;
eaca4c11
AD
48 static symbol_class current_class = unknown_sym;
49 static uniqstr current_type = NULL;
a7706735 50
a4d1bf6a
AD
51 /** Set the new current left-hand side symbol, possibly common
52 * to several right-hand side parts of rule.
53 */
827aca04
AD
54 static void current_lhs (symbol *sym, location loc, named_ref *ref);
55
56 #define YYLLOC_DEFAULT(Current, Rhs, N) \
57 (Current) = lloc_default (Rhs, N)
58 static YYLTYPE lloc_default (YYLTYPE const *, int);
59
60 #define YY_LOCATION_PRINT(File, Loc) \
61 location_print (Loc, File)
62
63 static void version_check (location const *loc, char const *version);
64
65 static void gram_error (location const *, char const *);
66
67 /* A string that describes a char (e.g., 'a' -> "'a'"). */
68 static char const *char_name (char);
a4d1bf6a 69
a7706735
AD
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
74}
75
aba47f56 76%define api.prefix {gram_}
2c056d69 77%define api.pure full
d0a30438 78%define locations
5320fffd 79%define parse.error verbose
107844a3 80%define parse.lac full
5320fffd 81%define parse.trace
12ffdd28 82%defines
219741d8 83%expect 0
e73ac5a0 84%verbose
12ffdd28 85
cd3684cf
AD
86%initial-action
87{
88 /* Bison's grammar can initial empty locations, hence a default
89 location is needed. */
4a678af8
JD
90 boundary_set (&@$.start, current_file, 1, 1);
91 boundary_set (&@$.end, current_file, 1, 1);
cd3684cf 92}
e9955c83 93
f9a85a15 94/* Define the tokens together with their human representation. */
3d38c03a
AD
95%token GRAM_EOF 0 "end of file"
96%token STRING "string"
e9955c83 97
9280d3ef
AD
98%token PERCENT_TOKEN "%token"
99%token PERCENT_NTERM "%nterm"
366eea36 100
9280d3ef 101%token PERCENT_TYPE "%type"
e9071366
AD
102%token PERCENT_DESTRUCTOR "%destructor"
103%token PERCENT_PRINTER "%printer"
366eea36 104
9280d3ef
AD
105%token PERCENT_LEFT "%left"
106%token PERCENT_RIGHT "%right"
107%token PERCENT_NONASSOC "%nonassoc"
d78f0ac9 108%token PERCENT_PRECEDENCE "%precedence"
04e60654 109
3d38c03a
AD
110%token PERCENT_PREC "%prec"
111%token PERCENT_DPREC "%dprec"
112%token PERCENT_MERGE "%merge"
e9955c83 113
ae7453f2
AD
114/*----------------------.
115| Global Declarations. |
116`----------------------*/
117
118%token
136a0f76 119 PERCENT_CODE "%code"
39a06c25 120 PERCENT_DEFAULT_PREC "%default-prec"
cd3684cf
AD
121 PERCENT_DEFINE "%define"
122 PERCENT_DEFINES "%defines"
31b850d2 123 PERCENT_ERROR_VERBOSE "%error-verbose"
cd3684cf 124 PERCENT_EXPECT "%expect"
a7706735 125 PERCENT_EXPECT_RR "%expect-rr"
ba061fa6 126 PERCENT_FLAG "%<flag>"
cd3684cf
AD
127 PERCENT_FILE_PREFIX "%file-prefix"
128 PERCENT_GLR_PARSER "%glr-parser"
e9071366 129 PERCENT_INITIAL_ACTION "%initial-action"
0e021770 130 PERCENT_LANGUAGE "%language"
cd3684cf 131 PERCENT_NAME_PREFIX "%name-prefix"
22fccf95 132 PERCENT_NO_DEFAULT_PREC "%no-default-prec"
cd3684cf
AD
133 PERCENT_NO_LINES "%no-lines"
134 PERCENT_NONDETERMINISTIC_PARSER
a7706735 135 "%nondeterministic-parser"
cd3684cf 136 PERCENT_OUTPUT "%output"
a7706735 137 PERCENT_REQUIRE "%require"
cd3684cf
AD
138 PERCENT_SKELETON "%skeleton"
139 PERCENT_START "%start"
140 PERCENT_TOKEN_TABLE "%token-table"
141 PERCENT_VERBOSE "%verbose"
142 PERCENT_YACC "%yacc"
ae7453f2 143;
e9955c83 144
58d7a1a1 145%token BRACED_CODE "{...}"
ca2a6d15 146%token BRACED_PREDICATE "%?{...}"
b143f404 147%token BRACKETED_ID "[identifier]"
58d7a1a1
AD
148%token CHAR "char"
149%token EPILOGUE "epilogue"
3d38c03a 150%token EQUAL "="
3d38c03a 151%token ID "identifier"
b7295522 152%token ID_COLON "identifier:"
e9955c83 153%token PERCENT_PERCENT "%%"
58d7a1a1 154%token PIPE "|"
3d38c03a 155%token PROLOGUE "%{...%}"
58d7a1a1 156%token SEMICOLON ";"
cb823b6f
AD
157%token TAG "<tag>"
158%token TAG_ANY "<*>"
159%token TAG_NONE "<>"
58d7a1a1 160
a17c70f8 161%union {unsigned char character;}
58d7a1a1 162%type <character> CHAR
585a791e 163%printer { fputs (char_name ($$), yyo); } CHAR
3d38c03a 164
2ce4ed68 165/* braceless is not to be used for rule or symbol actions, as it
7c0c6181 166 calls code_props_plain_init. */
a17c70f8
AD
167%union
168{
169 char *code;
170 char const *chars;
171};
14bfd2e9 172%type <chars> STRING "%{...%}" EPILOGUE braceless
ca2a6d15 173%type <code> "{...}" "%?{...}"
585a791e 174%printer { fputs (quotearg_style (c_quoting_style, $$), yyo); }
e9690142 175 STRING
585a791e 176%printer { fprintf (yyo, "{\n%s\n}", $$); }
14bfd2e9 177 braceless "{...}" "%{...%}" EPILOGUE
58d7a1a1 178
a17c70f8 179%union {uniqstr uniqstr;}
a82cbb63 180%type <uniqstr> BRACKETED_ID ID ID_COLON PERCENT_FLAG TAG tag variable
585a791e
AD
181%printer { fputs ($$, yyo); } <uniqstr>
182%printer { fprintf (yyo, "[%s]", $$); } BRACKETED_ID
183%printer { fprintf (yyo, "%s:", $$); } ID_COLON
184%printer { fprintf (yyo, "%%%s", $$); } PERCENT_FLAG
185%printer { fprintf (yyo, "<%s>", $$); } TAG tag
58d7a1a1 186
a17c70f8
AD
187%union {int integer;};
188%token <integer> INT "integer"
585a791e 189%printer { fprintf (yyo, "%d", $$); } <integer>
58d7a1a1 190
a17c70f8 191%union {symbol *symbol;}
b143f404 192%type <symbol> id id_colon string_as_id symbol symbol.prec
585a791e
AD
193%printer { fprintf (yyo, "%s", $$->tag); } <symbol>
194%printer { fprintf (yyo, "%s:", $$->tag); } id_colon
58d7a1a1 195
a17c70f8 196%union {assoc assoc;};
2c569025 197%type <assoc> precedence_declarator
a17c70f8
AD
198
199%union {symbol_list *list;}
ab7f29f8 200%type <list> symbols.1 symbols.prec generic_symlist generic_symlist_item
a17c70f8
AD
201
202%union {named_ref *named_ref;}
b143f404 203%type <named_ref> named_ref.opt
a7706735
AD
204
205/*---------.
206| %param. |
207`---------*/
208%code requires
209{
a7706735
AD
210 typedef enum
211 {
eaca4c11 212 param_none = 0,
a7706735
AD
213 param_lex = 1 << 0,
214 param_parse = 1 << 1,
215 param_both = param_lex | param_parse
216 } param_type;
a7706735
AD
217};
218%code
219{
220 /** Add a lex-param and/or a parse-param.
221 *
222 * \param type where to push this formal argument.
223 * \param decl the formal argument. Destroyed.
224 * \param loc the location in the source.
225 */
226 static void add_param (param_type type, char *decl, location loc);
eaca4c11 227 static param_type current_param = param_none;
a7706735 228};
dac72a91 229%union {param_type param;}
a7706735
AD
230%token <param> PERCENT_PARAM "%param";
231%printer
232{
233 switch ($$)
234 {
235#define CASE(In, Out) \
dac72a91 236 case param_ ## In: fputs ("%" #Out, yyo); break
f50fa145
AD
237 CASE (lex, lex-param);
238 CASE (parse, parse-param);
239 CASE (both, param);
a7706735 240#undef CASE
2d399888 241 case param_none: aver (false); break;
eaca4c11 242 }
a7706735
AD
243} <param>;
244
eaca4c11
AD
245
246 /*==========\
247 | Grammar. |
248 \==========*/
e9955c83 249%%
2c569025 250
8efe435c 251input:
2ce4ed68 252 prologue_declarations "%%" grammar epilogue.opt
e9955c83
AD
253;
254
2c569025 255
e9690142
JD
256 /*------------------------------------.
257 | Declarations: before the first %%. |
258 `------------------------------------*/
2c569025 259
2ce4ed68 260prologue_declarations:
fd003416 261 %empty
2ce4ed68 262| prologue_declarations prologue_declaration
e9955c83
AD
263;
264
2ce4ed68 265prologue_declaration:
2c569025 266 grammar_declaration
7c0c6181
JD
267| "%{...%}"
268 {
269 code_props plain_code;
270 code_props_plain_init (&plain_code, $1, @1);
271 code_props_translate_code (&plain_code);
272 gram_scanner_last_string_free ();
7ecec4dd
JD
273 muscle_code_grow (union_seen ? "post_prologue" : "pre_prologue",
274 plain_code.code, @1);
7c0c6181
JD
275 code_scanner_last_string_free ();
276 }
ba061fa6 277| "%<flag>"
0ce61575 278 {
4920ae8b 279 muscle_percent_define_ensure ($1, @1, true);
0ce61575 280 }
14bfd2e9 281| "%define" variable value
7eb8a0bc 282 {
14bfd2e9 283 muscle_percent_define_insert ($2, @2, $3.kind, $3.chars,
de5ab940 284 MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
7eb8a0bc 285 }
2ce4ed68 286| "%defines" { defines_flag = true; }
02975b9a
JD
287| "%defines" STRING
288 {
289 defines_flag = true;
290 spec_defines_file = xstrdup ($2);
291 }
31b850d2
AD
292| "%error-verbose"
293 {
14bfd2e9
AD
294 muscle_percent_define_insert ("parse.error", @1, muscle_keyword,
295 "verbose",
31b850d2
AD
296 MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
297 }
2ce4ed68 298| "%expect" INT { expected_sr_conflicts = $2; }
e9690142 299| "%expect-rr" INT { expected_rr_conflicts = $2; }
02975b9a 300| "%file-prefix" STRING { spec_file_prefix = $2; }
cd3684cf 301| "%glr-parser"
c66dfadd
PE
302 {
303 nondeterministic_parser = true;
304 glr_parser = true;
305 }
e9071366 306| "%initial-action" "{...}"
c66dfadd 307 {
7c0c6181
JD
308 code_props action;
309 code_props_symbol_action_init (&action, $2, @2);
310 code_props_translate_code (&action);
311 gram_scanner_last_string_free ();
312 muscle_code_grow ("initial_action", action.code, @2);
313 code_scanner_last_string_free ();
c66dfadd 314 }
e9690142 315| "%language" STRING { language_argmatch ($2, grammar_prio, @1); }
02975b9a 316| "%name-prefix" STRING { spec_name_prefix = $2; }
2ce4ed68 317| "%no-lines" { no_lines_flag = true; }
e9690142 318| "%nondeterministic-parser" { nondeterministic_parser = true; }
02975b9a 319| "%output" STRING { spec_outfile = $2; }
eaca4c11 320| "%param" { current_param = $1; } params { current_param = param_none; }
2ce4ed68 321| "%require" STRING { version_check (&@2, $2); }
a7867f53
JD
322| "%skeleton" STRING
323 {
324 char const *skeleton_user = $2;
84526bf3 325 if (strchr (skeleton_user, '/'))
a7867f53
JD
326 {
327 size_t dir_length = strlen (current_file);
328 char *skeleton_build;
329 while (dir_length && current_file[dir_length - 1] != '/')
330 --dir_length;
331 while (dir_length && current_file[dir_length - 1] == '/')
332 --dir_length;
333 skeleton_build =
334 xmalloc (dir_length + 1 + strlen (skeleton_user) + 1);
335 if (dir_length > 0)
336 {
bb3b912b 337 memcpy (skeleton_build, current_file, dir_length);
a7867f53
JD
338 skeleton_build[dir_length++] = '/';
339 }
340 strcpy (skeleton_build + dir_length, skeleton_user);
341 skeleton_user = uniqstr_new (skeleton_build);
342 free (skeleton_build);
343 }
51365192 344 skeleton_arg (skeleton_user, grammar_prio, @1);
a7867f53 345 }
2ce4ed68 346| "%token-table" { token_table_flag = true; }
ef1b4273 347| "%verbose" { report_flag |= report_states; }
2ce4ed68 348| "%yacc" { yacc_flag = true; }
cd3684cf 349| /*FIXME: Err? What is this horror doing here? */ ";"
e9955c83
AD
350;
351
eaca4c11
AD
352params:
353 params "{...}" { add_param (current_param, $2, @2); }
354| "{...}" { add_param (current_param, $1, @1); }
355;
356
a7706735
AD
357
358/*----------------------.
359| grammar_declaration. |
360`----------------------*/
361
2c569025
AD
362grammar_declaration:
363 precedence_declaration
364| symbol_declaration
e9955c83
AD
365| "%start" symbol
366 {
8efe435c 367 grammar_start_symbol_set ($2, @2);
e9955c83 368 }
49196047 369| code_props_type "{...}" generic_symlist
9280d3ef 370 {
1c292035
AD
371 code_props code;
372 code_props_symbol_action_init (&code, $2, @2);
373 code_props_translate_code (&code);
374 {
375 symbol_list *list;
376 for (list = $3; list; list = list->next)
4323e0da 377 symbol_list_code_props_set (list, $1, &code);
1c292035
AD
378 symbol_list_free ($3);
379 }
9280d3ef 380 }
22fccf95 381| "%default-prec"
39a06c25 382 {
22fccf95
PE
383 default_prec = true;
384 }
385| "%no-default-prec"
386 {
387 default_prec = false;
39a06c25 388 }
8e0a5e9e
JD
389| "%code" braceless
390 {
9611cfa2
JD
391 /* Do not invoke muscle_percent_code_grow here since it invokes
392 muscle_user_name_list_grow. */
592d0b1e 393 muscle_code_grow ("percent_code()", $2, @2);
8e0a5e9e
JD
394 code_scanner_last_string_free ();
395 }
16dc6a9e 396| "%code" ID braceless
8e0a5e9e 397 {
9611cfa2 398 muscle_percent_code_grow ($2, @2, $3, @3);
8e0a5e9e 399 code_scanner_last_string_free ();
8e0a5e9e 400 }
2c569025
AD
401;
402
49196047
AD
403%type <code_type> code_props_type;
404%union {code_props_type code_type;};
585a791e 405%printer { fprintf (yyo, "%s", code_props_type_string ($$)); } <code_type>;
49196047
AD
406code_props_type:
407 "%destructor" { $$ = destructor; }
408| "%printer" { $$ = printer; }
409;
58d7a1a1 410
3c262606
AD
411/*---------.
412| %union. |
413`---------*/
58d7a1a1
AD
414
415%token PERCENT_UNION "%union";
416
417union_name:
fd003416
AD
418 %empty {}
419| ID { muscle_code_grow ("union_name", $1, @1); }
58d7a1a1
AD
420;
421
422grammar_declaration:
7ecec4dd 423 "%union" union_name braceless
58d7a1a1 424 {
ddc8ede1 425 union_seen = true;
c5dbd909 426 muscle_code_grow ("union_members", $3, @3);
7ecec4dd 427 code_scanner_last_string_free ();
58d7a1a1
AD
428 }
429;
430
431
432
433
2c569025
AD
434symbol_declaration:
435 "%nterm" { current_class = nterm_sym; } symbol_defs.1
e9955c83
AD
436 {
437 current_class = unknown_sym;
438 current_type = NULL;
439 }
2c569025 440| "%token" { current_class = token_sym; } symbol_defs.1
e9955c83 441 {
2c569025 442 current_class = unknown_sym;
e9955c83
AD
443 current_type = NULL;
444 }
cb823b6f 445| "%type" TAG symbols.1
e9955c83 446 {
3d2cbc26 447 symbol_list *list;
4f82b42a 448 tag_seen = true;
1e0bab92 449 for (list = $3; list; list = list->next)
e9690142 450 symbol_type_set (list->content.sym, $2, @2);
dafdc66f 451 symbol_list_free ($3);
e9955c83
AD
452 }
453;
454
2c569025 455precedence_declaration:
cb823b6f 456 precedence_declarator tag.opt symbols.prec
1e0bab92 457 {
3d2cbc26 458 symbol_list *list;
1e0bab92
AD
459 ++current_prec;
460 for (list = $3; list; list = list->next)
e9690142
JD
461 {
462 symbol_type_set (list->content.sym, current_type, @2);
463 symbol_precedence_set (list->content.sym, current_prec, $1, @1);
464 }
dafdc66f 465 symbol_list_free ($3);
1e0bab92
AD
466 current_type = NULL;
467 }
e9955c83
AD
468;
469
2c569025 470precedence_declarator:
d78f0ac9
AD
471 "%left" { $$ = left_assoc; }
472| "%right" { $$ = right_assoc; }
473| "%nonassoc" { $$ = non_assoc; }
474| "%precedence" { $$ = precedence_assoc; }
e9955c83
AD
475;
476
cb823b6f 477tag.opt:
fd003416
AD
478 %empty { current_type = NULL; }
479| TAG { current_type = $1; tag_seen = true; }
e9955c83
AD
480;
481
ab7f29f8
JD
482/* Just like symbols.1 but accept INT for the sake of POSIX. */
483symbols.prec:
484 symbol.prec
485 { $$ = symbol_list_sym_new ($1, @1); }
486| symbols.prec symbol.prec
93561c21 487 { $$ = symbol_list_append ($1, symbol_list_sym_new ($2, @2)); }
ab7f29f8
JD
488;
489
490symbol.prec:
5202b6ac
VT
491 symbol
492 {
493 $$ = $1;
494 symbol_class_set ($1, token_sym, @1, false);
495 }
496| symbol INT
497 {
498 $$ = $1;
499 symbol_user_token_number_set ($1, $2, @2);
500 symbol_class_set ($1, token_sym, @1, false);
501 }
0560fa24 502;
ab7f29f8 503
3be03b13 504/* One or more symbols to be %typed. */
1e0bab92 505symbols.1:
3be03b13
JD
506 symbol
507 { $$ = symbol_list_sym_new ($1, @1); }
508| symbols.1 symbol
93561c21 509 { $$ = symbol_list_append ($1, symbol_list_sym_new ($2, @2)); }
3be03b13
JD
510;
511
512generic_symlist:
513 generic_symlist_item { $$ = $1; }
93561c21 514| generic_symlist generic_symlist_item { $$ = symbol_list_append ($1, $2); }
3be03b13
JD
515;
516
517generic_symlist_item:
cb823b6f 518 symbol { $$ = symbol_list_sym_new ($1, @1); }
a82cbb63
AD
519| tag { $$ = symbol_list_type_new ($1, @1); }
520;
521
522tag:
523 TAG
524| "<*>" { $$ = uniqstr_new ("*"); }
525| "<>" { $$ = uniqstr_new (""); }
e9955c83
AD
526;
527
e9955c83
AD
528/* One token definition. */
529symbol_def:
cb823b6f 530 TAG
c1392807
AD
531 {
532 current_type = $1;
533 tag_seen = true;
534 }
58d7a1a1 535| id
c1392807
AD
536 {
537 symbol_class_set ($1, current_class, @1, true);
538 symbol_type_set ($1, current_type, @1);
539 }
58d7a1a1 540| id INT
e9955c83 541 {
073f9288 542 symbol_class_set ($1, current_class, @1, true);
1a31ed21 543 symbol_type_set ($1, current_type, @1);
e776192e 544 symbol_user_token_number_set ($1, $2, @2);
e9955c83 545 }
58d7a1a1 546| id string_as_id
e9955c83 547 {
073f9288 548 symbol_class_set ($1, current_class, @1, true);
1a31ed21 549 symbol_type_set ($1, current_type, @1);
a5d50994 550 symbol_make_alias ($1, $2, @$);
e9955c83 551 }
58d7a1a1 552| id INT string_as_id
e9955c83 553 {
073f9288 554 symbol_class_set ($1, current_class, @1, true);
1a31ed21 555 symbol_type_set ($1, current_type, @1);
e776192e 556 symbol_user_token_number_set ($1, $2, @2);
a5d50994 557 symbol_make_alias ($1, $3, @$);
e9955c83
AD
558 }
559;
560
561/* One or more symbol definitions. */
562symbol_defs.1:
563 symbol_def
e9955c83 564| symbol_defs.1 symbol_def
e9955c83
AD
565;
566
2c569025 567
e9690142
JD
568 /*------------------------------------------.
569 | The grammar section: between the two %%. |
570 `------------------------------------------*/
2c569025
AD
571
572grammar:
1921f1d7
AD
573 rules_or_grammar_declaration
574| grammar rules_or_grammar_declaration
575;
576
577/* As a Bison extension, one can use the grammar declarations in the
b7295522 578 body of the grammar. */
1921f1d7 579rules_or_grammar_declaration:
e9955c83 580 rules
8d0a98bb 581| grammar_declaration ";"
b275314e
AD
582| error ";"
583 {
584 yyerrok;
585 }
e9955c83
AD
586;
587
588rules:
a4d1bf6a
AD
589 id_colon named_ref.opt { current_lhs ($1, @1, $2); } rhses.1
590 {
591 /* Free the current lhs. */
592 current_lhs (0, @1, 0);
593 }
e9955c83
AD
594;
595
596rhses.1:
8f3596a6
AD
597 rhs { grammar_current_rule_end (@1); }
598| rhses.1 "|" rhs { grammar_current_rule_end (@3); }
8d0a98bb 599| rhses.1 ";"
e9955c83
AD
600;
601
ae2b48f5 602%token PERCENT_EMPTY "%empty";
e9955c83 603rhs:
fd003416 604 %empty
a4d1bf6a 605 { grammar_current_rule_begin (current_lhs_symbol, current_lhs_location,
e9690142 606 current_lhs_named_ref); }
b9f1d9a4
AR
607| rhs symbol named_ref.opt
608 { grammar_current_rule_symbol_append ($2, @2, $3); }
609| rhs "{...}" named_ref.opt
ca2a6d15 610 { grammar_current_rule_action_append ($2, @2, $3, false); }
59420cd7 611| rhs "%?{...}"
ca2a6d15 612 { grammar_current_rule_action_append ($2, @2, NULL, true); }
ae2b48f5
AD
613| rhs "%empty"
614 { grammar_current_rule_empty_set (@2); }
e9955c83 615| rhs "%prec" symbol
e776192e 616 { grammar_current_rule_prec_set ($3, @3); }
676385e2
PH
617| rhs "%dprec" INT
618 { grammar_current_rule_dprec_set ($3, @3); }
cb823b6f 619| rhs "%merge" TAG
676385e2 620 { grammar_current_rule_merge_set ($3, @3); }
e9955c83
AD
621;
622
b9f1d9a4 623named_ref.opt:
fd003416
AD
624 %empty { $$ = 0; }
625| BRACKETED_ID { $$ = named_ref_new($1, @1); }
b9f1d9a4
AR
626;
627
14bfd2e9
AD
628/*---------------------.
629| variable and value. |
630`---------------------*/
16dc6a9e 631
c9aded4b 632/* The STRING form of variable is deprecated and is not M4-friendly.
45eebca4 633 For example, M4 fails for '%define "[" "value"'. */
16dc6a9e
JD
634variable:
635 ID
4f646c37 636| STRING { $$ = uniqstr_new ($1); }
3c262606 637;
2ce4ed68 638
592d0b1e 639/* Some content or empty by default. */
14bfd2e9
AD
640%code requires {#include "muscle-tab.h"};
641%union
642{
643 struct
644 {
645 char const *chars;
646 muscle_kind kind;
647 } value;
648};
649%type <value> value;
650%printer
651{
652 switch ($$.kind)
653 {
654 case muscle_code: fprintf (yyo, "{%s}", $$.chars); break;
655 case muscle_keyword: fprintf (yyo, "%s", $$.chars); break;
656 case muscle_string: fprintf (yyo, "\"%s\"", $$.chars); break;
657 }
658} <value>;
659
660value:
661 %empty { $$.kind = muscle_keyword; $$.chars = ""; }
662| ID { $$.kind = muscle_keyword; $$.chars = $1; }
663| STRING { $$.kind = muscle_string; $$.chars = $1; }
664| braceless { $$.kind = muscle_code; $$.chars = $1; }
2ce4ed68
AD
665;
666
667
3c262606
AD
668/*------------.
669| braceless. |
670`------------*/
6afc30cc 671
2ce4ed68
AD
672braceless:
673 "{...}"
674 {
7c0c6181 675 code_props plain_code;
57597927 676 $1[strlen ($1) - 1] = '\0';
7c0c6181
JD
677 code_props_plain_init (&plain_code, $1+1, @1);
678 code_props_translate_code (&plain_code);
679 gram_scanner_last_string_free ();
680 $$ = plain_code.code;
2ce4ed68
AD
681 }
682;
683
684
3c262606
AD
685/*--------------.
686| Identifiers. |
687`--------------*/
58d7a1a1 688
33ad1a9c
PE
689/* Identifiers are returned as uniqstr values by the scanner.
690 Depending on their use, we may need to make them genuine symbols. */
58d7a1a1
AD
691
692id:
33ad1a9c 693 ID
203b9274 694 { $$ = symbol_from_uniqstr ($1, @1); }
33ad1a9c
PE
695| CHAR
696 {
697 $$ = symbol_get (char_name ($1), @1);
698 symbol_class_set ($$, token_sym, @1, false);
699 symbol_user_token_number_set ($$, $1, @1);
700 }
58d7a1a1
AD
701;
702
703id_colon:
203b9274 704 ID_COLON { $$ = symbol_from_uniqstr ($1, @1); }
58d7a1a1
AD
705;
706
707
e9955c83 708symbol:
58d7a1a1
AD
709 id
710| string_as_id
e9955c83
AD
711;
712
ca407bdf 713/* A string used as an ID: quote it. */
e9955c83
AD
714string_as_id:
715 STRING
716 {
ca407bdf 717 $$ = symbol_get (quotearg_style (c_quoting_style, $1), @1);
db89d400 718 symbol_class_set ($$, token_sym, @1, false);
e9955c83
AD
719 }
720;
721
e9955c83 722epilogue.opt:
fd003416 723 %empty
e9955c83
AD
724| "%%" EPILOGUE
725 {
7c0c6181
JD
726 code_props plain_code;
727 code_props_plain_init (&plain_code, $2, @2);
728 code_props_translate_code (&plain_code);
e9071366 729 gram_scanner_last_string_free ();
7c0c6181
JD
730 muscle_code_grow ("epilogue", plain_code.code, @2);
731 code_scanner_last_string_free ();
e9955c83
AD
732 }
733;
734
e9955c83 735%%
b7295522 736
b7295522
PE
737/* Return the location of the left-hand side of a rule whose
738 right-hand side is RHS[1] ... RHS[N]. Ignore empty nonterminals in
739 the right-hand side, and return an empty location equal to the end
740 boundary of RHS[0] if the right-hand side is empty. */
741
742static YYLTYPE
743lloc_default (YYLTYPE const *rhs, int n)
744{
745 int i;
a737b216 746 YYLTYPE loc;
62cb8a99
PE
747
748 /* SGI MIPSpro 7.4.1m miscompiles "loc.start = loc.end = rhs[n].end;".
749 The bug is fixed in 7.4.2m, but play it safe for now. */
750 loc.start = rhs[n].end;
751 loc.end = rhs[n].end;
b7295522 752
59420cd7 753 /* Ignore empty nonterminals the start of the right-hand side.
5320ca4d
PE
754 Do not bother to ignore them at the end of the right-hand side,
755 since empty nonterminals have the same end as their predecessors. */
b7295522
PE
756 for (i = 1; i <= n; i++)
757 if (! equal_boundaries (rhs[i].start, rhs[i].end))
758 {
e9690142
JD
759 loc.start = rhs[i].start;
760 break;
b7295522
PE
761 }
762
a737b216 763 return loc;
b7295522
PE
764}
765
766
1773ceee 767static void
a7706735 768add_param (param_type type, char *decl, location loc)
1773ceee 769{
ead9e56e 770 static char const alphanum[26 + 26 + 1 + 10] =
1773ceee
PE
771 "abcdefghijklmnopqrstuvwxyz"
772 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
ead9e56e
PE
773 "_"
774 "0123456789";
f71db70b 775
1773ceee 776 char const *name_start = NULL;
f71db70b
AD
777 {
778 char *p;
779 /* Stop on last actual character. */
780 for (p = decl; p[1]; p++)
781 if ((p == decl
782 || ! memchr (alphanum, p[-1], sizeof alphanum))
783 && memchr (alphanum, p[0], sizeof alphanum - 10))
784 name_start = p;
785
786 /* Strip the surrounding '{' and '}', and any blanks just inside
787 the braces. */
c9d546b2 788 --p;
6b5a7489 789 while (c_isspace ((unsigned char) *p))
c8554191 790 --p;
f71db70b 791 p[1] = '\0';
c9d546b2 792 ++decl;
6b5a7489 793 while (c_isspace ((unsigned char) *decl))
c8554191 794 ++decl;
f71db70b 795 }
e9ce5688 796
1773ceee 797 if (! name_start)
bb8e56ff 798 complain (&loc, complaint, _("missing identifier in parameter declaration"));
1773ceee
PE
799 else
800 {
60457f30 801 char *name = xmemdup0 (name_start, strspn (name_start, alphanum));
a7706735
AD
802 if (type & param_lex)
803 muscle_pair_list_grow ("lex_param", decl, name);
804 if (type & param_parse)
805 muscle_pair_list_grow ("parse_param", decl, name);
1773ceee
PE
806 free (name);
807 }
808
e9071366 809 gram_scanner_last_string_free ();
1773ceee
PE
810}
811
2ce4ed68 812
b50d2359
AD
813static void
814version_check (location const *loc, char const *version)
815{
816 if (strverscmp (version, PACKAGE_VERSION) > 0)
9b8a5ce0 817 {
bb8e56ff
TR
818 complain (loc, complaint, "require bison %s, but have %s",
819 version, PACKAGE_VERSION);
459a57a9 820 exit (EX_MISMATCH);
9b8a5ce0 821 }
b50d2359
AD
822}
823
1fec91df 824static void
3d2cbc26 825gram_error (location const *loc, char const *msg)
e9955c83 826{
bb8e56ff 827 complain (loc, complaint, "%s", msg);
e9955c83 828}
e9ce5688
PE
829
830char const *
831token_name (int type)
832{
fc01665e 833 return yytname[YYTRANSLATE (type)];
e9ce5688 834}
33ad1a9c
PE
835
836static char const *
837char_name (char c)
838{
839 if (c == '\'')
840 return "'\\''";
841 else
842 {
843 char buf[4];
844 buf[0] = '\''; buf[1] = c; buf[2] = '\''; buf[3] = '\0';
845 return quotearg_style (escape_quoting_style, buf);
846 }
847}
827aca04
AD
848
849static
850void
851current_lhs (symbol *sym, location loc, named_ref *ref)
852{
853 current_lhs_symbol = sym;
854 current_lhs_location = loc;
855 /* In order to simplify memory management, named references for lhs
856 are always assigned by deep copy into the current symbol_list
857 node. This is because a single named-ref in the grammar may
858 result in several uses when the user factors lhs between several
859 rules using "|". Therefore free the parser's original copy. */
860 free (current_lhs_named_ref);
861 current_lhs_named_ref = ref;
862}