]> git.saurik.com Git - bison.git/blame - src/reader.c
Some wrapping.
[bison.git] / src / reader.c
CommitLineData
35dcf428 1/* Input parser for Bison
9c4637fa 2
05ac60f3
PE
3 Copyright (C) 1984, 1986, 1989, 1992, 1998, 2000, 2001, 2002, 2003,
4 2005 Free Software Foundation, Inc.
1ff442ca 5
41aca2e0 6 This file is part of Bison, the GNU Compiler Compiler.
1ff442ca 7
41aca2e0
AD
8 Bison is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
1ff442ca 12
41aca2e0
AD
13 Bison 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.
1ff442ca 17
41aca2e0
AD
18 You should have received a copy of the GNU General Public License
19 along with Bison; see the file COPYING. If not, write to
0fb669f9
PE
20 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA. */
1ff442ca 22
2cec9080 23#include <config.h>
1ff442ca 24#include "system.h"
17ee7397
PE
25
26#include <quotearg.h>
27
28#include "complain.h"
29#include "conflicts.h"
1ff442ca 30#include "files.h"
17ee7397 31#include "getargs.h"
1ff442ca 32#include "gram.h"
17ee7397 33#include "muscle_tab.h"
6c89f1c1 34#include "output.h"
b2ca4022 35#include "reader.h"
17ee7397
PE
36#include "symlist.h"
37#include "symtab.h"
1ff442ca 38
17ee7397 39static symbol_list *grammar = NULL;
d0829076 40static bool start_flag = false;
676385e2 41merger_list *merge_functions;
1ff442ca 42
affac613 43/* Was %union seen? */
d0829076 44bool typed = false;
39a06c25
PE
45
46/* Should rules have a default precedence? */
47bool default_prec = true;
0d533154 48\f
e9955c83
AD
49/*-----------------------.
50| Set the start symbol. |
51`-----------------------*/
1ff442ca 52
e9955c83 53void
a737b216 54grammar_start_symbol_set (symbol *sym, location loc)
1ff442ca
NF
55{
56 if (start_flag)
17ee7397 57 complain_at (loc, _("multiple %s declarations"), "%start");
943819bf
RS
58 else
59 {
d0829076 60 start_flag = true;
a737b216 61 startsymbol = sym;
17ee7397 62 startsymbol_location = loc;
943819bf 63 }
1ff442ca
NF
64}
65
1ff442ca 66
d7020c20 67/*----------------------------------------------------------------.
e9955c83
AD
68| There are two prologues: one before %union, one after. Augment |
69| the current one. |
d7020c20 70`----------------------------------------------------------------*/
1ff442ca 71
e9955c83 72void
17ee7397 73prologue_augment (const char *prologue, location loc)
b6610515 74{
e9955c83
AD
75 struct obstack *oout =
76 !typed ? &pre_prologue_obstack : &post_prologue_obstack;
b6610515 77
05ac60f3 78 obstack_fgrow1 (oout, "]b4_syncline(%d, [[", loc.start.line);
17ee7397
PE
79 MUSCLE_OBSTACK_SGROW (oout,
80 quotearg_style (c_quoting_style, loc.start.file));
6c239755 81 obstack_sgrow (oout, "]])[\n");
e9955c83 82 obstack_sgrow (oout, prologue);
b6610515
RA
83}
84
a70083a3
AD
85\f
86
3e6656f9 87/*-------------------------------------------------------------------.
676385e2
PH
88| Return the merger index for a merging function named NAME, whose |
89| arguments have type TYPE. Records the function, if new, in |
95612cfa 90| MERGER_LIST. |
676385e2
PH
91`-------------------------------------------------------------------*/
92
93static int
17ee7397 94get_merge_function (uniqstr name, uniqstr type, location loc)
676385e2
PH
95{
96 merger_list *syms;
97 merger_list head;
98 int n;
99
100 if (! glr_parser)
101 return 0;
102
103 if (type == NULL)
17ee7397 104 type = uniqstr_new ("");
676385e2
PH
105
106 head.next = merge_functions;
affac613 107 for (syms = &head, n = 1; syms->next; syms = syms->next, n += 1)
17ee7397 108 if (UNIQSTR_EQ (name, syms->next->name))
676385e2 109 break;
a5d50994
AD
110 if (syms->next == NULL)
111 {
da2a7671 112 syms->next = xmalloc (sizeof syms->next[0]);
17ee7397
PE
113 syms->next->name = uniqstr_new (name);
114 syms->next->type = uniqstr_new (type);
a5d50994
AD
115 syms->next->next = NULL;
116 merge_functions = head.next;
117 }
17ee7397 118 else if (!UNIQSTR_EQ (type, syms->next->type))
45a8a65d
PE
119 warn_at (loc, _("result type clash on merge function %s: <%s> != <%s>"),
120 name, type, syms->next->type);
676385e2
PH
121 return n;
122}
123
124/*--------------------------------------.
125| Free all merge-function definitions. |
126`--------------------------------------*/
127
128void
129free_merger_functions (void)
130{
affac613
AD
131 merger_list *L0 = merge_functions;
132 while (L0)
676385e2
PH
133 {
134 merger_list *L1 = L0->next;
135 free (L0);
136 L0 = L1;
137 }
138}
139
a70083a3 140\f
107f7dfb 141/*-------------------------------------------------------------------.
17ee7397 142| Parse the input grammar into a one symbol_list structure. Each |
107f7dfb
AD
143| rule is represented by a sequence of symbols: the left hand side |
144| followed by the contents of the right hand side, followed by a |
145| null pointer instead of a symbol to terminate the rule. The next |
146| symbol is the lhs of the following rule. |
147| |
fdbcd8e2
AD
148| All actions are copied out, labelled by the rule number they apply |
149| to. |
107f7dfb 150`-------------------------------------------------------------------*/
1ff442ca 151
f6d0f937 152/* The (currently) last symbol of GRAMMAR. */
04098407 153static symbol_list *grammar_end = NULL;
f6d0f937 154
52328c6e 155/* Append SYM to the grammar. */
e9955c83 156void
17ee7397 157grammar_symbol_append (symbol *sym, location loc)
f6d0f937 158{
17ee7397 159 symbol_list *p = symbol_list_new (sym, loc);
f6d0f937
AD
160
161 if (grammar_end)
162 grammar_end->next = p;
163 else
164 grammar = p;
165
166 grammar_end = p;
167}
168
8efe435c
AD
169/* The rule currently being defined, and the previous rule.
170 CURRENT_RULE points to the first LHS of the current rule, while
171 PREVIOUS_RULE_END points to the *end* of the previous rule (NULL). */
17ee7397 172symbol_list *current_rule = NULL;
04098407 173static symbol_list *previous_rule_end = NULL;
da4160c3
AD
174
175
8efe435c
AD
176/*----------------------------------------------.
177| Create a new rule for LHS in to the GRAMMAR. |
178`----------------------------------------------*/
da4160c3 179
e9955c83 180void
17ee7397 181grammar_rule_begin (symbol *lhs, location loc)
da4160c3
AD
182{
183 if (!start_flag)
184 {
185 startsymbol = lhs;
17ee7397 186 startsymbol_location = loc;
d0829076 187 start_flag = true;
da4160c3
AD
188 }
189
190 /* Start a new rule and record its lhs. */
191 ++nrules;
192 ++nritems;
193
8efe435c 194 previous_rule_end = grammar_end;
17ee7397 195 grammar_symbol_append (lhs, loc);
da4160c3
AD
196 current_rule = grammar_end;
197
198 /* Mark the rule's lhs as a nonterminal if not already so. */
da4160c3
AD
199 if (lhs->class == unknown_sym)
200 {
201 lhs->class = nterm_sym;
202 lhs->number = nvars;
203 ++nvars;
204 }
205 else if (lhs->class == token_sym)
17ee7397 206 complain_at (loc, _("rule given for %s, which is a token"), lhs->tag);
da4160c3
AD
207}
208
affac613
AD
209
210/*------------------------------------------------------------------.
211| Check that the last rule (CURRENT_RULE) is properly defined. For |
212| instance, there should be no type clash on the default action. |
213`------------------------------------------------------------------*/
e9955c83
AD
214
215static void
216grammar_current_rule_check (void)
217{
17ee7397 218 symbol *lhs = current_rule->sym;
3f4c0f80 219 char const *lhs_type = lhs->type_name;
e9955c83 220
affac613 221 /* Type check.
e9955c83 222
affac613
AD
223 If there is an action, then there is nothing we can do: the user
224 is allowed to shoot herself in the foot.
3f4c0f80 225
affac613
AD
226 Don't worry about the default action if $$ is untyped, since $$'s
227 value can't be used. */
228 if (!current_rule->action && lhs_type)
e9955c83 229 {
affac613
AD
230 symbol *first_rhs = current_rule->next->sym;
231 /* If $$ is being set in default way, report if any type mismatch. */
232 if (first_rhs)
233 {
234 const char *rhs_type =
235 first_rhs->type_name ? first_rhs->type_name : "";
236 if (!UNIQSTR_EQ (lhs_type, rhs_type))
237 warn_at (current_rule->location,
238 _("type clash on default action: <%s> != <%s>"),
239 lhs_type, rhs_type);
240 }
241 /* Warn if there is no default for $$ but we need one. */
242 else
e9273511 243 warn_at (current_rule->location,
affac613
AD
244 _("empty rule for typed nonterminal, and no action"));
245 }
246
247 /* Check that all the symbol values are used. */
248 if (typed)
249 {
250 symbol_list *l = current_rule;
251 int n = 1;
252 for (l = current_rule->next; l && l->sym; l = l->next, ++n)
253 /* The default action `uses' $1. */
254 if (! (!current_rule->action && n == 1)
255 && l->sym->type_name && !l->used)
256 warn_at (current_rule->location, _("unused value: $%d"), n);
e9955c83 257 }
e9955c83
AD
258}
259
260
8efe435c
AD
261/*-------------------------------------.
262| End the currently being grown rule. |
263`-------------------------------------*/
e9955c83
AD
264
265void
17ee7397 266grammar_rule_end (location loc)
e9955c83
AD
267{
268 /* Put an empty link in the list to mark the end of this rule */
8efe435c 269 grammar_symbol_append (NULL, grammar_end->location);
17ee7397 270 current_rule->location = loc;
e9955c83
AD
271 grammar_current_rule_check ();
272}
273
274
8efe435c
AD
275/*-------------------------------------------------------------------.
276| The previous action turns out the be a mid-rule action. Attach it |
277| to the current rule, i.e., create a dummy symbol, attach it this |
278| mid-rule action, and append this dummy nonterminal to the current |
279| rule. |
280`-------------------------------------------------------------------*/
1485e106 281
e9955c83 282void
1485e106
AD
283grammar_midrule_action (void)
284{
285 /* Since the action was written out with this rule's number, we must
286 give the new rule this number by inserting the new rule before
287 it. */
288
8efe435c
AD
289 /* Make a DUMMY nonterminal, whose location is that of the midrule
290 action. Create the MIDRULE. */
17ee7397
PE
291 location dummy_location = current_rule->action_location;
292 symbol *dummy = dummy_symbol_get (dummy_location);
293 symbol_list *midrule = symbol_list_new (dummy, dummy_location);
1485e106
AD
294
295 /* Make a new rule, whose body is empty, before the current one, so
296 that the action just read can belong to it. */
297 ++nrules;
298 ++nritems;
8efe435c
AD
299 /* Attach its location and actions to that of the DUMMY. */
300 midrule->location = dummy_location;
301 midrule->action = current_rule->action;
302 midrule->action_location = dummy_location;
1485e106
AD
303 current_rule->action = NULL;
304
8efe435c
AD
305 if (previous_rule_end)
306 previous_rule_end->next = midrule;
1485e106 307 else
8efe435c 308 grammar = midrule;
1485e106 309
8efe435c
AD
310 /* End the dummy's rule. */
311 previous_rule_end = symbol_list_new (NULL, dummy_location);
312 previous_rule_end->next = current_rule;
1485e106 313
8efe435c 314 midrule->next = previous_rule_end;
1485e106 315
8efe435c
AD
316 /* Insert the dummy nonterminal replacing the midrule action into
317 the current rule. */
318 grammar_current_rule_symbol_append (dummy, dummy_location);
1485e106
AD
319}
320
9af3fbce
AD
321/* Set the precedence symbol of the current rule to PRECSYM. */
322
e9955c83 323void
17ee7397 324grammar_current_rule_prec_set (symbol *precsym, location loc)
9af3fbce
AD
325{
326 if (current_rule->ruleprec)
17ee7397 327 complain_at (loc, _("only one %s allowed per rule"), "%prec");
9af3fbce
AD
328 current_rule->ruleprec = precsym;
329}
330
676385e2
PH
331/* Attach dynamic precedence DPREC to the current rule. */
332
333void
17ee7397 334grammar_current_rule_dprec_set (int dprec, location loc)
676385e2
PH
335{
336 if (! glr_parser)
17ee7397 337 warn_at (loc, _("%s affects only GLR parsers"), "%dprec");
676385e2 338 if (dprec <= 0)
17ee7397 339 complain_at (loc, _("%s must be followed by positive number"), "%dprec");
39f41916 340 else if (current_rule->dprec != 0)
17ee7397 341 complain_at (loc, _("only one %s allowed per rule"), "%dprec");
676385e2
PH
342 current_rule->dprec = dprec;
343}
344
345/* Attach a merge function NAME with argument type TYPE to current
346 rule. */
347
348void
17ee7397 349grammar_current_rule_merge_set (uniqstr name, location loc)
676385e2
PH
350{
351 if (! glr_parser)
17ee7397 352 warn_at (loc, _("%s affects only GLR parsers"), "%merge");
39f41916 353 if (current_rule->merger != 0)
17ee7397 354 complain_at (loc, _("only one %s allowed per rule"), "%merge");
39f41916 355 current_rule->merger =
17ee7397 356 get_merge_function (name, current_rule->sym->type_name, loc);
676385e2
PH
357}
358
17ee7397 359/* Attach SYM to the current rule. If needed, move the previous
2e047461
AD
360 action as a mid-rule action. */
361
e9955c83 362void
17ee7397 363grammar_current_rule_symbol_append (symbol *sym, location loc)
2e047461
AD
364{
365 if (current_rule->action)
366 grammar_midrule_action ();
367 ++nritems;
17ee7397 368 grammar_symbol_append (sym, loc);
2e047461
AD
369}
370
2e047461
AD
371/* Attach an ACTION to the current rule. If needed, move the previous
372 action as a mid-rule action. */
373
e9955c83 374void
17ee7397 375grammar_current_rule_action_append (const char *action, location loc)
2e047461
AD
376{
377 if (current_rule->action)
378 grammar_midrule_action ();
379 current_rule->action = action;
17ee7397 380 current_rule->action_location = loc;
2e047461
AD
381}
382
a70083a3 383\f
a70083a3
AD
384/*---------------------------------------------------------------.
385| Convert the rules into the representation using RRHS, RLHS and |
d9b739c3 386| RITEM. |
a70083a3 387`---------------------------------------------------------------*/
1ff442ca 388
4a120d45 389static void
118fb205 390packgram (void)
1ff442ca 391{
9222837b 392 unsigned int itemno = 0;
17ee7397
PE
393 rule_number ruleno = 0;
394 symbol_list *p = grammar;
1ff442ca 395
da2a7671
PE
396 ritem = xnmalloc (nritems, sizeof *ritem);
397 rules = xnmalloc (nrules, sizeof *rules);
1ff442ca 398
1ff442ca
NF
399 while (p)
400 {
17ee7397 401 symbol *ruleprec = p->ruleprec;
d7e1f00c 402 rules[ruleno].user_number = ruleno;
c3b407f4 403 rules[ruleno].number = ruleno;
bba97eb2 404 rules[ruleno].lhs = p->sym;
99013900 405 rules[ruleno].rhs = ritem + itemno;
da2a7671
PE
406 rules[ruleno].prec = NULL;
407 rules[ruleno].dprec = p->dprec;
408 rules[ruleno].merger = p->merger;
409 rules[ruleno].precsym = NULL;
8efe435c 410 rules[ruleno].location = p->location;
b4afb6bb 411 rules[ruleno].useful = true;
1a2b5d37 412 rules[ruleno].action = p->action;
8efe435c 413 rules[ruleno].action_location = p->action_location;
1ff442ca
NF
414
415 p = p->next;
416 while (p && p->sym)
417 {
17ee7397 418 /* item_number = symbol_number.
5fbb0954 419 But the former needs to contain more: negative rule numbers. */
a49aecd5 420 ritem[itemno++] = symbol_number_as_item_number (p->sym->number);
1ff442ca
NF
421 /* A rule gets by default the precedence and associativity
422 of the last token in it. */
39a06c25 423 if (p->sym->class == token_sym && default_prec)
03b31c0c 424 rules[ruleno].prec = p->sym;
a70083a3
AD
425 if (p)
426 p = p->next;
1ff442ca
NF
427 }
428
429 /* If this rule has a %prec,
a70083a3 430 the specified symbol's precedence replaces the default. */
1ff442ca
NF
431 if (ruleprec)
432 {
03b31c0c
AD
433 rules[ruleno].precsym = ruleprec;
434 rules[ruleno].prec = ruleprec;
1ff442ca 435 }
4b3d3a8e 436 ritem[itemno++] = rule_number_as_item_number (ruleno);
f3849179 437 ++ruleno;
1ff442ca 438
a70083a3
AD
439 if (p)
440 p = p->next;
1ff442ca
NF
441 }
442
35dcf428
PE
443 if (itemno != nritems)
444 abort ();
3067fbef 445
273a74fa 446 if (trace_flag & trace_sets)
3067fbef 447 ritem_print (stderr);
1ff442ca 448}
a70083a3 449\f
fdbcd8e2
AD
450/*------------------------------------------------------------------.
451| Read in the grammar specification and record it in the format |
452| described in gram.h. All actions are copied into ACTION_OBSTACK, |
453| in each case forming the body of a C function (YYACTION) which |
454| contains a switch statement to decide which action to execute. |
455`------------------------------------------------------------------*/
a70083a3
AD
456
457void
458reader (void)
459{
a70083a3 460 /* Initialize the symbol table. */
db8837cb 461 symbols_new ();
b6610515 462
88bce5a2
AD
463 /* Construct the accept symbol. */
464 accept = symbol_get ("$accept", empty_location);
465 accept->class = nterm_sym;
466 accept->number = nvars++;
30171f79 467
a70083a3 468 /* Construct the error token */
39f41916 469 errtoken = symbol_get ("error", empty_location);
d7020c20 470 errtoken->class = token_sym;
72a23c97 471 errtoken->number = ntokens++;
b6610515 472
a70083a3
AD
473 /* Construct a token that represents all undefined literal tokens.
474 It is always token number 2. */
88bce5a2 475 undeftoken = symbol_get ("$undefined", empty_location);
d7020c20 476 undeftoken->class = token_sym;
72a23c97 477 undeftoken->number = ntokens++;
a70083a3 478
331dbc1b 479 /* Initialize the obstacks. */
0dd1580a
RA
480 obstack_init (&pre_prologue_obstack);
481 obstack_init (&post_prologue_obstack);
331dbc1b 482
2b81e969 483 gram_in = xfopen (grammar_file, "r");
e9955c83 484
473d0a75
AD
485 gram__flex_debug = trace_flag & trace_scan;
486 gram_debug = trace_flag & trace_parse;
1d6412ad 487 scanner_initialize ();
78c3da9e 488 gram_parse ();
331dbc1b 489
b275314e
AD
490 /* If something went wrong during the parsing, don't try to
491 continue. */
b4afb6bb 492 if (complaint_issued)
f956c304 493 return;
b275314e 494
e9955c83
AD
495 /* Grammar has been read. Do some checking */
496 if (nrules == 0)
497 fatal (_("no rules in the input grammar"));
498
499 /* Report any undefined symbols and consider them nonterminals. */
500 symbols_check_defined ();
b7c49edf 501
88bce5a2
AD
502 /* If the user did not define her ENDTOKEN, do it now. */
503 if (!endtoken)
b7c49edf 504 {
88bce5a2
AD
505 endtoken = symbol_get ("$end", empty_location);
506 endtoken->class = token_sym;
507 endtoken->number = 0;
b7c49edf 508 /* Value specified by POSIX. */
88bce5a2 509 endtoken->user_token_number = 0;
b7c49edf
AD
510 }
511
e9955c83
AD
512 /* Insert the initial rule, which line is that of the first rule
513 (not that of the start symbol):
514
88bce5a2 515 accept: %start EOF. */
e9955c83 516 {
17ee7397 517 symbol_list *p = symbol_list_new (accept, empty_location);
8efe435c
AD
518 p->location = grammar->location;
519 p->next = symbol_list_new (startsymbol, empty_location);
88bce5a2 520 p->next->next = symbol_list_new (endtoken, empty_location);
8efe435c 521 p->next->next->next = symbol_list_new (NULL, empty_location);
e9955c83
AD
522 p->next->next->next->next = grammar;
523 nrules += 1;
524 nritems += 3;
525 grammar = p;
526 }
527
17ee7397 528 if (! (nsyms <= SYMBOL_NUMBER_MAXIMUM && nsyms == ntokens + nvars))
35dcf428 529 abort ();
b0c4483e 530
2b81e969 531 xfclose (gram_in);
331dbc1b 532
a70083a3
AD
533 /* Assign the symbols their symbol numbers. Write #defines for the
534 token symbols into FDEFINES if requested. */
2f1afb73 535 symbols_pack ();
93ede233 536
a70083a3
AD
537 /* Convert the grammar into the format described in gram.h. */
538 packgram ();
8419d367 539
17ee7397
PE
540 /* The grammar as a symbol_list is no longer needed. */
541 LIST_FREE (symbol_list, grammar);
a70083a3 542}