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