1 /* IELR's inadequacy list.
3 Copyright (C) 2009-2015, 2018-2022 Free Software Foundation, Inc.
5 This file is part of Bison, the GNU Compiler Compiler.
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.
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.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <https://www.gnu.org/licenses/>. */
23 #include "InadequacyList.h"
27 ContributionIndex
const ContributionIndex__none
= -1;
28 ContributionIndex
const ContributionIndex__error_action
= -2;
31 InadequacyList__new_conflict (state
*manifesting_state
, symbol
*token
,
33 InadequacyListNodeCount
*node_count
)
35 InadequacyList
*result
= xmalloc (sizeof *result
);
36 result
->id
= *node_count
;
37 IGNORE_TYPE_LIMITS_BEGIN
38 if (INT_ADD_WRAPV (*node_count
, 1, node_count
))
40 IGNORE_TYPE_LIMITS_END
42 result
->manifestingState
= manifesting_state
;
43 result
->contributionCount
= bitset_count (actions
);
44 result
->inadequacy
.conflict
.token
= token
;
45 result
->inadequacy
.conflict
.actions
= actions
;
50 InadequacyList__delete (InadequacyList
*self
)
54 InadequacyList
*node
= self
;
56 bitset_free (node
->inadequacy
.conflict
.actions
);
62 InadequacyList__getShiftContributionIndex (InadequacyList
const *self
)
64 if (!bitset_test (self
->inadequacy
.conflict
.actions
,
65 self
->manifestingState
->reductions
->num
))
66 return ContributionIndex__none
;
67 return self
->contributionCount
- 1;
71 InadequacyList__getContributionToken (InadequacyList
const *self
,
74 aver (0 <= i
&& i
< self
->contributionCount
); (void) i
;
75 return self
->inadequacy
.conflict
.token
;
79 InadequacyList__prependTo (InadequacyList
*self
, InadequacyList
**list
)
81 InadequacyList
*head_old
= *list
;
83 self
->next
= head_old
;