]> git.saurik.com Git - bison.git/blame - src/parse-gram.y
tests: don't abuse AT_BISON_CHECK.
[bison.git] / src / parse-gram.y
CommitLineData
12ffdd28 1%{/* Bison Grammar Parser -*- C -*-
a737b216 2
6789b8bd
JD
3 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free
4 Software Foundation, Inc.
e9955c83
AD
5
6 This file is part of Bison, the GNU Compiler Compiler.
7
f16b0819 8 This program is free software: you can redistribute it and/or modify
e9955c83 9 it under the terms of the GNU General Public License as published by
f16b0819 10 the Free Software Foundation, either version 3 of the License, or
e9955c83
AD
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
f16b0819 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
e9955c83 20
2cec9080 21#include <config.h>
e9955c83 22#include "system.h"
3d2cbc26 23
b275314e 24#include "complain.h"
3d2cbc26 25#include "conflicts.h"
e9955c83
AD
26#include "files.h"
27#include "getargs.h"
e9955c83 28#include "gram.h"
3d2cbc26 29#include "muscle_tab.h"
d5e8574b 30#include "named-ref.h"
ca407bdf 31#include "quotearg.h"
e9955c83 32#include "reader.h"
3d2cbc26 33#include "symlist.h"
e9071366
AD
34#include "scan-gram.h"
35#include "scan-code.h"
e9955c83 36
b7295522
PE
37#define YYLLOC_DEFAULT(Current, Rhs, N) (Current) = lloc_default (Rhs, N)
38static YYLTYPE lloc_default (YYLTYPE const *, int);
4cdb01db 39
b233d555 40#define YY_LOCATION_PRINT(File, Loc) \
f0064700 41 location_print (File, Loc)
b233d555 42
b50d2359
AD
43static void version_check (location const *loc, char const *version);
44
6e649e65 45/* Request detailed syntax error messages, and pass them to GRAM_ERROR.
ad8a3efc 46 FIXME: depends on the undocumented availability of YYLLOC. */
e9955c83
AD
47#undef yyerror
48#define yyerror(Msg) \
f0064700 49 gram_error (&yylloc, Msg)
3d2cbc26 50static void gram_error (location const *, char const *);
e9955c83 51
33ad1a9c
PE
52static char const *char_name (char);
53
2ce4ed68
AD
54/** Add a lex-param or a parse-param.
55 *
56 * \param type \a lex_param or \a parse_param
57 * \param decl the formal argument
58 * \param loc the location in the source.
59 */
60static void add_param (char const *type, char *decl, location loc);
61
1773ceee 62
04098407 63static symbol_class current_class = unknown_sym;
ddc8ede1 64static uniqstr current_type = NULL;
877519f8
PE
65static symbol *current_lhs;
66static location current_lhs_location;
7685e2f7 67static named_ref *current_lhs_named_ref;
04098407 68static int current_prec = 0;
d42cf844 69
cb48f191
PE
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
e9955c83
AD
74%}
75
12ffdd28 76%debug
82b248ad 77%verbose
12ffdd28
PE
78%defines
79%locations
80%pure-parser
81%error-verbose
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
AD
162%token BRACED_CODE "{...}"
163%token CHAR "char"
164%token EPILOGUE "epilogue"
3d38c03a 165%token EQUAL "="
3d38c03a 166%token ID "identifier"
b7295522 167%token ID_COLON "identifier:"
e9955c83 168%token PERCENT_PERCENT "%%"
58d7a1a1 169%token PIPE "|"
3d38c03a 170%token PROLOGUE "%{...%}"
58d7a1a1
AD
171%token SEMICOLON ";"
172%token TYPE "type"
12e35840 173%token TYPE_TAG_ANY "<*>"
3ebecc24 174%token TYPE_TAG_NONE "<>"
d5e8574b 175%token BRACKETED_ID "[identifier]"
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
7685e2f7
AR
189%type <uniqstr> TYPE ID ID_COLON BRACKETED_ID variable
190%type <named_ref> named_ref.opt
82b248ad 191%printer { fprintf (stderr, "<%s>", $$); } TYPE
16dc6a9e 192%printer { fputs ($$, stderr); } ID variable
58d7a1a1
AD
193%printer { fprintf (stderr, "%s:", $$); } ID_COLON
194
e9955c83 195%type <integer> INT
82b248ad 196%printer { fprintf (stderr, "%d", $$); } INT
58d7a1a1 197
ab7f29f8 198%type <symbol> id id_colon symbol symbol.prec string_as_id
58d7a1a1
AD
199%printer { fprintf (stderr, "%s", $$->tag); } id symbol string_as_id
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
e9955c83 204%%
2c569025 205
8efe435c 206input:
2ce4ed68 207 prologue_declarations "%%" grammar epilogue.opt
e9955c83
AD
208;
209
2c569025
AD
210
211 /*------------------------------------.
212 | Declarations: before the first %%. |
213 `------------------------------------*/
214
2ce4ed68 215prologue_declarations:
e9955c83 216 /* Nothing */
2ce4ed68 217| prologue_declarations prologue_declaration
e9955c83
AD
218;
219
2ce4ed68 220prologue_declaration:
2c569025 221 grammar_declaration
7c0c6181
JD
222| "%{...%}"
223 {
224 code_props plain_code;
225 code_props_plain_init (&plain_code, $1, @1);
226 code_props_translate_code (&plain_code);
227 gram_scanner_last_string_free ();
7ecec4dd
JD
228 muscle_code_grow (union_seen ? "post_prologue" : "pre_prologue",
229 plain_code.code, @1);
7c0c6181
JD
230 code_scanner_last_string_free ();
231 }
2ce4ed68 232| "%debug" { debug_flag = true; }
16dc6a9e 233| "%define" variable content.opt
7eb8a0bc 234 {
34d41938
JD
235 muscle_percent_define_insert ($2, @2, $3,
236 MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
7eb8a0bc 237 }
2ce4ed68 238| "%defines" { defines_flag = true; }
02975b9a
JD
239| "%defines" STRING
240 {
241 defines_flag = true;
242 spec_defines_file = xstrdup ($2);
243 }
2ce4ed68
AD
244| "%error-verbose" { error_verbose = true; }
245| "%expect" INT { expected_sr_conflicts = $2; }
246| "%expect-rr" INT { expected_rr_conflicts = $2; }
02975b9a
JD
247| "%file-prefix" STRING { spec_file_prefix = $2; }
248| "%file-prefix" "=" STRING { spec_file_prefix = $3; } /* deprecated */
cd3684cf 249| "%glr-parser"
c66dfadd
PE
250 {
251 nondeterministic_parser = true;
252 glr_parser = true;
253 }
e9071366 254| "%initial-action" "{...}"
c66dfadd 255 {
7c0c6181
JD
256 code_props action;
257 code_props_symbol_action_init (&action, $2, @2);
258 code_props_translate_code (&action);
259 gram_scanner_last_string_free ();
260 muscle_code_grow ("initial_action", action.code, @2);
261 code_scanner_last_string_free ();
c66dfadd 262 }
e186a284 263| "%language" STRING { language_argmatch ($2, grammar_prio, @1); }
2ce4ed68
AD
264| "%lex-param" "{...}" { add_param ("lex_param", $2, @2); }
265| "%locations" { locations_flag = true; }
02975b9a
JD
266| "%name-prefix" STRING { spec_name_prefix = $2; }
267| "%name-prefix" "=" STRING { spec_name_prefix = $3; } /* deprecated */
2ce4ed68
AD
268| "%no-lines" { no_lines_flag = true; }
269| "%nondeterministic-parser" { nondeterministic_parser = true; }
02975b9a
JD
270| "%output" STRING { spec_outfile = $2; }
271| "%output" "=" STRING { spec_outfile = $3; } /* deprecated */
2ce4ed68 272| "%parse-param" "{...}" { add_param ("parse_param", $2, @2); }
d9df47b6
JD
273| "%pure-parser"
274 {
275 /* %pure-parser is deprecated in favor of `%define api.pure', so use
276 `%define api.pure' in a backward-compatible manner here. First, don't
277 complain if %pure-parser is specified multiple times. */
278 if (!muscle_find_const ("percent_define(api.pure)"))
34d41938
JD
279 muscle_percent_define_insert ("api.pure", @1, "",
280 MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
d9df47b6
JD
281 /* In all cases, use api.pure now so that the backend doesn't complain if
282 the skeleton ignores api.pure, but do warn now if there's a previous
283 conflicting definition from an actual %define. */
284 if (!muscle_percent_define_flag_if ("api.pure"))
34d41938
JD
285 muscle_percent_define_insert ("api.pure", @1, "",
286 MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
d9df47b6 287 }
2ce4ed68 288| "%require" STRING { version_check (&@2, $2); }
a7867f53
JD
289| "%skeleton" STRING
290 {
291 char const *skeleton_user = $2;
292 if (strchr (skeleton_user, '/'))
293 {
294 size_t dir_length = strlen (current_file);
295 char *skeleton_build;
296 while (dir_length && current_file[dir_length - 1] != '/')
297 --dir_length;
298 while (dir_length && current_file[dir_length - 1] == '/')
299 --dir_length;
300 skeleton_build =
301 xmalloc (dir_length + 1 + strlen (skeleton_user) + 1);
302 if (dir_length > 0)
303 {
304 strncpy (skeleton_build, current_file, dir_length);
305 skeleton_build[dir_length++] = '/';
306 }
307 strcpy (skeleton_build + dir_length, skeleton_user);
308 skeleton_user = uniqstr_new (skeleton_build);
309 free (skeleton_build);
310 }
e186a284 311 skeleton_arg (skeleton_user, grammar_prio, @1);
a7867f53 312 }
2ce4ed68 313| "%token-table" { token_table_flag = true; }
ef1b4273 314| "%verbose" { report_flag |= report_states; }
2ce4ed68 315| "%yacc" { yacc_flag = true; }
cd3684cf 316| /*FIXME: Err? What is this horror doing here? */ ";"
e9955c83
AD
317;
318
2c569025
AD
319grammar_declaration:
320 precedence_declaration
321| symbol_declaration
e9955c83
AD
322| "%start" symbol
323 {
8efe435c 324 grammar_start_symbol_set ($2, @2);
e9955c83 325 }
3be03b13 326| "%destructor" "{...}" generic_symlist
9280d3ef 327 {
3d2cbc26 328 symbol_list *list;
e9071366 329 for (list = $3; list; list = list->next)
7c0c6181 330 symbol_list_destructor_set (list, $2, @2);
e9071366 331 symbol_list_free ($3);
9280d3ef 332 }
3be03b13 333| "%printer" "{...}" generic_symlist
366eea36 334 {
3d2cbc26 335 symbol_list *list;
e9071366 336 for (list = $3; list; list = list->next)
7c0c6181 337 symbol_list_printer_set (list, $2, @2);
e9071366 338 symbol_list_free ($3);
366eea36 339 }
22fccf95 340| "%default-prec"
39a06c25 341 {
22fccf95
PE
342 default_prec = true;
343 }
344| "%no-default-prec"
345 {
346 default_prec = false;
39a06c25 347 }
8e0a5e9e
JD
348| "%code" braceless
349 {
9611cfa2
JD
350 /* Do not invoke muscle_percent_code_grow here since it invokes
351 muscle_user_name_list_grow. */
592d0b1e 352 muscle_code_grow ("percent_code()", $2, @2);
8e0a5e9e
JD
353 code_scanner_last_string_free ();
354 }
16dc6a9e 355| "%code" ID braceless
8e0a5e9e 356 {
9611cfa2 357 muscle_percent_code_grow ($2, @2, $3, @3);
8e0a5e9e 358 code_scanner_last_string_free ();
8e0a5e9e 359 }
2c569025
AD
360;
361
58d7a1a1
AD
362
363/*----------*
364 | %union. |
365 *----------*/
366
367%token PERCENT_UNION "%union";
368
369union_name:
370 /* Nothing. */ {}
371| ID { muscle_code_grow ("union_name", $1, @1); }
372;
373
374grammar_declaration:
7ecec4dd 375 "%union" union_name braceless
58d7a1a1 376 {
ddc8ede1 377 union_seen = true;
7ecec4dd
JD
378 muscle_code_grow ("stype", $3, @3);
379 code_scanner_last_string_free ();
58d7a1a1
AD
380 }
381;
382
383
384
385
2c569025
AD
386symbol_declaration:
387 "%nterm" { current_class = nterm_sym; } symbol_defs.1
e9955c83
AD
388 {
389 current_class = unknown_sym;
390 current_type = NULL;
391 }
2c569025 392| "%token" { current_class = token_sym; } symbol_defs.1
e9955c83 393 {
2c569025 394 current_class = unknown_sym;
e9955c83
AD
395 current_type = NULL;
396 }
1e0bab92 397| "%type" TYPE symbols.1
e9955c83 398 {
3d2cbc26 399 symbol_list *list;
4f82b42a 400 tag_seen = true;
1e0bab92 401 for (list = $3; list; list = list->next)
3be03b13 402 symbol_type_set (list->content.sym, $2, @2);
dafdc66f 403 symbol_list_free ($3);
e9955c83
AD
404 }
405;
406
2c569025 407precedence_declaration:
ab7f29f8 408 precedence_declarator type.opt symbols.prec
1e0bab92 409 {
3d2cbc26 410 symbol_list *list;
1e0bab92
AD
411 ++current_prec;
412 for (list = $3; list; list = list->next)
413 {
3be03b13
JD
414 symbol_type_set (list->content.sym, current_type, @2);
415 symbol_precedence_set (list->content.sym, current_prec, $1, @1);
1e0bab92 416 }
dafdc66f 417 symbol_list_free ($3);
1e0bab92
AD
418 current_type = NULL;
419 }
e9955c83
AD
420;
421
2c569025 422precedence_declarator:
e9955c83
AD
423 "%left" { $$ = left_assoc; }
424| "%right" { $$ = right_assoc; }
425| "%nonassoc" { $$ = non_assoc; }
426;
427
428type.opt:
87fbb0bf 429 /* Nothing. */ { current_type = NULL; }
ddc8ede1 430| TYPE { current_type = $1; tag_seen = true; }
e9955c83
AD
431;
432
ab7f29f8
JD
433/* Just like symbols.1 but accept INT for the sake of POSIX. */
434symbols.prec:
435 symbol.prec
436 { $$ = symbol_list_sym_new ($1, @1); }
437| symbols.prec symbol.prec
438 { $$ = symbol_list_prepend ($1, symbol_list_sym_new ($2, @2)); }
439;
440
441symbol.prec:
442 symbol { $$ = $1; }
443 | symbol INT { $$ = $1; symbol_user_token_number_set ($1, $2, @2); }
444 ;
445
3be03b13 446/* One or more symbols to be %typed. */
1e0bab92 447symbols.1:
3be03b13
JD
448 symbol
449 { $$ = symbol_list_sym_new ($1, @1); }
450| symbols.1 symbol
451 { $$ = symbol_list_prepend ($1, symbol_list_sym_new ($2, @2)); }
452;
453
454generic_symlist:
455 generic_symlist_item { $$ = $1; }
456| generic_symlist generic_symlist_item { $$ = symbol_list_prepend ($1, $2); }
457;
458
459generic_symlist_item:
460 symbol { $$ = symbol_list_sym_new ($1, @1); }
461| TYPE { $$ = symbol_list_type_new ($1, @1); }
12e35840 462| "<*>" { $$ = symbol_list_default_tagged_new (@1); }
3ebecc24 463| "<>" { $$ = symbol_list_default_tagless_new (@1); }
e9955c83
AD
464;
465
e9955c83
AD
466/* One token definition. */
467symbol_def:
468 TYPE
469 {
470 current_type = $1;
ddc8ede1 471 tag_seen = true;
e9955c83 472 }
58d7a1a1 473| id
e9955c83 474 {
073f9288 475 symbol_class_set ($1, current_class, @1, true);
1a31ed21 476 symbol_type_set ($1, current_type, @1);
e9955c83 477 }
58d7a1a1 478| id INT
e9955c83 479 {
073f9288 480 symbol_class_set ($1, current_class, @1, true);
1a31ed21 481 symbol_type_set ($1, current_type, @1);
e776192e 482 symbol_user_token_number_set ($1, $2, @2);
e9955c83 483 }
58d7a1a1 484| id string_as_id
e9955c83 485 {
073f9288 486 symbol_class_set ($1, current_class, @1, true);
1a31ed21 487 symbol_type_set ($1, current_type, @1);
a5d50994 488 symbol_make_alias ($1, $2, @$);
e9955c83 489 }
58d7a1a1 490| id INT string_as_id
e9955c83 491 {
073f9288 492 symbol_class_set ($1, current_class, @1, true);
1a31ed21 493 symbol_type_set ($1, current_type, @1);
e776192e 494 symbol_user_token_number_set ($1, $2, @2);
a5d50994 495 symbol_make_alias ($1, $3, @$);
e9955c83
AD
496 }
497;
498
499/* One or more symbol definitions. */
500symbol_defs.1:
501 symbol_def
e9955c83 502| symbol_defs.1 symbol_def
e9955c83
AD
503;
504
2c569025
AD
505
506 /*------------------------------------------.
507 | The grammar section: between the two %%. |
508 `------------------------------------------*/
509
510grammar:
1921f1d7
AD
511 rules_or_grammar_declaration
512| grammar rules_or_grammar_declaration
513;
514
515/* As a Bison extension, one can use the grammar declarations in the
b7295522 516 body of the grammar. */
1921f1d7 517rules_or_grammar_declaration:
e9955c83 518 rules
8d0a98bb 519| grammar_declaration ";"
b275314e
AD
520| error ";"
521 {
522 yyerrok;
523 }
e9955c83
AD
524;
525
526rules:
7685e2f7
AR
527 id_colon named_ref.opt { current_lhs = $1; current_lhs_location = @1;
528 current_lhs_named_ref = $2; } rhses.1
e9955c83
AD
529;
530
531rhses.1:
8f3596a6
AD
532 rhs { grammar_current_rule_end (@1); }
533| rhses.1 "|" rhs { grammar_current_rule_end (@3); }
8d0a98bb 534| rhses.1 ";"
e9955c83
AD
535;
536
537rhs:
538 /* Nothing. */
7685e2f7
AR
539 { grammar_current_rule_begin (current_lhs, current_lhs_location,
540 current_lhs_named_ref); }
541| rhs symbol named_ref.opt
542 { grammar_current_rule_symbol_append ($2, @2, $3); }
543| rhs "{...}" named_ref.opt
544 { grammar_current_rule_action_append ($2, @2, $3); }
e9955c83 545| rhs "%prec" symbol
e776192e 546 { grammar_current_rule_prec_set ($3, @3); }
676385e2
PH
547| rhs "%dprec" INT
548 { grammar_current_rule_dprec_set ($3, @3); }
549| rhs "%merge" TYPE
550 { grammar_current_rule_merge_set ($3, @3); }
e9955c83
AD
551;
552
7685e2f7 553named_ref.opt:
d5e8574b 554 /* Nothing. */ { $$ = 0; }
7685e2f7 555|
d5e8574b 556 BRACKETED_ID { $$ = named_ref_new($1, @1); }
7685e2f7
AR
557;
558
58d7a1a1 559
16dc6a9e
JD
560/*----------------------------*
561 | variable and content.opt. |
562 *---------------------------*/
563
ae618dcc
JD
564/* The STRING form of variable is deprecated and is not M4-friendly.
565 For example, M4 fails for `%define "[" "value"'. */
16dc6a9e
JD
566variable:
567 ID
663ce7bb
AD
568| STRING { $$ = uniqstr_new ($1); }
569;
2ce4ed68 570
592d0b1e 571/* Some content or empty by default. */
2ce4ed68 572content.opt:
663ce7bb 573 /* Nothing. */ { $$ = ""; }
f37495f6 574| ID { $$ = $1; }
6afc30cc 575| STRING
2ce4ed68
AD
576;
577
578
6afc30cc
JD
579/*-------------*
580 | braceless. |
581 *-------------*/
582
2ce4ed68
AD
583braceless:
584 "{...}"
585 {
7c0c6181 586 code_props plain_code;
2ce4ed68 587 $1[strlen ($1) - 1] = '\n';
7c0c6181
JD
588 code_props_plain_init (&plain_code, $1+1, @1);
589 code_props_translate_code (&plain_code);
590 gram_scanner_last_string_free ();
591 $$ = plain_code.code;
2ce4ed68
AD
592 }
593;
594
595
58d7a1a1
AD
596/*---------------*
597 | Identifiers. |
598 *---------------*/
599
33ad1a9c
PE
600/* Identifiers are returned as uniqstr values by the scanner.
601 Depending on their use, we may need to make them genuine symbols. */
58d7a1a1
AD
602
603id:
33ad1a9c 604 ID
203b9274 605 { $$ = symbol_from_uniqstr ($1, @1); }
33ad1a9c
PE
606| CHAR
607 {
608 $$ = symbol_get (char_name ($1), @1);
609 symbol_class_set ($$, token_sym, @1, false);
610 symbol_user_token_number_set ($$, $1, @1);
611 }
58d7a1a1
AD
612;
613
614id_colon:
203b9274 615 ID_COLON { $$ = symbol_from_uniqstr ($1, @1); }
58d7a1a1
AD
616;
617
618
e9955c83 619symbol:
58d7a1a1
AD
620 id
621| string_as_id
e9955c83
AD
622;
623
ca407bdf 624/* A string used as an ID: quote it. */
e9955c83
AD
625string_as_id:
626 STRING
627 {
ca407bdf 628 $$ = symbol_get (quotearg_style (c_quoting_style, $1), @1);
db89d400 629 symbol_class_set ($$, token_sym, @1, false);
e9955c83
AD
630 }
631;
632
e9955c83
AD
633epilogue.opt:
634 /* Nothing. */
e9955c83
AD
635| "%%" EPILOGUE
636 {
7c0c6181
JD
637 code_props plain_code;
638 code_props_plain_init (&plain_code, $2, @2);
639 code_props_translate_code (&plain_code);
e9071366 640 gram_scanner_last_string_free ();
7c0c6181
JD
641 muscle_code_grow ("epilogue", plain_code.code, @2);
642 code_scanner_last_string_free ();
e9955c83
AD
643 }
644;
645
e9955c83 646%%
b7295522
PE
647
648
649/* Return the location of the left-hand side of a rule whose
650 right-hand side is RHS[1] ... RHS[N]. Ignore empty nonterminals in
651 the right-hand side, and return an empty location equal to the end
652 boundary of RHS[0] if the right-hand side is empty. */
653
654static YYLTYPE
655lloc_default (YYLTYPE const *rhs, int n)
656{
657 int i;
a737b216 658 YYLTYPE loc;
62cb8a99
PE
659
660 /* SGI MIPSpro 7.4.1m miscompiles "loc.start = loc.end = rhs[n].end;".
661 The bug is fixed in 7.4.2m, but play it safe for now. */
662 loc.start = rhs[n].end;
663 loc.end = rhs[n].end;
b7295522 664
5320ca4d
PE
665 /* Ignore empty nonterminals the start of the the right-hand side.
666 Do not bother to ignore them at the end of the right-hand side,
667 since empty nonterminals have the same end as their predecessors. */
b7295522
PE
668 for (i = 1; i <= n; i++)
669 if (! equal_boundaries (rhs[i].start, rhs[i].end))
670 {
a737b216 671 loc.start = rhs[i].start;
b7295522
PE
672 break;
673 }
674
a737b216 675 return loc;
b7295522
PE
676}
677
678
679/* Add a lex-param or a parse-param (depending on TYPE) with
680 declaration DECL and location LOC. */
681
1773ceee 682static void
e9ce5688 683add_param (char const *type, char *decl, location loc)
1773ceee 684{
ead9e56e 685 static char const alphanum[26 + 26 + 1 + 10] =
1773ceee
PE
686 "abcdefghijklmnopqrstuvwxyz"
687 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
ead9e56e
PE
688 "_"
689 "0123456789";
1773ceee 690 char const *name_start = NULL;
e9ce5688 691 char *p;
1773ceee 692
e503aa60
AD
693 /* Stop on last actual character. */
694 for (p = decl; p[1]; p++)
ead9e56e
PE
695 if ((p == decl
696 || ! memchr (alphanum, p[-1], sizeof alphanum))
697 && memchr (alphanum, p[0], sizeof alphanum - 10))
1773ceee
PE
698 name_start = p;
699
ead9e56e
PE
700 /* Strip the surrounding '{' and '}', and any blanks just inside
701 the braces. */
702 while (*--p == ' ' || *p == '\t')
703 continue;
e503aa60 704 p[1] = '\0';
ead9e56e
PE
705 while (*++decl == ' ' || *decl == '\t')
706 continue;
e9ce5688 707
1773ceee
PE
708 if (! name_start)
709 complain_at (loc, _("missing identifier in parameter declaration"));
710 else
711 {
712 char *name;
713 size_t name_len;
714
715 for (name_len = 1;
ead9e56e 716 memchr (alphanum, name_start[name_len], sizeof alphanum);
1773ceee
PE
717 name_len++)
718 continue;
719
720 name = xmalloc (name_len + 1);
721 memcpy (name, name_start, name_len);
722 name[name_len] = '\0';
723 muscle_pair_list_grow (type, decl, name);
724 free (name);
725 }
726
e9071366 727 gram_scanner_last_string_free ();
1773ceee
PE
728}
729
2ce4ed68 730
b50d2359
AD
731static void
732version_check (location const *loc, char const *version)
733{
734 if (strverscmp (version, PACKAGE_VERSION) > 0)
9b8a5ce0
AD
735 {
736 complain_at (*loc, "require bison %s, but have %s",
737 version, PACKAGE_VERSION);
738 exit (63);
739 }
b50d2359
AD
740}
741
1fec91df 742static void
3d2cbc26 743gram_error (location const *loc, char const *msg)
e9955c83 744{
ad8a3efc 745 complain_at (*loc, "%s", msg);
e9955c83 746}
e9ce5688
PE
747
748char const *
749token_name (int type)
750{
fc01665e 751 return yytname[YYTRANSLATE (type)];
e9ce5688 752}
33ad1a9c
PE
753
754static char const *
755char_name (char c)
756{
757 if (c == '\'')
758 return "'\\''";
759 else
760 {
761 char buf[4];
762 buf[0] = '\''; buf[1] = c; buf[2] = '\''; buf[3] = '\0';
763 return quotearg_style (escape_quoting_style, buf);
764 }
765}