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