]> git.saurik.com Git - bison.git/blame - src/InadequacyList.c
%parse: support several arguments.
[bison.git] / src / InadequacyList.c
CommitLineData
7fe11bb5
JD
1/* IELR's inadequacy list.
2
3 Copyright (C) 2009 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
25ContributionIndex const ContributionIndex__none = -1;
26ContributionIndex const ContributionIndex__error_action = -2;
27
28InadequacyList *
29InadequacyList__new_conflict (state *manifesting_state, symbol *token,
30 bitset actions)
31{
32 InadequacyList *result = xmalloc (sizeof *result);
33 result->next = NULL;
34 result->manifestingState = manifesting_state;
35 result->contributionCount = bitset_count (actions);
36 result->inadequacy.conflict.token = token;
37 result->inadequacy.conflict.actions = actions;
38 return result;
39}
40
41void
42InadequacyList__delete (InadequacyList *self)
43{
44 while (self)
45 {
46 InadequacyList *node = self;
47 self = self->next;
48 bitset_free (node->inadequacy.conflict.actions);
49 free (node);
50 }
51}
52
53ContributionIndex
54InadequacyList__getShiftContributionIndex (InadequacyList const *self)
55{
56 if (!bitset_test (self->inadequacy.conflict.actions,
57 self->manifestingState->reductions->num))
58 return ContributionIndex__none;
59 return self->contributionCount - 1;
60}
61
62symbol *
63InadequacyList__getContributionToken (InadequacyList const *self,
64 ContributionIndex i)
65{
66 aver (0 <= i && i < self->contributionCount);
67 return self->inadequacy.conflict.token;
68}
69
70void
71InadequacyList__prependTo (InadequacyList *self, InadequacyList **list)
72{
73 InadequacyList *head_old = *list;
74 *list = self;
75 self->next = head_old;
76}