Home | History | Annotate | Download | only in src
      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