]> git.saurik.com Git - bison.git/blob - src/symtab.c
11a0d756e9608c3825381887c9a9a9a1e5cca68a
[bison.git] / src / symtab.c
1 /* Symbol table manager for Bison.
2
3 Copyright (C) 1984, 1989, 2000-2002, 2004-2013 Free Software
4 Foundation, Inc.
5
6 This file is part of Bison, the GNU Compiler Compiler.
7
8 This program 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 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20
21 #include <config.h>
22 #include "system.h"
23
24 #include <hash.h>
25
26 #include "complain.h"
27 #include "gram.h"
28 #include "symtab.h"
29
30 /*-------------------------------------------------------------------.
31 | Symbols sorted by tag. Allocated by the first invocation of |
32 | symbols_do, after which no more symbols should be created. |
33 `-------------------------------------------------------------------*/
34
35 static symbol **symbols_sorted = NULL;
36 static symbol **semantic_types_sorted = NULL;
37
38 /*------------------------.
39 | Distinguished symbols. |
40 `------------------------*/
41
42 symbol *errtoken = NULL;
43 symbol *undeftoken = NULL;
44 symbol *endtoken = NULL;
45 symbol *accept = NULL;
46 symbol *startsymbol = NULL;
47 location startsymbol_location;
48
49 /*---------------------------.
50 | Precedence relation graph. |
51 `---------------------------*/
52
53 static symgraph **prec_nodes;
54
55 /*-----------------------------------.
56 | Store which associativity is used. |
57 `-----------------------------------*/
58
59 bool *used_assoc = NULL;
60
61 /*---------------------------------.
62 | Create a new symbol, named TAG. |
63 `---------------------------------*/
64
65 static symbol *
66 symbol_new (uniqstr tag, location loc)
67 {
68 symbol *res = xmalloc (sizeof *res);
69 uniqstr_assert (tag);
70
71 /* If the tag is not a string (starts with a double quote), check
72 that it is valid for Yacc. */
73 if (tag[0] != '\"' && tag[0] != '\'' && strchr (tag, '-'))
74 complain (&loc, Wyacc,
75 _("POSIX Yacc forbids dashes in symbol names: %s"), tag);
76
77 res->tag = tag;
78 res->location = loc;
79
80 res->type_name = NULL;
81 {
82 int i;
83 for (i = 0; i < CODE_PROPS_SIZE; ++i)
84 code_props_none_init (&res->props[i]);
85 }
86
87 res->number = NUMBER_UNDEFINED;
88 res->prec = 0;
89 res->assoc = undef_assoc;
90 res->user_token_number = USER_NUMBER_UNDEFINED;
91
92 res->alias = NULL;
93 res->class = unknown_sym;
94 res->status = undeclared;
95
96 if (nsyms == SYMBOL_NUMBER_MAXIMUM)
97 complain (NULL, fatal, _("too many symbols in input grammar (limit is %d)"),
98 SYMBOL_NUMBER_MAXIMUM);
99 nsyms++;
100 return res;
101 }
102
103 char const *
104 code_props_type_string (code_props_type kind)
105 {
106 switch (kind)
107 {
108 case destructor:
109 return "%destructor";
110 case printer:
111 return "%printer";
112 }
113 assert (0);
114 }
115
116 /*----------------------------------------.
117 | Create a new semantic type, named TAG. |
118 `----------------------------------------*/
119
120 static semantic_type *
121 semantic_type_new (uniqstr tag, const location *loc)
122 {
123 semantic_type *res = xmalloc (sizeof *res);
124
125 uniqstr_assert (tag);
126 res->tag = tag;
127 res->location = loc ? *loc : empty_location;
128 res->status = undeclared;
129 {
130 int i;
131 for (i = 0; i < CODE_PROPS_SIZE; ++i)
132 code_props_none_init (&res->props[i]);
133 }
134
135 return res;
136 }
137
138
139 /*-----------------.
140 | Print a symbol. |
141 `-----------------*/
142
143 #define SYMBOL_ATTR_PRINT(Attr) \
144 if (s->Attr) \
145 fprintf (f, " %s { %s }", #Attr, s->Attr)
146
147 #define SYMBOL_CODE_PRINT(Attr) \
148 if (s->props[Attr].code) \
149 fprintf (f, " %s { %s }", #Attr, s->props[Attr].code)
150
151 void
152 symbol_print (symbol const *s, FILE *f)
153 {
154 if (s)
155 {
156 fputs (s->tag, f);
157 SYMBOL_ATTR_PRINT (type_name);
158 SYMBOL_CODE_PRINT (destructor);
159 SYMBOL_CODE_PRINT (printer);
160 }
161 else
162 fputs ("<NULL>", f);
163 }
164
165 #undef SYMBOL_ATTR_PRINT
166 #undef SYMBOL_CODE_PRINT
167
168
169 /*----------------------------------.
170 | Whether S is a valid identifier. |
171 `----------------------------------*/
172
173 static bool
174 is_identifier (uniqstr s)
175 {
176 static char const alphanum[26 + 26 + 1 + 10] =
177 "abcdefghijklmnopqrstuvwxyz"
178 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
179 "_"
180 "0123456789";
181 if (!s || ! memchr (alphanum, *s, sizeof alphanum - 10))
182 return false;
183 for (++s; *s; ++s)
184 if (! memchr (alphanum, *s, sizeof alphanum))
185 return false;
186 return true;
187 }
188
189
190 /*-----------------------------------------------.
191 | Get the identifier associated to this symbol. |
192 `-----------------------------------------------*/
193 uniqstr
194 symbol_id_get (symbol const *sym)
195 {
196 aver (sym->user_token_number != USER_NUMBER_HAS_STRING_ALIAS);
197 if (sym->alias)
198 sym = sym->alias;
199 return is_identifier (sym->tag) ? sym->tag : 0;
200 }
201
202
203 /*------------------------------------------------------------------.
204 | Complain that S's WHAT is redeclared at SECOND, and was first set |
205 | at FIRST. |
206 `------------------------------------------------------------------*/
207
208 static void
209 symbol_redeclaration (symbol *s, const char *what, location first,
210 location second)
211 {
212 unsigned i = 0;
213 complain_indent (&second, complaint, &i,
214 _("%s redeclaration for %s"), what, s->tag);
215 i += SUB_INDENT;
216 complain_indent (&first, complaint, &i,
217 _("previous declaration"));
218 }
219
220 static void
221 semantic_type_redeclaration (semantic_type *s, const char *what, location first,
222 location second)
223 {
224 unsigned i = 0;
225 complain_indent (&second, complaint, &i,
226 _("%s redeclaration for <%s>"), what, s->tag);
227 i += SUB_INDENT;
228 complain_indent (&first, complaint, &i,
229 _("previous declaration"));
230 }
231
232
233
234 /*-----------------------------------------------------------------.
235 | Set the TYPE_NAME associated with SYM. Does nothing if passed 0 |
236 | as TYPE_NAME. |
237 `-----------------------------------------------------------------*/
238
239 void
240 symbol_type_set (symbol *sym, uniqstr type_name, location loc)
241 {
242 if (type_name)
243 {
244 if (sym->type_name)
245 symbol_redeclaration (sym, "%type", sym->type_location, loc);
246 uniqstr_assert (type_name);
247 sym->type_name = type_name;
248 sym->type_location = loc;
249 }
250 }
251
252 /*--------------------------------------------------------.
253 | Set the DESTRUCTOR or PRINTER associated with the SYM. |
254 `--------------------------------------------------------*/
255
256 void
257 symbol_code_props_set (symbol *sym, code_props_type kind,
258 code_props const *code)
259 {
260 if (sym->props[kind].code)
261 symbol_redeclaration (sym, code_props_type_string (kind),
262 sym->props[kind].location,
263 code->location);
264 sym->props[kind] = *code;
265 }
266
267 /*-----------------------------------------------------.
268 | Set the DESTRUCTOR or PRINTER associated with TYPE. |
269 `-----------------------------------------------------*/
270
271 void
272 semantic_type_code_props_set (semantic_type *type,
273 code_props_type kind,
274 code_props const *code)
275 {
276 if (type->props[kind].code)
277 semantic_type_redeclaration (type, code_props_type_string (kind),
278 type->props[kind].location,
279 code->location);
280 type->props[kind] = *code;
281 }
282
283 /*---------------------------------------------------.
284 | Get the computed %destructor or %printer for SYM. |
285 `---------------------------------------------------*/
286
287 code_props *
288 symbol_code_props_get (symbol *sym, code_props_type kind)
289 {
290 /* Per-symbol code props. */
291 if (sym->props[kind].code)
292 return &sym->props[kind];
293
294 /* Per-type code props. */
295 if (sym->type_name)
296 {
297 code_props *code =
298 &semantic_type_get (sym->type_name, NULL)->props[kind];
299 if (code->code)
300 return code;
301 }
302
303 /* Apply default code props's only to user-defined symbols. */
304 if (sym->tag[0] != '$' && sym != errtoken)
305 {
306 code_props *code =
307 &semantic_type_get (sym->type_name ? "*" : "", NULL)->props[kind];
308 if (code->code)
309 return code;
310 }
311 return &code_props_none;
312 }
313
314 /*-----------------------------------------------------------------.
315 | Set the PRECEDENCE associated with SYM. Does nothing if invoked |
316 | with UNDEF_ASSOC as ASSOC. |
317 `-----------------------------------------------------------------*/
318
319 void
320 symbol_precedence_set (symbol *sym, int prec, assoc a, location loc)
321 {
322 if (a != undef_assoc)
323 {
324 if (sym->prec)
325 symbol_redeclaration (sym, assoc_to_string (a), sym->prec_location,
326 loc);
327 else
328 {
329 sym->prec = prec;
330 sym->assoc = a;
331 sym->prec_location = loc;
332 }
333 }
334
335 /* Only terminals have a precedence. */
336 symbol_class_set (sym, token_sym, loc, false);
337 }
338
339
340 /*------------------------------------.
341 | Set the CLASS associated with SYM. |
342 `------------------------------------*/
343
344 void
345 symbol_class_set (symbol *sym, symbol_class class, location loc, bool declaring)
346 {
347 bool warned = false;
348 if (sym->class != unknown_sym && sym->class != class)
349 {
350 complain (&loc, complaint, _("symbol %s redefined"), sym->tag);
351 /* Don't report both "redefined" and "redeclared". */
352 warned = true;
353 }
354
355 if (class == nterm_sym && sym->class != nterm_sym)
356 sym->number = nvars++;
357 else if (class == token_sym && sym->number == NUMBER_UNDEFINED)
358 sym->number = ntokens++;
359
360 sym->class = class;
361
362 if (declaring)
363 {
364 if (sym->status == declared && !warned)
365 complain (&loc, Wother, _("symbol %s redeclared"), sym->tag);
366 sym->status = declared;
367 }
368 }
369
370
371 /*------------------------------------------------.
372 | Set the USER_TOKEN_NUMBER associated with SYM. |
373 `------------------------------------------------*/
374
375 void
376 symbol_user_token_number_set (symbol *sym, int user_token_number, location loc)
377 {
378 int *user_token_numberp;
379
380 if (sym->user_token_number != USER_NUMBER_HAS_STRING_ALIAS)
381 user_token_numberp = &sym->user_token_number;
382 else
383 user_token_numberp = &sym->alias->user_token_number;
384 if (*user_token_numberp != USER_NUMBER_UNDEFINED
385 && *user_token_numberp != user_token_number)
386 complain (&loc, complaint, _("redefining user token number of %s"),
387 sym->tag);
388
389 *user_token_numberp = user_token_number;
390 /* User defined $end token? */
391 if (user_token_number == 0)
392 {
393 endtoken = sym;
394 /* It is always mapped to 0, so it was already counted in
395 NTOKENS. */
396 if (endtoken->number != NUMBER_UNDEFINED)
397 --ntokens;
398 endtoken->number = 0;
399 }
400 }
401
402
403 /*----------------------------------------------------------.
404 | If SYM is not defined, report an error, and consider it a |
405 | nonterminal. |
406 `----------------------------------------------------------*/
407
408 static inline bool
409 symbol_check_defined (symbol *sym)
410 {
411 if (sym->class == unknown_sym)
412 {
413 assert (sym->status != declared);
414 complain (&sym->location,
415 sym->status == needed ? complaint : Wother,
416 _("symbol %s is used, but is not defined as a token"
417 " and has no rules"),
418 sym->tag);
419 sym->class = nterm_sym;
420 sym->number = nvars++;
421 }
422
423 {
424 int i;
425 for (i = 0; i < 2; ++i)
426 symbol_code_props_get (sym, i)->is_used = true;
427 }
428
429 /* Set the semantic type status associated to the current symbol to
430 'declared' so that we could check semantic types unnecessary uses. */
431 if (sym->type_name)
432 {
433 semantic_type *sem_type = semantic_type_get (sym->type_name, NULL);
434 if (sem_type)
435 sem_type->status = declared;
436 }
437
438 return true;
439 }
440
441 static inline bool
442 semantic_type_check_defined (semantic_type *sem_type)
443 {
444 /* <*> and <> do not have to be "declared". */
445 if (sem_type->status == declared
446 || !*sem_type->tag
447 || STREQ(sem_type->tag, "*"))
448 {
449 int i;
450 for (i = 0; i < 2; ++i)
451 if (sem_type->props[i].kind != CODE_PROPS_NONE
452 && ! sem_type->props[i].is_used)
453 complain (&sem_type->location, Wother,
454 _("useless %s for type <%s>"),
455 code_props_type_string (i), sem_type->tag);
456 }
457 else
458 complain (&sem_type->location, Wother,
459 _("type <%s> is used, but is not associated to any symbol"),
460 sem_type->tag);
461
462 return true;
463 }
464
465 static bool
466 symbol_check_defined_processor (void *sym, void *null ATTRIBUTE_UNUSED)
467 {
468 return symbol_check_defined (sym);
469 }
470
471 static bool
472 semantic_type_check_defined_processor (void *sem_type,
473 void *null ATTRIBUTE_UNUSED)
474 {
475 return semantic_type_check_defined (sem_type);
476 }
477
478
479 void
480 symbol_make_alias (symbol *sym, symbol *str, location loc)
481 {
482 if (str->alias)
483 complain (&loc, Wother,
484 _("symbol %s used more than once as a literal string"), str->tag);
485 else if (sym->alias)
486 complain (&loc, Wother,
487 _("symbol %s given more than one literal string"), sym->tag);
488 else
489 {
490 str->class = token_sym;
491 str->user_token_number = sym->user_token_number;
492 sym->user_token_number = USER_NUMBER_HAS_STRING_ALIAS;
493 str->alias = sym;
494 sym->alias = str;
495 str->number = sym->number;
496 symbol_type_set (str, sym->type_name, loc);
497 }
498 }
499
500
501 /*---------------------------------------------------------.
502 | Check that THIS, and its alias, have same precedence and |
503 | associativity. |
504 `---------------------------------------------------------*/
505
506 static inline void
507 symbol_check_alias_consistency (symbol *this)
508 {
509 symbol *sym = this;
510 symbol *str = this->alias;
511
512 /* Check only the symbol in the symbol-string pair. */
513 if (!(this->alias
514 && this->user_token_number == USER_NUMBER_HAS_STRING_ALIAS))
515 return;
516
517 if (str->type_name != sym->type_name)
518 {
519 if (str->type_name)
520 symbol_type_set (sym, str->type_name, str->type_location);
521 else
522 symbol_type_set (str, sym->type_name, sym->type_location);
523 }
524
525
526 {
527 int i;
528 for (i = 0; i < CODE_PROPS_SIZE; ++i)
529 if (str->props[i].code)
530 symbol_code_props_set (sym, i, &str->props[i]);
531 else if (sym->props[i].code)
532 symbol_code_props_set (str, i, &sym->props[i]);
533 }
534
535 if (sym->prec || str->prec)
536 {
537 if (str->prec)
538 symbol_precedence_set (sym, str->prec, str->assoc,
539 str->prec_location);
540 else
541 symbol_precedence_set (str, sym->prec, sym->assoc,
542 sym->prec_location);
543 }
544 }
545
546 static bool
547 symbol_check_alias_consistency_processor (void *this,
548 void *null ATTRIBUTE_UNUSED)
549 {
550 symbol_check_alias_consistency (this);
551 return true;
552 }
553
554
555 /*-------------------------------------------------------------------.
556 | Assign a symbol number, and write the definition of the token name |
557 | into FDEFINES. Put in SYMBOLS. |
558 `-------------------------------------------------------------------*/
559
560 static inline bool
561 symbol_pack (symbol *this)
562 {
563 aver (this->number != NUMBER_UNDEFINED);
564 if (this->class == nterm_sym)
565 this->number += ntokens;
566 else if (this->user_token_number == USER_NUMBER_HAS_STRING_ALIAS)
567 return true;
568
569 symbols[this->number] = this;
570 return true;
571 }
572
573 static bool
574 symbol_pack_processor (void *this, void *null ATTRIBUTE_UNUSED)
575 {
576 return symbol_pack (this);
577 }
578
579
580 static void
581 user_token_number_redeclaration (int num, symbol *first, symbol *second)
582 {
583 unsigned i = 0;
584 /* User token numbers are not assigned during the parsing, but in a
585 second step, via a traversal of the symbol table sorted on tag.
586
587 However, error messages make more sense if we keep the first
588 declaration first. */
589 if (location_cmp (first->location, second->location) > 0)
590 {
591 symbol* tmp = first;
592 first = second;
593 second = tmp;
594 }
595 complain_indent (&second->location, complaint, &i,
596 _("user token number %d redeclaration for %s"),
597 num, second->tag);
598 i += SUB_INDENT;
599 complain_indent (&first->location, complaint, &i,
600 _("previous declaration for %s"),
601 first->tag);
602 }
603
604 /*--------------------------------------------------.
605 | Put THIS in TOKEN_TRANSLATIONS if it is a token. |
606 `--------------------------------------------------*/
607
608 static inline bool
609 symbol_translation (symbol *this)
610 {
611 /* Non-terminal? */
612 if (this->class == token_sym
613 && this->user_token_number != USER_NUMBER_HAS_STRING_ALIAS)
614 {
615 /* A token which translation has already been set? */
616 if (token_translations[this->user_token_number] != undeftoken->number)
617 user_token_number_redeclaration
618 (this->user_token_number,
619 symbols[token_translations[this->user_token_number]],
620 this);
621
622 token_translations[this->user_token_number] = this->number;
623 }
624
625 return true;
626 }
627
628 static bool
629 symbol_translation_processor (void *this, void *null ATTRIBUTE_UNUSED)
630 {
631 return symbol_translation (this);
632 }
633
634
635 /*---------------------------------------.
636 | Symbol and semantic type hash tables. |
637 `---------------------------------------*/
638
639 /* Initial capacity of symbol and semantic type hash table. */
640 #define HT_INITIAL_CAPACITY 257
641
642 static struct hash_table *symbol_table = NULL;
643 static struct hash_table *semantic_type_table = NULL;
644
645 static inline bool
646 hash_compare_symbol (const symbol *m1, const symbol *m2)
647 {
648 /* Since tags are unique, we can compare the pointers themselves. */
649 return UNIQSTR_EQ (m1->tag, m2->tag);
650 }
651
652 static inline bool
653 hash_compare_semantic_type (const semantic_type *m1, const semantic_type *m2)
654 {
655 /* Since names are unique, we can compare the pointers themselves. */
656 return UNIQSTR_EQ (m1->tag, m2->tag);
657 }
658
659 static bool
660 hash_symbol_comparator (void const *m1, void const *m2)
661 {
662 return hash_compare_symbol (m1, m2);
663 }
664
665 static bool
666 hash_semantic_type_comparator (void const *m1, void const *m2)
667 {
668 return hash_compare_semantic_type (m1, m2);
669 }
670
671 static inline size_t
672 hash_symbol (const symbol *m, size_t tablesize)
673 {
674 /* Since tags are unique, we can hash the pointer itself. */
675 return ((uintptr_t) m->tag) % tablesize;
676 }
677
678 static inline size_t
679 hash_semantic_type (const semantic_type *m, size_t tablesize)
680 {
681 /* Since names are unique, we can hash the pointer itself. */
682 return ((uintptr_t) m->tag) % tablesize;
683 }
684
685 static size_t
686 hash_symbol_hasher (void const *m, size_t tablesize)
687 {
688 return hash_symbol (m, tablesize);
689 }
690
691 static size_t
692 hash_semantic_type_hasher (void const *m, size_t tablesize)
693 {
694 return hash_semantic_type (m, tablesize);
695 }
696
697 /*-------------------------------.
698 | Create the symbol hash table. |
699 `-------------------------------*/
700
701 void
702 symbols_new (void)
703 {
704 symbol_table = hash_initialize (HT_INITIAL_CAPACITY,
705 NULL,
706 hash_symbol_hasher,
707 hash_symbol_comparator,
708 free);
709 semantic_type_table = hash_initialize (HT_INITIAL_CAPACITY,
710 NULL,
711 hash_semantic_type_hasher,
712 hash_semantic_type_comparator,
713 free);
714 }
715
716
717 /*----------------------------------------------------------------.
718 | Find the symbol named KEY, and return it. If it does not exist |
719 | yet, create it. |
720 `----------------------------------------------------------------*/
721
722 symbol *
723 symbol_from_uniqstr (const uniqstr key, location loc)
724 {
725 symbol probe;
726 symbol *entry;
727
728 probe.tag = key;
729 entry = hash_lookup (symbol_table, &probe);
730
731 if (!entry)
732 {
733 /* First insertion in the hash. */
734 aver (!symbols_sorted);
735 entry = symbol_new (key, loc);
736 if (!hash_insert (symbol_table, entry))
737 xalloc_die ();
738 }
739 return entry;
740 }
741
742
743 /*-----------------------------------------------------------------------.
744 | Find the semantic type named KEY, and return it. If it does not exist |
745 | yet, create it. |
746 `-----------------------------------------------------------------------*/
747
748 semantic_type *
749 semantic_type_from_uniqstr (const uniqstr key, const location *loc)
750 {
751 semantic_type probe;
752 semantic_type *entry;
753
754 probe.tag = key;
755 entry = hash_lookup (semantic_type_table, &probe);
756
757 if (!entry)
758 {
759 /* First insertion in the hash. */
760 entry = semantic_type_new (key, loc);
761 if (!hash_insert (semantic_type_table, entry))
762 xalloc_die ();
763 }
764 return entry;
765 }
766
767
768 /*----------------------------------------------------------------.
769 | Find the symbol named KEY, and return it. If it does not exist |
770 | yet, create it. |
771 `----------------------------------------------------------------*/
772
773 symbol *
774 symbol_get (const char *key, location loc)
775 {
776 return symbol_from_uniqstr (uniqstr_new (key), loc);
777 }
778
779
780 /*-----------------------------------------------------------------------.
781 | Find the semantic type named KEY, and return it. If it does not exist |
782 | yet, create it. |
783 `-----------------------------------------------------------------------*/
784
785 semantic_type *
786 semantic_type_get (const char *key, const location *loc)
787 {
788 return semantic_type_from_uniqstr (uniqstr_new (key), loc);
789 }
790
791
792 /*------------------------------------------------------------------.
793 | Generate a dummy nonterminal, whose name cannot conflict with the |
794 | user's names. |
795 `------------------------------------------------------------------*/
796
797 symbol *
798 dummy_symbol_get (location loc)
799 {
800 /* Incremented for each generated symbol. */
801 static int dummy_count = 0;
802 static char buf[256];
803
804 symbol *sym;
805
806 sprintf (buf, "$@%d", ++dummy_count);
807 sym = symbol_get (buf, loc);
808 sym->class = nterm_sym;
809 sym->number = nvars++;
810 return sym;
811 }
812
813 bool
814 symbol_is_dummy (const symbol *sym)
815 {
816 return sym->tag[0] == '@' || (sym->tag[0] == '$' && sym->tag[1] == '@');
817 }
818
819 /*-------------------.
820 | Free the symbols. |
821 `-------------------*/
822
823 void
824 symbols_free (void)
825 {
826 hash_free (symbol_table);
827 hash_free (semantic_type_table);
828 free (symbols);
829 free (symbols_sorted);
830 free (semantic_types_sorted);
831 }
832
833
834 /*---------------------------------------------------------------.
835 | Look for undefined symbols, report an error, and consider them |
836 | terminals. |
837 `---------------------------------------------------------------*/
838
839 static int
840 symbols_cmp (symbol const *a, symbol const *b)
841 {
842 return strcmp (a->tag, b->tag);
843 }
844
845 static int
846 symbols_cmp_qsort (void const *a, void const *b)
847 {
848 return symbols_cmp (*(symbol * const *)a, *(symbol * const *)b);
849 }
850
851 static void
852 symbols_do (Hash_processor processor, void *processor_data,
853 struct hash_table *table, symbol ***sorted)
854 {
855 size_t count = hash_get_n_entries (table);
856 if (!*sorted)
857 {
858 *sorted = xnmalloc (count, sizeof **sorted);
859 hash_get_entries (table, (void**)*sorted, count);
860 qsort (*sorted, count, sizeof **sorted, symbols_cmp_qsort);
861 }
862 {
863 size_t i;
864 for (i = 0; i < count; ++i)
865 processor ((*sorted)[i], processor_data);
866 }
867 }
868
869 /*--------------------------------------------------------------.
870 | Check that all the symbols are defined. Report any undefined |
871 | symbols and consider them nonterminals. |
872 `--------------------------------------------------------------*/
873
874 void
875 symbols_check_defined (void)
876 {
877 symbols_do (symbol_check_defined_processor, NULL,
878 symbol_table, &symbols_sorted);
879 symbols_do (semantic_type_check_defined_processor, NULL,
880 semantic_type_table, &semantic_types_sorted);
881 }
882
883 /*------------------------------------------------------------------.
884 | Set TOKEN_TRANSLATIONS. Check that no two symbols share the same |
885 | number. |
886 `------------------------------------------------------------------*/
887
888 static void
889 symbols_token_translations_init (void)
890 {
891 bool num_256_available_p = true;
892 int i;
893
894 /* Find the highest user token number, and whether 256, the POSIX
895 preferred user token number for the error token, is used. */
896 max_user_token_number = 0;
897 for (i = 0; i < ntokens; ++i)
898 {
899 symbol *this = symbols[i];
900 if (this->user_token_number != USER_NUMBER_UNDEFINED)
901 {
902 if (this->user_token_number > max_user_token_number)
903 max_user_token_number = this->user_token_number;
904 if (this->user_token_number == 256)
905 num_256_available_p = false;
906 }
907 }
908
909 /* If 256 is not used, assign it to error, to follow POSIX. */
910 if (num_256_available_p
911 && errtoken->user_token_number == USER_NUMBER_UNDEFINED)
912 errtoken->user_token_number = 256;
913
914 /* Set the missing user numbers. */
915 if (max_user_token_number < 256)
916 max_user_token_number = 256;
917
918 for (i = 0; i < ntokens; ++i)
919 {
920 symbol *this = symbols[i];
921 if (this->user_token_number == USER_NUMBER_UNDEFINED)
922 this->user_token_number = ++max_user_token_number;
923 if (this->user_token_number > max_user_token_number)
924 max_user_token_number = this->user_token_number;
925 }
926
927 token_translations = xnmalloc (max_user_token_number + 1,
928 sizeof *token_translations);
929
930 /* Initialize all entries for literal tokens to the internal token
931 number for $undefined, which represents all invalid inputs. */
932 for (i = 0; i < max_user_token_number + 1; i++)
933 token_translations[i] = undeftoken->number;
934 symbols_do (symbol_translation_processor, NULL,
935 symbol_table, &symbols_sorted);
936 }
937
938
939 /*----------------------------------------------------------------.
940 | Assign symbol numbers, and write definition of token names into |
941 | FDEFINES. Set up vectors SYMBOL_TABLE, TAGS of symbols. |
942 `----------------------------------------------------------------*/
943
944 void
945 symbols_pack (void)
946 {
947 symbols_do (symbol_check_alias_consistency_processor, NULL,
948 symbol_table, &symbols_sorted);
949
950 symbols = xcalloc (nsyms, sizeof *symbols);
951 symbols_do (symbol_pack_processor, NULL, symbol_table, &symbols_sorted);
952
953 /* Aliases leave empty slots in symbols, so remove them. */
954 {
955 int writei;
956 int readi;
957 int nsyms_old = nsyms;
958 for (writei = 0, readi = 0; readi < nsyms_old; readi += 1)
959 {
960 if (symbols[readi] == NULL)
961 {
962 nsyms -= 1;
963 ntokens -= 1;
964 }
965 else
966 {
967 symbols[writei] = symbols[readi];
968 symbols[writei]->number = writei;
969 if (symbols[writei]->alias)
970 symbols[writei]->alias->number = writei;
971 writei += 1;
972 }
973 }
974 }
975 symbols = xnrealloc (symbols, nsyms, sizeof *symbols);
976
977 symbols_token_translations_init ();
978
979 if (startsymbol->class == unknown_sym)
980 complain (&startsymbol_location, fatal,
981 _("the start symbol %s is undefined"),
982 startsymbol->tag);
983 else if (startsymbol->class == token_sym)
984 complain (&startsymbol_location, fatal,
985 _("the start symbol %s is a token"),
986 startsymbol->tag);
987 }
988
989 /*---------------------------------.
990 | Initialize relation graph nodes. |
991 `---------------------------------*/
992
993 static void
994 init_prec_nodes (void)
995 {
996 int i;
997 prec_nodes = xcalloc (nsyms, sizeof *prec_nodes);
998 for (i = 0; i < nsyms; ++i)
999 {
1000 prec_nodes[i] = xmalloc (sizeof *prec_nodes[i]);
1001 symgraph *s = prec_nodes[i];
1002 s->id = i;
1003 s->succ = 0;
1004 s->pred = 0;
1005 }
1006 }
1007
1008 /*----------------.
1009 | Create a link. |
1010 `----------------*/
1011
1012 static symgraphlink *
1013 symgraphlink_new (graphid id, symgraphlink *next)
1014 {
1015 symgraphlink *l = xmalloc (sizeof *l);
1016 l->id = id;
1017 l->next = next;
1018 return l;
1019 }
1020
1021
1022 /*------------------------------------------------------------------.
1023 | Register the second symbol of the precedence relation, and return |
1024 | whether this relation is new. Use only in register_precedence. |
1025 `------------------------------------------------------------------*/
1026
1027 static bool
1028 register_precedence_second_symbol (symgraphlink **first, graphid sym)
1029 {
1030 if (!*first || sym < (*first)->id)
1031 *first = symgraphlink_new (sym, *first);
1032 else
1033 {
1034 symgraphlink *slist = *first;
1035
1036 while (slist->next && slist->next->id <= sym)
1037 slist = slist->next;
1038
1039 if (slist->id == sym)
1040 /* Relation already present. */
1041 return false;
1042
1043 slist->next = symgraphlink_new (sym, slist->next);
1044 }
1045 return true;
1046 }
1047
1048 /*------------------------------------------------------------------.
1049 | Register a new relation between symbols as used. The first symbol |
1050 | has a greater precedence than the second one. |
1051 `------------------------------------------------------------------*/
1052
1053 void
1054 register_precedence (graphid first, graphid snd)
1055 {
1056 if (!prec_nodes)
1057 init_prec_nodes ();
1058 register_precedence_second_symbol (&(prec_nodes[first]->succ), snd);
1059 register_precedence_second_symbol (&(prec_nodes[snd]->pred), first);
1060 }
1061
1062
1063 /*---------------------------------------.
1064 | Deep clear a linked / adjacency list). |
1065 `---------------------------------------*/
1066
1067 static void
1068 linkedlist_free (symgraphlink *node)
1069 {
1070 if (node)
1071 {
1072 while (node->next)
1073 {
1074 symgraphlink *tmp = node->next;
1075 free (node);
1076 node = tmp;
1077 }
1078 free (node);
1079 }
1080 }
1081
1082 /*----------------------------------------------.
1083 | Clear and destroy association tracking table. |
1084 `----------------------------------------------*/
1085
1086 static void
1087 assoc_free (void)
1088 {
1089 int i;
1090 for (i = 0; i < nsyms; ++i)
1091 {
1092 linkedlist_free (prec_nodes[i]->pred);
1093 linkedlist_free (prec_nodes[i]->succ);
1094 free (prec_nodes[i]);
1095 }
1096 free (prec_nodes);
1097 }
1098
1099 /*---------------------------------------.
1100 | Initialize association tracking table. |
1101 `---------------------------------------*/
1102
1103 static void
1104 init_assoc (void)
1105 {
1106 graphid i;
1107 used_assoc = xcalloc(nsyms, sizeof(*used_assoc));
1108 for (i = 0; i < nsyms; ++i)
1109 used_assoc[i] = false;
1110 }
1111
1112 /*------------------------------------------------------------------.
1113 | Test if the associativity for the symbols is defined and useless. |
1114 `------------------------------------------------------------------*/
1115
1116 static inline bool
1117 is_assoc_useless (symbol *s)
1118 {
1119 return s
1120 && s->assoc != undef_assoc
1121 && s->assoc != precedence_assoc
1122 && !used_assoc[s->number];
1123 }
1124
1125 /*-------------------------------.
1126 | Register a used associativity. |
1127 `-------------------------------*/
1128
1129 void
1130 register_assoc (graphid i, graphid j)
1131 {
1132 if (!used_assoc)
1133 init_assoc ();
1134 used_assoc[i] = true;
1135 used_assoc[j] = true;
1136 }
1137
1138 /*--------------------------------------------------.
1139 | Print a warning for unused precedence relations. |
1140 `--------------------------------------------------*/
1141
1142 void
1143 print_precedence_warnings (void)
1144 {
1145 int i;
1146 if (!prec_nodes)
1147 init_prec_nodes ();
1148 if (!used_assoc)
1149 init_assoc ();
1150 for (i = 0; i < nsyms; ++i)
1151 {
1152 symbol *s = symbols[i];
1153 if (s
1154 && s->prec != 0
1155 && !prec_nodes[i]->pred
1156 && !prec_nodes[i]->succ)
1157 {
1158 if (is_assoc_useless (s))
1159 complain (&s->prec_location, Wprecedence,
1160 _("useless precedence and associativity for %s"), s->tag);
1161 else if (s->assoc == precedence_assoc)
1162 complain (&s->prec_location, Wprecedence,
1163 _("useless precedence for %s"), s->tag);
1164 }
1165 else if (is_assoc_useless (s))
1166 complain (&s->prec_location, Wprecedence,
1167 _("useless associativity for %s, use %%precedence"), s->tag);
1168 }
1169 free (used_assoc);
1170 assoc_free ();
1171 }