X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/7fe11bb55c1ca7e08f392b8bf413d18062019dd3..70b7c357476ed3525ddb5d2739e70690cfebb207:/src/InadequacyList.h?ds=sidebyside diff --git a/src/InadequacyList.h b/src/InadequacyList.h index 5770f994..d293b9b6 100644 --- a/src/InadequacyList.h +++ b/src/InadequacyList.h @@ -1,6 +1,6 @@ /* IELR's inadequacy list. - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009-2013 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -20,10 +20,18 @@ #ifndef INADEQUACY_LIST_H_ # define INADEQUACY_LIST_H_ -#include -#include "gram.h" -#include "state.h" -#include "symtab.h" +# include +# include "gram.h" +# include "state.h" +# include "symtab.h" + +/** + * A unique ID assigned to every \c InadequacyList node. + * + * This must remain unsigned so that the overflow check in + * \c InadequacyList__new_conflict works properly. + */ +typedef unsigned long long int InadequacyListNodeCount; /** * For a conflict, each rule in the grammar can have at most one contributing @@ -66,6 +74,7 @@ typedef struct { */ typedef struct InadequacyList { struct InadequacyList *next; + InadequacyListNodeCount id; state *manifestingState; ContributionIndex contributionCount; union { @@ -79,6 +88,14 @@ typedef struct InadequacyList { * - \c token is a token. * - The size of \c actions is * manifesting_state->reductions->num + 1. + * - If the set of all \c InadequacyList nodes with which the new + * \c InadequacyList node might be compared is currently empty, then + * it is best if *node_count is zero so that the node count + * does not eventually overflow. However, if that set is not + * currently empty, then *node_count has not been modified + * by any function except \c InadequacyList__new_conflict since the + * invocation of \c InadequacyList__new_conflict that constructed + * the first existing member of that set. * \post * - \c result is a new \c InadequacyList with one node indicating that, in * \c manifesting_state, the following actions are in conflict on \c token: @@ -88,10 +105,14 @@ typedef struct InadequacyList { * 0 <= i < manifesting_state->reductions->num, the reduction * for the rule manifesting_state->reductions->rules[i] iff * actions[i] is set. + * - Given any node \c n from the set of all existing + * \c InadequacyList nodes with which \c result might be compared + * such that n != result, then n->id < result->id. * - \c result assumes responsibility for the memory of \c actions. */ -InadequacyList *InadequacyList__new_conflict (state *manifesting_state, - symbol *token, bitset actions); +InadequacyList *InadequacyList__new_conflict ( + state *manifesting_state, symbol *token, bitset actions, + InadequacyListNodeCount *node_count); /** * \post