1 /* IELR's inadequacy list.
3 Copyright (C) 2009-2010 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"
25 ContributionIndex
const ContributionIndex__none
= -1;
26 ContributionIndex
const ContributionIndex__error_action
= -2;
29 InadequacyList__new_conflict (state
*manifesting_state
, symbol
*token
,
31 InadequacyListNodeCount
*node_count
)
33 InadequacyList
*result
= xmalloc (sizeof *result
);
34 result
->id
= (*node_count
)++;
35 aver (*node_count
!= 0);
37 result
->manifestingState
= manifesting_state
;
38 result
->contributionCount
= bitset_count (actions
);
39 result
->inadequacy
.conflict
.token
= token
;
40 result
->inadequacy
.conflict
.actions
= actions
;
45 InadequacyList__delete (InadequacyList
*self
)
49 InadequacyList
*node
= self
;
51 bitset_free (node
->inadequacy
.conflict
.actions
);
57 InadequacyList__getShiftContributionIndex (InadequacyList
const *self
)
59 if (!bitset_test (self
->inadequacy
.conflict
.actions
,
60 self
->manifestingState
->reductions
->num
))
61 return ContributionIndex__none
;
62 return self
->contributionCount
- 1;
66 InadequacyList__getContributionToken (InadequacyList
const *self
,
69 aver (0 <= i
&& i
< self
->contributionCount
);
70 return self
->inadequacy
.conflict
.token
;
74 InadequacyList__prependTo (InadequacyList
*self
, InadequacyList
**list
)
76 InadequacyList
*head_old
= *list
;
78 self
->next
= head_old
;