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