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