1 /* IELR's inadequacy list.
3 Copyright (C) 2009-2015, 2018-2019 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 <http://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 if (INT_ADD_WRAPV (*node_count
, 1, node_count
))
40 result
->manifestingState
= manifesting_state
;
41 result
->contributionCount
= bitset_count (actions
);
42 result
->inadequacy
.conflict
.token
= token
;
43 result
->inadequacy
.conflict
.actions
= actions
;
48 InadequacyList__delete (InadequacyList
*self
)
52 InadequacyList
*node
= self
;
54 bitset_free (node
->inadequacy
.conflict
.actions
);
60 InadequacyList__getShiftContributionIndex (InadequacyList
const *self
)
62 if (!bitset_test (self
->inadequacy
.conflict
.actions
,
63 self
->manifestingState
->reductions
->num
))
64 return ContributionIndex__none
;
65 return self
->contributionCount
- 1;
69 InadequacyList__getContributionToken (InadequacyList
const *self
,
72 aver (0 <= i
&& i
< self
->contributionCount
); (void) i
;
73 return self
->inadequacy
.conflict
.token
;
77 InadequacyList__prependTo (InadequacyList
*self
, InadequacyList
**list
)
79 InadequacyList
*head_old
= *list
;
81 self
->next
= head_old
;