]> git.saurik.com Git - bison.git/blame - src/reader.c
POSIX: complain if %prec's token was not defined.
[bison.git] / src / reader.c
CommitLineData
35dcf428 1/* Input parser for Bison
9c4637fa 2
05ac60f3 3 Copyright (C) 1984, 1986, 1989, 1992, 1998, 2000, 2001, 2002, 2003,
03c07b03 4 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
1ff442ca 5
41aca2e0 6 This file is part of Bison, the GNU Compiler Compiler.
1ff442ca 7
f16b0819 8 This program is free software: you can redistribute it and/or modify
41aca2e0 9 it under the terms of the GNU General Public License as published by
f16b0819
PE
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
1ff442ca 12
f16b0819 13 This program is distributed in the hope that it will be useful,
41aca2e0
AD
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.
1ff442ca 17
41aca2e0 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/>. */
1ff442ca 20
2cec9080 21#include <config.h>
1ff442ca 22#include "system.h"
17ee7397 23
7685e2f7 24#include <quote.h>
17ee7397
PE
25#include <quotearg.h>
26
27#include "complain.h"
28#include "conflicts.h"
1ff442ca 29#include "files.h"
17ee7397 30#include "getargs.h"
1ff442ca 31#include "gram.h"
23ec25b7 32#include "muscle-tab.h"
b2ca4022 33#include "reader.h"
17ee7397
PE
34#include "symlist.h"
35#include "symtab.h"
e9071366
AD
36#include "scan-gram.h"
37#include "scan-code.h"
1ff442ca 38
07c0db18 39static void prepare_percent_define_front_end_variables (void);
02d12d0d
PE
40static void check_and_convert_grammar (void);
41
17ee7397 42static symbol_list *grammar = NULL;
d0829076 43static bool start_flag = false;
676385e2 44merger_list *merge_functions;
1ff442ca 45
34f98f46 46/* Was %union seen? */
ddc8ede1
PE
47bool union_seen = false;
48
49/* Was a tag seen? */
50bool tag_seen = false;
39a06c25
PE
51
52/* Should rules have a default precedence? */
53bool default_prec = true;
0d533154 54\f
e9955c83
AD
55/*-----------------------.
56| Set the start symbol. |
57`-----------------------*/
1ff442ca 58
e9955c83 59void
a737b216 60grammar_start_symbol_set (symbol *sym, location loc)
1ff442ca
NF
61{
62 if (start_flag)
17ee7397 63 complain_at (loc, _("multiple %s declarations"), "%start");
943819bf
RS
64 else
65 {
d0829076 66 start_flag = true;
a737b216 67 startsymbol = sym;
17ee7397 68 startsymbol_location = loc;
943819bf 69 }
1ff442ca
NF
70}
71
a70083a3
AD
72\f
73
8ee5b538
JD
74/*------------------------------------------------------------------------.
75| Return the merger index for a merging function named NAME. Records the |
76| function, if new, in MERGER_LIST. |
77`------------------------------------------------------------------------*/
676385e2
PH
78
79static int
8ee5b538 80get_merge_function (uniqstr name)
676385e2
PH
81{
82 merger_list *syms;
83 merger_list head;
84 int n;
85
86 if (! glr_parser)
87 return 0;
88
676385e2 89 head.next = merge_functions;
affac613 90 for (syms = &head, n = 1; syms->next; syms = syms->next, n += 1)
17ee7397 91 if (UNIQSTR_EQ (name, syms->next->name))
676385e2 92 break;
a5d50994
AD
93 if (syms->next == NULL)
94 {
da2a7671 95 syms->next = xmalloc (sizeof syms->next[0]);
17ee7397 96 syms->next->name = uniqstr_new (name);
8ee5b538
JD
97 /* After all symbol type declarations have been parsed, packgram invokes
98 record_merge_function_type to set the type. */
99 syms->next->type = NULL;
a5d50994
AD
100 syms->next->next = NULL;
101 merge_functions = head.next;
102 }
676385e2
PH
103 return n;
104}
105
8ee5b538
JD
106/*-------------------------------------------------------------------------.
107| For the existing merging function with index MERGER, record the result |
108| type as TYPE as required by the lhs of the rule whose %merge declaration |
109| is at DECLARATION_LOC. |
110`-------------------------------------------------------------------------*/
111
112static void
113record_merge_function_type (int merger, uniqstr type, location declaration_loc)
114{
115 int merger_find;
116 merger_list *merge_function;
117
118 if (merger <= 0)
119 return;
120
121 if (type == NULL)
122 type = uniqstr_new ("");
123
124 merger_find = 1;
125 for (merge_function = merge_functions;
126 merge_function != NULL && merger_find != merger;
127 merge_function = merge_function->next)
128 merger_find += 1;
4f82b42a 129 aver (merge_function != NULL && merger_find == merger);
dd60572a 130 if (merge_function->type != NULL && !UNIQSTR_EQ (merge_function->type, type))
8ee5b538 131 {
3b452f4e
JD
132 complain_at (declaration_loc,
133 _("result type clash on merge function `%s': <%s> != <%s>"),
134 merge_function->name, type, merge_function->type);
135 complain_at (merge_function->type_declaration_location,
136 _("previous declaration"));
8ee5b538 137 }
dd60572a
JD
138 merge_function->type = uniqstr_new (type);
139 merge_function->type_declaration_location = declaration_loc;
8ee5b538
JD
140}
141
676385e2
PH
142/*--------------------------------------.
143| Free all merge-function definitions. |
144`--------------------------------------*/
145
146void
147free_merger_functions (void)
148{
affac613
AD
149 merger_list *L0 = merge_functions;
150 while (L0)
676385e2
PH
151 {
152 merger_list *L1 = L0->next;
153 free (L0);
154 L0 = L1;
155 }
156}
157
a70083a3 158\f
107f7dfb 159/*-------------------------------------------------------------------.
17ee7397 160| Parse the input grammar into a one symbol_list structure. Each |
107f7dfb
AD
161| rule is represented by a sequence of symbols: the left hand side |
162| followed by the contents of the right hand side, followed by a |
163| null pointer instead of a symbol to terminate the rule. The next |
164| symbol is the lhs of the following rule. |
165| |
fdbcd8e2
AD
166| All actions are copied out, labelled by the rule number they apply |
167| to. |
107f7dfb 168`-------------------------------------------------------------------*/
1ff442ca 169
f6d0f937 170/* The (currently) last symbol of GRAMMAR. */
04098407 171static symbol_list *grammar_end = NULL;
f6d0f937 172
52328c6e 173/* Append SYM to the grammar. */
7685e2f7 174static symbol_list *
17ee7397 175grammar_symbol_append (symbol *sym, location loc)
f6d0f937 176{
3be03b13 177 symbol_list *p = symbol_list_sym_new (sym, loc);
f6d0f937
AD
178
179 if (grammar_end)
180 grammar_end->next = p;
181 else
182 grammar = p;
183
184 grammar_end = p;
8f3596a6 185
e3233bf6 186 /* A null SYM stands for an end of rule; it is not an actual
8f3596a6
AD
187 part of it. */
188 if (sym)
189 ++nritems;
7685e2f7
AR
190
191 return p;
f6d0f937
AD
192}
193
d5e8574b 194static void
992e874a 195assign_named_ref (symbol_list *p, named_ref *name)
d5e8574b
AR
196{
197 symbol *sym = p->content.sym;
198
992e874a 199 if (name->id == sym->tag)
d5e8574b 200 {
992e874a 201 warn_at (name->loc,
d5e8574b
AR
202 _("duplicated symbol name for %s ignored"),
203 quote (sym->tag));
992e874a 204 named_ref_free (name);
d5e8574b
AR
205 }
206 else
992e874a 207 p->named_ref = name;
d5e8574b
AR
208}
209
210
8efe435c
AD
211/* The rule currently being defined, and the previous rule.
212 CURRENT_RULE points to the first LHS of the current rule, while
213 PREVIOUS_RULE_END points to the *end* of the previous rule (NULL). */
e256e17f 214static symbol_list *current_rule = NULL;
04098407 215static symbol_list *previous_rule_end = NULL;
da4160c3
AD
216
217
8efe435c
AD
218/*----------------------------------------------.
219| Create a new rule for LHS in to the GRAMMAR. |
220`----------------------------------------------*/
da4160c3 221
e9955c83 222void
7685e2f7 223grammar_current_rule_begin (symbol *lhs, location loc,
992e874a 224 named_ref *lhs_name)
da4160c3 225{
7685e2f7
AR
226 symbol_list* p;
227
da4160c3
AD
228 /* Start a new rule and record its lhs. */
229 ++nrules;
8efe435c 230 previous_rule_end = grammar_end;
7685e2f7
AR
231
232 p = grammar_symbol_append (lhs, loc);
992e874a
AR
233 if (lhs_name)
234 assign_named_ref(p, lhs_name);
7685e2f7 235
da4160c3
AD
236 current_rule = grammar_end;
237
238 /* Mark the rule's lhs as a nonterminal if not already so. */
da4160c3
AD
239 if (lhs->class == unknown_sym)
240 {
241 lhs->class = nterm_sym;
242 lhs->number = nvars;
243 ++nvars;
244 }
245 else if (lhs->class == token_sym)
17ee7397 246 complain_at (loc, _("rule given for %s, which is a token"), lhs->tag);
da4160c3
AD
247}
248
affac613 249
d40ba6c2 250/*----------------------------------------------------------------------.
17bd8a73
JD
251| A symbol should be used if either: |
252| 1. It has a destructor. |
253| 2. --warnings=midrule-values and the symbol is a mid-rule symbol |
254| (i.e., the generated LHS replacing a mid-rule action) that was |
255| assigned to or used, as in "exp: { $$ = 1; } { $$ = $1; }". |
d40ba6c2 256`----------------------------------------------------------------------*/
84866159
AD
257
258static bool
d40ba6c2 259symbol_should_be_used (symbol_list const *s)
84866159 260{
95021767 261 if (symbol_destructor_get (s->content.sym)->code)
17bd8a73
JD
262 return true;
263 if (warnings_flag & warnings_midrule_values)
f6857bbf 264 return ((s->midrule && s->midrule->action_props.is_value_used)
b0f4c4ea
JD
265 || (s->midrule_parent_rule
266 && symbol_list_n_get (s->midrule_parent_rule,
f6857bbf
JD
267 s->midrule_parent_rhs_index)
268 ->action_props.is_value_used));
17bd8a73 269 return false;
84866159
AD
270}
271
8f3596a6
AD
272/*----------------------------------------------------------------.
273| Check that the rule R is properly defined. For instance, there |
274| should be no type clash on the default action. |
275`----------------------------------------------------------------*/
e9955c83
AD
276
277static void
8f3596a6 278grammar_rule_check (const symbol_list *r)
e9955c83 279{
affac613 280 /* Type check.
e9955c83 281
affac613
AD
282 If there is an action, then there is nothing we can do: the user
283 is allowed to shoot herself in the foot.
3f4c0f80 284
affac613
AD
285 Don't worry about the default action if $$ is untyped, since $$'s
286 value can't be used. */
f6857bbf 287 if (!r->action_props.code && r->content.sym->type_name)
e9955c83 288 {
3be03b13 289 symbol *first_rhs = r->next->content.sym;
affac613
AD
290 /* If $$ is being set in default way, report if any type mismatch. */
291 if (first_rhs)
292 {
3be03b13 293 char const *lhs_type = r->content.sym->type_name;
affac613
AD
294 const char *rhs_type =
295 first_rhs->type_name ? first_rhs->type_name : "";
296 if (!UNIQSTR_EQ (lhs_type, rhs_type))
8f3596a6 297 warn_at (r->location,
affac613
AD
298 _("type clash on default action: <%s> != <%s>"),
299 lhs_type, rhs_type);
300 }
301 /* Warn if there is no default for $$ but we need one. */
302 else
8f3596a6 303 warn_at (r->location,
affac613
AD
304 _("empty rule for typed nonterminal, and no action"));
305 }
e3233bf6 306
d40ba6c2 307 /* Check that symbol values that should be used are in fact used. */
8f3596a6 308 {
668c5d19 309 symbol_list const *l = r;
8f3596a6 310 int n = 0;
3be03b13 311 for (; l && l->content.sym; l = l->next, ++n)
f6857bbf 312 if (! (l->action_props.is_value_used
d40ba6c2 313 || !symbol_should_be_used (l)
8f3596a6 314 /* The default action, $$ = $1, `uses' both. */
f6857bbf 315 || (!r->action_props.code && (n == 0 || n == 1))))
668c5d19
PE
316 {
317 if (n)
318 warn_at (r->location, _("unused value: $%d"), n);
319 else
320 warn_at (r->location, _("unset value: $$"));
321 }
8f3596a6 322 }
2c203528
JD
323
324 /* See comments in grammar_current_rule_prec_set for how POSIX
325 mandates this complaint. It's only for identifiers, so skip
326 it for char literals and strings, which are always tokens. */
327 if (r->ruleprec
328 && r->ruleprec->tag[0] != '\'' && r->ruleprec->tag[0] != '"'
329 && !r->ruleprec->declared && !r->ruleprec->prec)
510df951
JD
330 complain_at (r->location, _("token for %%prec is not defined: %s"),
331 r->ruleprec->tag);
e9955c83
AD
332}
333
334
8efe435c
AD
335/*-------------------------------------.
336| End the currently being grown rule. |
337`-------------------------------------*/
e9955c83
AD
338
339void
8f3596a6 340grammar_current_rule_end (location loc)
e9955c83
AD
341{
342 /* Put an empty link in the list to mark the end of this rule */
8efe435c 343 grammar_symbol_append (NULL, grammar_end->location);
17ee7397 344 current_rule->location = loc;
e9955c83
AD
345}
346
347
8efe435c
AD
348/*-------------------------------------------------------------------.
349| The previous action turns out the be a mid-rule action. Attach it |
350| to the current rule, i.e., create a dummy symbol, attach it this |
351| mid-rule action, and append this dummy nonterminal to the current |
352| rule. |
353`-------------------------------------------------------------------*/
1485e106 354
6b702268 355void
1485e106
AD
356grammar_midrule_action (void)
357{
358 /* Since the action was written out with this rule's number, we must
359 give the new rule this number by inserting the new rule before
360 it. */
361
8efe435c
AD
362 /* Make a DUMMY nonterminal, whose location is that of the midrule
363 action. Create the MIDRULE. */
f6857bbf 364 location dummy_location = current_rule->action_props.location;
17ee7397 365 symbol *dummy = dummy_symbol_get (dummy_location);
3be03b13 366 symbol_list *midrule = symbol_list_sym_new (dummy, dummy_location);
1485e106 367
d5e8574b 368 /* Remember named_ref of previous action. */
992e874a 369 named_ref *action_name = current_rule->action_props.named_ref;
7685e2f7 370
1485e106
AD
371 /* Make a new rule, whose body is empty, before the current one, so
372 that the action just read can belong to it. */
373 ++nrules;
374 ++nritems;
8efe435c
AD
375 /* Attach its location and actions to that of the DUMMY. */
376 midrule->location = dummy_location;
f6857bbf
JD
377 code_props_rule_action_init (&midrule->action_props,
378 current_rule->action_props.code,
379 current_rule->action_props.location,
7685e2f7 380 midrule, 0);
f6857bbf 381 code_props_none_init (&current_rule->action_props);
1485e106 382
8efe435c
AD
383 if (previous_rule_end)
384 previous_rule_end->next = midrule;
1485e106 385 else
8efe435c 386 grammar = midrule;
1485e106 387
8efe435c 388 /* End the dummy's rule. */
3be03b13 389 midrule->next = symbol_list_sym_new (NULL, dummy_location);
84866159 390 midrule->next->next = current_rule;
1485e106 391
84866159 392 previous_rule_end = midrule->next;
1485e106 393
8efe435c 394 /* Insert the dummy nonterminal replacing the midrule action into
84866159 395 the current rule. Bind it to its dedicated rule. */
992e874a
AR
396 grammar_current_rule_symbol_append (dummy, dummy_location,
397 action_name);
6ec2c0f2 398 grammar_end->midrule = midrule;
ffa4ba3a
JD
399 midrule->midrule_parent_rule = current_rule;
400 midrule->midrule_parent_rhs_index = symbol_list_length (current_rule->next);
1485e106
AD
401}
402
9af3fbce
AD
403/* Set the precedence symbol of the current rule to PRECSYM. */
404
e9955c83 405void
17ee7397 406grammar_current_rule_prec_set (symbol *precsym, location loc)
9af3fbce 407{
2c203528
JD
408 /* POSIX says that any identifier is a nonterminal if it does not
409 appear on the LHS of a grammar rule and is not defined by %token
410 or by one of the directives that assigns precedence to a token. We
411 ignore this here because the only kind of identifier that POSIX
412 allows to follow a %prec is a token and because assuming it's a
413 token now can produce more logical error messages. Nevertheless,
414 grammar_rule_check does obey what we believe is the real intent of
415 POSIX here: that an error be reported for any identifier that
416 appears after %prec but that is not defined separately as a
417 token. */
26b8a438 418 symbol_class_set (precsym, token_sym, loc, false);
9af3fbce 419 if (current_rule->ruleprec)
17ee7397 420 complain_at (loc, _("only one %s allowed per rule"), "%prec");
9af3fbce
AD
421 current_rule->ruleprec = precsym;
422}
423
676385e2
PH
424/* Attach dynamic precedence DPREC to the current rule. */
425
426void
17ee7397 427grammar_current_rule_dprec_set (int dprec, location loc)
676385e2
PH
428{
429 if (! glr_parser)
17ee7397 430 warn_at (loc, _("%s affects only GLR parsers"), "%dprec");
676385e2 431 if (dprec <= 0)
17ee7397 432 complain_at (loc, _("%s must be followed by positive number"), "%dprec");
39f41916 433 else if (current_rule->dprec != 0)
17ee7397 434 complain_at (loc, _("only one %s allowed per rule"), "%dprec");
676385e2
PH
435 current_rule->dprec = dprec;
436}
437
438/* Attach a merge function NAME with argument type TYPE to current
439 rule. */
440
441void
17ee7397 442grammar_current_rule_merge_set (uniqstr name, location loc)
676385e2
PH
443{
444 if (! glr_parser)
17ee7397 445 warn_at (loc, _("%s affects only GLR parsers"), "%merge");
39f41916 446 if (current_rule->merger != 0)
17ee7397 447 complain_at (loc, _("only one %s allowed per rule"), "%merge");
8ee5b538
JD
448 current_rule->merger = get_merge_function (name);
449 current_rule->merger_declaration_location = loc;
676385e2
PH
450}
451
17ee7397 452/* Attach SYM to the current rule. If needed, move the previous
2e047461
AD
453 action as a mid-rule action. */
454
e9955c83 455void
7685e2f7 456grammar_current_rule_symbol_append (symbol *sym, location loc,
992e874a 457 named_ref *name)
2e047461 458{
7685e2f7 459 symbol_list *p;
f6857bbf 460 if (current_rule->action_props.code)
2e047461 461 grammar_midrule_action ();
7685e2f7 462 p = grammar_symbol_append (sym, loc);
992e874a
AR
463 if (name)
464 assign_named_ref(p, name);
2e047461
AD
465}
466
6b702268 467/* Attach an ACTION to the current rule. */
2e047461 468
e9955c83 469void
7685e2f7 470grammar_current_rule_action_append (const char *action, location loc,
992e874a 471 named_ref *name)
2e047461 472{
f6857bbf 473 if (current_rule->action_props.code)
381ecb06 474 grammar_midrule_action ();
ffa4ba3a 475 /* After all symbol declarations have been parsed, packgram invokes
f6857bbf
JD
476 code_props_translate_code. */
477 code_props_rule_action_init (&current_rule->action_props, action, loc,
992e874a 478 current_rule, name);
2e047461
AD
479}
480
a70083a3 481\f
a70083a3
AD
482/*---------------------------------------------------------------.
483| Convert the rules into the representation using RRHS, RLHS and |
d9b739c3 484| RITEM. |
a70083a3 485`---------------------------------------------------------------*/
1ff442ca 486
4a120d45 487static void
118fb205 488packgram (void)
1ff442ca 489{
9222837b 490 unsigned int itemno = 0;
17ee7397
PE
491 rule_number ruleno = 0;
492 symbol_list *p = grammar;
1ff442ca 493
e9ad4aec
PE
494 ritem = xnmalloc (nritems + 1, sizeof *ritem);
495
496 /* This sentinel is used by build_relations in gram.c. */
497 *ritem++ = 0;
498
da2a7671 499 rules = xnmalloc (nrules, sizeof *rules);
1ff442ca 500
1ff442ca
NF
501 while (p)
502 {
e9071366 503 int rule_length = 0;
17ee7397 504 symbol *ruleprec = p->ruleprec;
3be03b13 505 record_merge_function_type (p->merger, p->content.sym->type_name,
8ee5b538 506 p->merger_declaration_location);
d7e1f00c 507 rules[ruleno].user_number = ruleno;
c3b407f4 508 rules[ruleno].number = ruleno;
3be03b13 509 rules[ruleno].lhs = p->content.sym;
99013900 510 rules[ruleno].rhs = ritem + itemno;
da2a7671
PE
511 rules[ruleno].prec = NULL;
512 rules[ruleno].dprec = p->dprec;
513 rules[ruleno].merger = p->merger;
514 rules[ruleno].precsym = NULL;
8efe435c 515 rules[ruleno].location = p->location;
b4afb6bb 516 rules[ruleno].useful = true;
f6857bbf
JD
517 rules[ruleno].action = p->action_props.code;
518 rules[ruleno].action_location = p->action_props.location;
1ff442ca 519
f91b1629
JD
520 /* If the midrule's $$ is set or its $n is used, remove the `$' from the
521 symbol name so that it's a user-defined symbol so that the default
522 %destructor and %printer apply. */
523 if (p->midrule_parent_rule
f6857bbf 524 && (p->action_props.is_value_used
b0f4c4ea 525 || symbol_list_n_get (p->midrule_parent_rule,
f6857bbf
JD
526 p->midrule_parent_rhs_index)
527 ->action_props.is_value_used))
f91b1629
JD
528 p->content.sym->tag += 1;
529
868d2d96
JD
530 /* Don't check the generated rule 0. It has no action, so some rhs
531 symbols may appear unused, but the parsing algorithm ensures that
532 %destructor's are invoked appropriately. */
533 if (p != grammar)
534 grammar_rule_check (p);
ffa4ba3a 535
3be03b13 536 for (p = p->next; p && p->content.sym; p = p->next)
1ff442ca 537 {
e9071366
AD
538 ++rule_length;
539
540 /* Don't allow rule_length == INT_MAX, since that might
541 cause confusion with strtol if INT_MAX == LONG_MAX. */
542 if (rule_length == INT_MAX)
543 fatal_at (rules[ruleno].location, _("rule is too long"));
544
17ee7397 545 /* item_number = symbol_number.
5fbb0954 546 But the former needs to contain more: negative rule numbers. */
3be03b13
JD
547 ritem[itemno++] =
548 symbol_number_as_item_number (p->content.sym->number);
1ff442ca 549 /* A rule gets by default the precedence and associativity
e9071366 550 of its last token. */
3be03b13
JD
551 if (p->content.sym->class == token_sym && default_prec)
552 rules[ruleno].prec = p->content.sym;
1ff442ca
NF
553 }
554
555 /* If this rule has a %prec,
a70083a3 556 the specified symbol's precedence replaces the default. */
1ff442ca
NF
557 if (ruleprec)
558 {
03b31c0c
AD
559 rules[ruleno].precsym = ruleprec;
560 rules[ruleno].prec = ruleprec;
1ff442ca 561 }
e9071366 562 /* An item ends by the rule number (negated). */
4b3d3a8e 563 ritem[itemno++] = rule_number_as_item_number (ruleno);
4f82b42a 564 aver (itemno < ITEM_NUMBER_MAX);
f3849179 565 ++ruleno;
4f82b42a 566 aver (ruleno < RULE_NUMBER_MAX);
1ff442ca 567
a70083a3
AD
568 if (p)
569 p = p->next;
1ff442ca
NF
570 }
571
4f82b42a 572 aver (itemno == nritems);
3067fbef 573
273a74fa 574 if (trace_flag & trace_sets)
3067fbef 575 ritem_print (stderr);
1ff442ca 576}
a70083a3 577\f
fdbcd8e2
AD
578/*------------------------------------------------------------------.
579| Read in the grammar specification and record it in the format |
580| described in gram.h. All actions are copied into ACTION_OBSTACK, |
581| in each case forming the body of a C function (YYACTION) which |
582| contains a switch statement to decide which action to execute. |
583`------------------------------------------------------------------*/
a70083a3
AD
584
585void
586reader (void)
587{
a70083a3 588 /* Initialize the symbol table. */
db8837cb 589 symbols_new ();
b6610515 590
88bce5a2
AD
591 /* Construct the accept symbol. */
592 accept = symbol_get ("$accept", empty_location);
593 accept->class = nterm_sym;
594 accept->number = nvars++;
30171f79 595
a70083a3 596 /* Construct the error token */
39f41916 597 errtoken = symbol_get ("error", empty_location);
d7020c20 598 errtoken->class = token_sym;
72a23c97 599 errtoken->number = ntokens++;
b6610515 600
a70083a3
AD
601 /* Construct a token that represents all undefined literal tokens.
602 It is always token number 2. */
88bce5a2 603 undeftoken = symbol_get ("$undefined", empty_location);
d7020c20 604 undeftoken->class = token_sym;
72a23c97 605 undeftoken->number = ntokens++;
a70083a3 606
2b81e969 607 gram_in = xfopen (grammar_file, "r");
e9955c83 608
473d0a75
AD
609 gram__flex_debug = trace_flag & trace_scan;
610 gram_debug = trace_flag & trace_parse;
e9071366 611 gram_scanner_initialize ();
78c3da9e 612 gram_parse ();
07c0db18 613 prepare_percent_define_front_end_variables ();
331dbc1b 614
07c0db18
JD
615 if (! complaint_issued)
616 check_and_convert_grammar ();
617
618 xfclose (gram_in);
619}
620
621static void
622prepare_percent_define_front_end_variables (void)
623{
624 /* Set %define front-end variable defaults. */
812775a0 625 muscle_percent_define_default ("lr.keep-unreachable-states", "false");
f805dfcb
JD
626 {
627 char *lr_type;
1c4aa81d
JD
628 /* IELR would be a better default, but LALR is historically the
629 default. */
3a414bbf 630 muscle_percent_define_default ("lr.type", "lalr");
f805dfcb 631 lr_type = muscle_percent_define_get ("lr.type");
3a414bbf 632 if (0 != strcmp (lr_type, "canonical-lr"))
1d0f55cc 633 muscle_percent_define_default ("lr.default-reductions", "all");
f805dfcb 634 else
1d0f55cc 635 muscle_percent_define_default ("lr.default-reductions", "accepting");
f805dfcb
JD
636 free (lr_type);
637 }
03c07b03 638
07c0db18 639 /* Check %define front-end variables. */
03c07b03
JD
640 {
641 static char const * const values[] = {
3a414bbf 642 "lr.type", "lalr", "ielr", "canonical-lr", NULL,
1d0f55cc 643 "lr.default-reductions", "all", "consistent", "accepting", NULL,
03c07b03
JD
644 NULL
645 };
646 muscle_percent_define_check_values (values);
647 }
02d12d0d
PE
648}
649
b275314e 650
02d12d0d
PE
651/*-------------------------------------------------------------.
652| Check the grammar that has just been read, and convert it to |
653| internal form. |
654`-------------------------------------------------------------*/
655
656static void
657check_and_convert_grammar (void)
658{
659 /* Grammar has been read. Do some checking. */
e9955c83
AD
660 if (nrules == 0)
661 fatal (_("no rules in the input grammar"));
662
88bce5a2
AD
663 /* If the user did not define her ENDTOKEN, do it now. */
664 if (!endtoken)
b7c49edf 665 {
88bce5a2
AD
666 endtoken = symbol_get ("$end", empty_location);
667 endtoken->class = token_sym;
668 endtoken->number = 0;
b7c49edf 669 /* Value specified by POSIX. */
88bce5a2 670 endtoken->user_token_number = 0;
b7c49edf
AD
671 }
672
24985964
JD
673 /* Report any undefined symbols and consider them nonterminals. */
674 symbols_check_defined ();
675
4d7370cb
JD
676 /* Find the start symbol if no %start. */
677 if (!start_flag)
678 {
679 symbol_list *node;
680 for (node = grammar;
3be03b13 681 node != NULL && symbol_is_dummy (node->content.sym);
4d7370cb
JD
682 node = node->next)
683 {
684 for (node = node->next;
3be03b13 685 node != NULL && node->content.sym != NULL;
4d7370cb
JD
686 node = node->next)
687 ;
688 }
4f82b42a 689 aver (node != NULL);
3be03b13
JD
690 grammar_start_symbol_set (node->content.sym,
691 node->content.sym->location);
4d7370cb
JD
692 }
693
02d12d0d 694 /* Insert the initial rule, whose line is that of the first rule
e9955c83
AD
695 (not that of the start symbol):
696
88bce5a2 697 accept: %start EOF. */
e9955c83 698 {
3be03b13 699 symbol_list *p = symbol_list_sym_new (accept, empty_location);
8efe435c 700 p->location = grammar->location;
3be03b13
JD
701 p->next = symbol_list_sym_new (startsymbol, empty_location);
702 p->next->next = symbol_list_sym_new (endtoken, empty_location);
703 p->next->next->next = symbol_list_sym_new (NULL, empty_location);
e9955c83
AD
704 p->next->next->next->next = grammar;
705 nrules += 1;
706 nritems += 3;
707 grammar = p;
708 }
709
4f82b42a 710 aver (nsyms <= SYMBOL_NUMBER_MAXIMUM && nsyms == ntokens + nvars);
b0c4483e 711
a70083a3
AD
712 /* Assign the symbols their symbol numbers. Write #defines for the
713 token symbols into FDEFINES if requested. */
2f1afb73 714 symbols_pack ();
93ede233 715
574add85
JD
716 /* Scan rule actions after invoking symbol_check_alias_consistency (in
717 symbols_pack above) so that token types are set correctly before the rule
718 action type checking.
719
720 Before invoking grammar_rule_check (in packgram below) on any rule, make
721 sure all actions have already been scanned in order to set `used' flags.
722 Otherwise, checking that a midrule's $$ should be set will not always work
723 properly because the check must forward-reference the midrule's parent
724 rule. For the same reason, all the `used' flags must be set before
725 checking whether to remove `$' from any midrule symbol name (also in
726 packgram). */
14462c2b
JD
727 {
728 symbol_list *sym;
729 for (sym = grammar; sym; sym = sym->next)
730 code_props_translate_code (&sym->action_props);
731 }
574add85 732
a70083a3 733 /* Convert the grammar into the format described in gram.h. */
6d0ef4ec 734 packgram ();
8419d367 735
17ee7397 736 /* The grammar as a symbol_list is no longer needed. */
17bd8a73 737 symbol_list_free (grammar);
a70083a3 738}