mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-13 22:33:03 +00:00
portability: <' and >' are not always defined on addresses.
Specifically, don't sort objects by their memory addresses when they're not allocated in the same array or other object. Though I haven't found a test case where that fails on my platform, C says the behavior is undefined. * src/AnnotationList.c (AnnotationList__insertInto): Remove FIXME. Use new id field of InadequacyList nodes rather than their memory addresses when sorting. (AnnotationList__compute_from_inadequacies): Add inadequacy_list_node_count argument to pass to InadequacyList__new_conflict. * src/AnnotationList.h (AnnotationList__compute_from_inadequacies): Update prototype and documentation for new argument. * src/InadequacyList.c (InadequacyList__new_conflict): Add node_count argument and use it to assign a unique ID. * src/InadequacyList.h (InadequacyListNodeCount): New typedef. (InadequacyList): Add id field. (InadequacyList__new_conflict): Update prototype and documentation for new argument. * src/ielr.c (ielr_compute_annotation_lists): Update AnnotationList__compute_from_inadequacies invocation.
This commit is contained in:
@@ -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
|
||||
* <tt>manifesting_state->reductions->num + 1</tt>.
|
||||
* - 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 <tt>*node_count</t> is zero so that the node count
|
||||
* does not eventually overflow. However, if that set is not
|
||||
* currently empty, then <tt>*node_count</tt> 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 {
|
||||
* <tt>0 <= i < manifesting_state->reductions->num</tt>, the reduction
|
||||
* for the rule <tt>manifesting_state->reductions->rules[i]</tt> iff
|
||||
* <tt>actions[i]</tt> 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 <tt>n != result</tt>, then <tt>n->id < result->id</tt>.
|
||||
* - \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
|
||||
|
||||
Reference in New Issue
Block a user