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 * 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 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 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 * 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 74 InadequacyList__prependTo (InadequacyList *self, InadequacyList **list) 75 { 76 InadequacyList *head_old = *list; 77 *list = self; 78 self->next = head_old; 79 } 80