1 /* IELR's inadequacy list.
2
3 Copyright (C) 2009-2012 Free Software Foundation, Inc.
4
5 This file is part of Bison, the GNU Compiler Compiler.
6
7 This program 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 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20 #include <config.h>
21 #include "system.h"
22
23 #include "InadequacyList.h"
24
25 ContributionIndex const ContributionIndex__none = -1;
26 ContributionIndex const ContributionIndex__error_action = -2;
27
28 InadequacyList *
InadequacyList__new_conflict(state * manifesting_state,symbol * token,bitset actions,InadequacyListNodeCount * node_count)29 InadequacyList__new_conflict (state *manifesting_state, symbol *token,
30 bitset actions,
31 InadequacyListNodeCount *node_count)
32 {
33 InadequacyList *result = xmalloc (sizeof *result);
34 result->id = (*node_count)++;
35 aver (*node_count != 0);
36 result->next = NULL;
37 result->manifestingState = manifesting_state;
38 result->contributionCount = bitset_count (actions);
39 result->inadequacy.conflict.token = token;
40 result->inadequacy.conflict.actions = actions;
41 return result;
42 }
43
44 void
InadequacyList__delete(InadequacyList * self)45 InadequacyList__delete (InadequacyList *self)
46 {
47 while (self)
48 {
49 InadequacyList *node = self;
50 self = self->next;
51 bitset_free (node->inadequacy.conflict.actions);
52 free (node);
53 }
54 }
55
56 ContributionIndex
InadequacyList__getShiftContributionIndex(InadequacyList const * self)57 InadequacyList__getShiftContributionIndex (InadequacyList const *self)
58 {
59 if (!bitset_test (self->inadequacy.conflict.actions,
60 self->manifestingState->reductions->num))
61 return ContributionIndex__none;
62 return self->contributionCount - 1;
63 }
64
65 symbol *
InadequacyList__getContributionToken(InadequacyList const * self,ContributionIndex i)66 InadequacyList__getContributionToken (InadequacyList const *self,
67 ContributionIndex i)
68 {
69 aver (0 <= i && i < self->contributionCount);
70 return self->inadequacy.conflict.token;
71 }
72
73 void
InadequacyList__prependTo(InadequacyList * self,InadequacyList ** list)74 InadequacyList__prependTo (InadequacyList *self, InadequacyList **list)
75 {
76 InadequacyList *head_old = *list;
77 *list = self;
78 self->next = head_old;
79 }
80