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