• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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