X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/166366b28f579dfb991f8f6fca323847bcc1eb65..72cd9a913f6d282c5e24990505c2c820bda2bf1b:/src/InadequacyList.h?ds=sidebyside diff --git a/src/InadequacyList.h b/src/InadequacyList.h index 5770f994..0d00c5cb 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-2012 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -25,6 +25,14 @@ #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 * reduction except that rule 0 cannot have any because the reduction on rule 0 @@ -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