105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* IELR's inadequacy annotation list. 205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang Copyright (C) 2009-2012 Free Software Foundation, Inc. 405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 505436638acc7c010349a69c3395f1a57c642dc62Ying Wang This file is part of Bison, the GNU Compiler Compiler. 605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 705436638acc7c010349a69c3395f1a57c642dc62Ying Wang This program is free software: you can redistribute it and/or modify 805436638acc7c010349a69c3395f1a57c642dc62Ying Wang it under the terms of the GNU General Public License as published by 905436638acc7c010349a69c3395f1a57c642dc62Ying Wang the Free Software Foundation, either version 3 of the License, or 1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang (at your option) any later version. 1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang This program is distributed in the hope that it will be useful, 1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang but WITHOUT ANY WARRANTY; without even the implied warranty of 1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang GNU General Public License for more details. 1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang You should have received a copy of the GNU General Public License 1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang along with this program. If not, see <http://www.gnu.org/licenses/>. */ 1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <config.h> 2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "system.h" 2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "AnnotationList.h" 2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "lalr.h" 2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "ielr.h" 2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** 2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang * \pre 2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - <tt>annotations_obstackp != NULL</tt>. 3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang * \post 3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - \c result is a new \c AnnotationList with one node whose: 3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - \c inadequacyNode member is \c NULL. 3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - \c contributions member is allocated with \c contribution_count 3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang * uninitialized elements. 3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - All memory was allocated on \c annotations_obstackp. 3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang */ 3705436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic AnnotationList* 3805436638acc7c010349a69c3395f1a57c642dc62Ying WangAnnotationList__alloc_on_obstack (ContributionIndex contribution_count, 3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang struct obstack *annotations_obstackp) 4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang AnnotationList *result; 4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t contributions_size = 4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang contribution_count * sizeof result->contributions[0]; 4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang result = obstack_alloc (annotations_obstackp, 4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang offsetof (AnnotationList, contributions) 4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang + contributions_size); 4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang result->next = NULL; 4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang result->inadequacyNode = NULL; 4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang return result; 5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** 5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang * \pre 5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - <tt>self != NULL</tt>. 5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - <tt>0 <= ci < self->inadequacyNode->contributionCount</tt>. 5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang * \post 5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - \c result = true iff contribution \c ci in \c self represents an 5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang * "always" contribution. 5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang */ 6005436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic bool 6105436638acc7c010349a69c3395f1a57c642dc62Ying WangAnnotationList__isContributionAlways (AnnotationList const *self, 6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang ContributionIndex ci) 6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang aver (0 <= ci && ci < self->inadequacyNode->contributionCount); 6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang return self->contributions[ci] == NULL; 6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** 6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang * \pre 7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - \c self is a single node. 7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - \c self annotates the same state as every other node in \c list, and 7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang * that state has \c nitems kernel items. 7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang * \post 7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - If the list \c list already contains an identical annotation to \c self, 7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang * \c self was discarded, \c result is false, and the caller is responsible 7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang * for the memory of \c self. 7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - Otherwise, \c list now contains the node \c self, \c result is true, and 7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang * \c list assumes responsibility for the memory of \c self. 7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - The sort in \c list is: 8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - Sort in reverse order on the unique ID of the associated 8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang * inadequacy node. Because these IDs are assigned in ascending 8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang * order, this should mean that the insertion position within an 8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang * annotation list is usually near the beginning with other 8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang * annotations associated with the same inadequacy. 8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - Next, sort on the first contribution that is different as follows: 8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - Sort an always-contribution before a never-contribution before a 8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang * potential-contribution. 8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - Two always-contributions are identical. 8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - Two never-contributions are identical. 9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - For two potential-contributions, sort on the contributions' kernel 9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang * item bitsets interpreted as binary numbers. 9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - The sorting has a few effects: 9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - It accelerates elimination of identical annotations during insertion. 9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - It determines how the output of \c AnnotationList__debug is sorted. 9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - Other than that, it's probably not important. 9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang */ 9705436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic bool 9805436638acc7c010349a69c3395f1a57c642dc62Ying WangAnnotationList__insertInto (AnnotationList *self, AnnotationList **list, 9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t nitems) 10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang AnnotationList **node; 10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (node = list; *node; node = &(*node)->next) 10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang int cmp = 0; 10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang ContributionIndex ci; 10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (self->inadequacyNode->id < (*node)->inadequacyNode->id) 10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang cmp = 1; 10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang else if ((*node)->inadequacyNode->id < self->inadequacyNode->id) 10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang cmp = -1; 11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (ci = 0; 11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang cmp == 0 && ci < self->inadequacyNode->contributionCount; 11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang ++ci) 11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (AnnotationList__isContributionAlways (self, ci)) 11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!AnnotationList__isContributionAlways (*node, ci)) 11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang cmp = -1; 11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang else if (AnnotationList__isContributionAlways (*node, ci)) 12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang cmp = 1; 12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t item; 12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (item = 0; cmp == 0 && item < nitems; ++item) 12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!Sbitset__test (self->contributions[ci], item)) 12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (Sbitset__test ((*node)->contributions[ci], item)) 13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang cmp = -1; 13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang else if (!Sbitset__test ((*node)->contributions[ci], item)) 13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang cmp = 1; 13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (cmp < 0) 13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang self->next = *node; 14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang *node = self; 14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang break; 14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang else if (cmp == 0) 14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang self = NULL; 14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang break; 14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!*node) 15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang *node = self; 15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang return self != NULL; 15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15405436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic bitset 15505436638acc7c010349a69c3395f1a57c642dc62Ying WangAnnotationList__compute_shift_tokens (transitions *trans) 15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset shift_tokens = bitset_create (ntokens, BITSET_FIXED); 15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang int i; 15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang FOR_EACH_SHIFT (trans, i) 16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_set (shift_tokens, TRANSITION_SYMBOL (trans, i)); 16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang return shift_tokens; 16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 16405436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic bitset 16505436638acc7c010349a69c3395f1a57c642dc62Ying WangAnnotationList__compute_conflicted_tokens (bitset shift_tokens, 16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang reductions *reds) 16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset conflicted_tokens = bitset_create (ntokens, BITSET_FIXED); 16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset conflicted_tokens_rule = bitset_create (ntokens, BITSET_FIXED); 17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset tokens = bitset_create (ntokens, BITSET_FIXED); 17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang int i; 17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_copy (tokens, shift_tokens); 17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (i = 0; i < reds->num; ++i) 17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_and (conflicted_tokens_rule, tokens, reds->lookahead_tokens[i]); 17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_or (conflicted_tokens, 17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang conflicted_tokens, conflicted_tokens_rule); 17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_or (tokens, tokens, reds->lookahead_tokens[i]); 18005436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Check that rules are sorted on rule number or the next step in 18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang AnnotationList__compute_from_inadequacies will misbehave. */ 18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang aver (i == 0 || reds->rules[i-1] < reds->rules[i]); 18305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 18405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_free (tokens); 18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_free (conflicted_tokens_rule); 18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang return conflicted_tokens; 18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 19105436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic bool 19205436638acc7c010349a69c3395f1a57c642dc62Ying WangAnnotationList__compute_lhs_contributions (state *s, rule *the_rule, 19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang symbol_number conflicted_token, 19405436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitsetv follow_kernel_items, 19505436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitsetv always_follows, 19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang state ***predecessors, 19705436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset **item_lookahead_sets, 19805436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset *items, 19905436638acc7c010349a69c3395f1a57c642dc62Ying Wang struct obstack 20005436638acc7c010349a69c3395f1a57c642dc62Ying Wang *annotations_obstackp) 20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 20205436638acc7c010349a69c3395f1a57c642dc62Ying Wang goto_number lhs_goto = map_goto (s->number, the_rule->lhs->number); 20305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (bitset_test (always_follows[lhs_goto], conflicted_token)) 20405436638acc7c010349a69c3395f1a57c642dc62Ying Wang return true; 20505436638acc7c010349a69c3395f1a57c642dc62Ying Wang *items = Sbitset__new_on_obstack (s->nitems, annotations_obstackp); 20605436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 20705436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_iterator biter_item; 20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_bindex item; 20905436638acc7c010349a69c3395f1a57c642dc62Ying Wang BITSET_FOR_EACH (biter_item, follow_kernel_items[lhs_goto], item, 0) 21005436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (ielr_item_has_lookahead (s, 0, item, conflicted_token, 21105436638acc7c010349a69c3395f1a57c642dc62Ying Wang predecessors, item_lookahead_sets)) 21205436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset__set (*items, item); 21305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 21405436638acc7c010349a69c3395f1a57c642dc62Ying Wang return false; 21505436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 21705436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic void 21805436638acc7c010349a69c3395f1a57c642dc62Ying WangAnnotationList__computePredecessorAnnotations (AnnotationList *self, state *s, 21905436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitsetv follow_kernel_items, 22005436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitsetv always_follows, 22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang state ***predecessors, 22205436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset **item_lookahead_sets, 22305436638acc7c010349a69c3395f1a57c642dc62Ying Wang AnnotationList 22405436638acc7c010349a69c3395f1a57c642dc62Ying Wang **annotation_lists, 22505436638acc7c010349a69c3395f1a57c642dc62Ying Wang AnnotationIndex 22605436638acc7c010349a69c3395f1a57c642dc62Ying Wang *annotation_counts, 22705436638acc7c010349a69c3395f1a57c642dc62Ying Wang struct obstack 22805436638acc7c010349a69c3395f1a57c642dc62Ying Wang *annotations_obstackp) 22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang state **predecessor; 23105436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (predecessor = predecessors[s->number]; *predecessor; ++predecessor) 23205436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 23305436638acc7c010349a69c3395f1a57c642dc62Ying Wang AnnotationList *annotation_node = 23405436638acc7c010349a69c3395f1a57c642dc62Ying Wang AnnotationList__alloc_on_obstack ( 23505436638acc7c010349a69c3395f1a57c642dc62Ying Wang self->inadequacyNode->contributionCount, annotations_obstackp); 23605436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node->inadequacyNode = self->inadequacyNode; 23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool potential_contribution = false; 23805436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset *lookaheads = NULL; 23905436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 24005436638acc7c010349a69c3395f1a57c642dc62Ying Wang ContributionIndex ci; 24105436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (ci = 0; ci < self->inadequacyNode->contributionCount; ++ci) 24205436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 24305436638acc7c010349a69c3395f1a57c642dc62Ying Wang symbol_number contribution_token = 24405436638acc7c010349a69c3395f1a57c642dc62Ying Wang InadequacyList__getContributionToken (self->inadequacyNode, ci) 24505436638acc7c010349a69c3395f1a57c642dc62Ying Wang ->number; 24605436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (AnnotationList__isContributionAlways (self, ci)) 24705436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 24805436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node->contributions[ci] = NULL; 24905436638acc7c010349a69c3395f1a57c642dc62Ying Wang continue; 25005436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 25105436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node->contributions[ci] = 25205436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset__new_on_obstack ((*predecessor)->nitems, 25305436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotations_obstackp); 25405436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 25505436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t predecessor_item = 0; 25605436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset sbiter_item; 25705436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset__Index self_item; 25805436638acc7c010349a69c3395f1a57c642dc62Ying Wang SBITSET__FOR_EACH (self->contributions[ci], s->nitems, 25905436638acc7c010349a69c3395f1a57c642dc62Ying Wang sbiter_item, self_item) 26005436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 26105436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* If this kernel item is the beginning of a RHS, it must be 26205436638acc7c010349a69c3395f1a57c642dc62Ying Wang the kernel item in the start state, and so it has an empty 26305436638acc7c010349a69c3395f1a57c642dc62Ying Wang lookahead set. Thus, it can't contribute to inadequacies, 26405436638acc7c010349a69c3395f1a57c642dc62Ying Wang and so it should never have been identified as a 26505436638acc7c010349a69c3395f1a57c642dc62Ying Wang contribution. If, instead, this kernel item is the 26605436638acc7c010349a69c3395f1a57c642dc62Ying Wang successor of the start state's kernel item, the lookahead 26705436638acc7c010349a69c3395f1a57c642dc62Ying Wang set is still empty, and so it also should never have been 26805436638acc7c010349a69c3395f1a57c642dc62Ying Wang identified as a contribution. This situation is fortunate 26905436638acc7c010349a69c3395f1a57c642dc62Ying Wang because we want to avoid the - 2 below in both cases. */ 27005436638acc7c010349a69c3395f1a57c642dc62Ying Wang aver (s->items[self_item] > 1); 27105436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* If this kernel item is next to the beginning of the RHS, 27205436638acc7c010349a69c3395f1a57c642dc62Ying Wang then check all of the predecessor's goto follows for the 27305436638acc7c010349a69c3395f1a57c642dc62Ying Wang LHS. */ 27405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (item_number_is_rule_number (ritem[s->items[self_item] 27505436638acc7c010349a69c3395f1a57c642dc62Ying Wang - 2])) 27605436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 27705436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset items; 27805436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned int rulei; 27905436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (rulei = s->items[self_item]; 28005436638acc7c010349a69c3395f1a57c642dc62Ying Wang !item_number_is_rule_number (ritem[rulei]); 28105436638acc7c010349a69c3395f1a57c642dc62Ying Wang ++rulei) 28205436638acc7c010349a69c3395f1a57c642dc62Ying Wang ; 28305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (AnnotationList__compute_lhs_contributions ( 28405436638acc7c010349a69c3395f1a57c642dc62Ying Wang *predecessor, 28505436638acc7c010349a69c3395f1a57c642dc62Ying Wang &rules[item_number_as_rule_number (ritem[rulei])], 28605436638acc7c010349a69c3395f1a57c642dc62Ying Wang contribution_token, 28705436638acc7c010349a69c3395f1a57c642dc62Ying Wang follow_kernel_items, always_follows, predecessors, 28805436638acc7c010349a69c3395f1a57c642dc62Ying Wang item_lookahead_sets, &items, annotations_obstackp)) 28905436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 29005436638acc7c010349a69c3395f1a57c642dc62Ying Wang obstack_free (annotations_obstackp, 29105436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node->contributions[ci]); 29205436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node->contributions[ci] = NULL; 29305436638acc7c010349a69c3395f1a57c642dc62Ying Wang break; 29405436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 29505436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 29605436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 29705436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset__or (annotation_node->contributions[ci], 29805436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node->contributions[ci], 29905436638acc7c010349a69c3395f1a57c642dc62Ying Wang items, (*predecessor)->nitems); 30005436638acc7c010349a69c3395f1a57c642dc62Ying Wang obstack_free (annotations_obstackp, items); 30105436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 30205436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 30305436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* If this kernel item is later in the RHS, then check the 30405436638acc7c010349a69c3395f1a57c642dc62Ying Wang predecessor item's lookahead set. */ 30505436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 30605436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 30705436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* We don't have to start the predecessor item search at 30805436638acc7c010349a69c3395f1a57c642dc62Ying Wang the beginning every time because items from both 30905436638acc7c010349a69c3395f1a57c642dc62Ying Wang states are sorted by their indices in ritem. */ 31005436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (; 31105436638acc7c010349a69c3395f1a57c642dc62Ying Wang predecessor_item < (*predecessor)->nitems; 31205436638acc7c010349a69c3395f1a57c642dc62Ying Wang ++predecessor_item) 31305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if ((*predecessor)->items[predecessor_item] 31405436638acc7c010349a69c3395f1a57c642dc62Ying Wang == s->items[self_item] - 1) 31505436638acc7c010349a69c3395f1a57c642dc62Ying Wang break; 31605436638acc7c010349a69c3395f1a57c642dc62Ying Wang aver (predecessor_item != (*predecessor)->nitems); 31705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (ielr_item_has_lookahead (*predecessor, 0, 31805436638acc7c010349a69c3395f1a57c642dc62Ying Wang predecessor_item, 31905436638acc7c010349a69c3395f1a57c642dc62Ying Wang contribution_token, 32005436638acc7c010349a69c3395f1a57c642dc62Ying Wang predecessors, 32105436638acc7c010349a69c3395f1a57c642dc62Ying Wang item_lookahead_sets)) 32205436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset__set (annotation_node->contributions[ci], 32305436638acc7c010349a69c3395f1a57c642dc62Ying Wang predecessor_item); 32405436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 32505436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 32605436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 32705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (annotation_node->contributions[ci]) 32805436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 32905436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset biter; 33005436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset__Index i; 33105436638acc7c010349a69c3395f1a57c642dc62Ying Wang SBITSET__FOR_EACH (annotation_node->contributions[ci], 33205436638acc7c010349a69c3395f1a57c642dc62Ying Wang (*predecessor)->nitems, biter, i) 33305436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 33405436638acc7c010349a69c3395f1a57c642dc62Ying Wang potential_contribution = true; 33505436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!lookaheads) 33605436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 33705436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t j; 33805436638acc7c010349a69c3395f1a57c642dc62Ying Wang lookaheads = xnmalloc ((*predecessor)->nitems, 33905436638acc7c010349a69c3395f1a57c642dc62Ying Wang sizeof *lookaheads); 34005436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (j = 0; j < (*predecessor)->nitems; ++j) 34105436638acc7c010349a69c3395f1a57c642dc62Ying Wang lookaheads[j] = NULL; 34205436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 34305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!lookaheads[i]) 34405436638acc7c010349a69c3395f1a57c642dc62Ying Wang lookaheads[i] = bitset_create (ntokens, BITSET_FIXED); 34505436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_set (lookaheads[i], contribution_token); 34605436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 34705436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 34805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 34905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 35005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 35105436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* If the predecessor has any contributions besides just "always" and 35205436638acc7c010349a69c3395f1a57c642dc62Ying Wang "never" contributions: 35305436638acc7c010349a69c3395f1a57c642dc62Ying Wang - If the dominant contribution is split-stable, the annotation could 35405436638acc7c010349a69c3395f1a57c642dc62Ying Wang not affect merging on this predecessor state or its eventual 35505436638acc7c010349a69c3395f1a57c642dc62Ying Wang predecessor states. Moreover, all contributions that affect 35605436638acc7c010349a69c3395f1a57c642dc62Ying Wang whether the dominant contribution remains dominant must be "always" 35705436638acc7c010349a69c3395f1a57c642dc62Ying Wang or "never" contributions in order for the dominant contribution to 35805436638acc7c010349a69c3395f1a57c642dc62Ying Wang be split-stable. Thus, the dominant contribution computation result 35905436638acc7c010349a69c3395f1a57c642dc62Ying Wang in eventual successor states will not be affected by lookaheads 36005436638acc7c010349a69c3395f1a57c642dc62Ying Wang tracked for this predecessor state. (Also, as in the isocore 36105436638acc7c010349a69c3395f1a57c642dc62Ying Wang compatibility test, we depend on the fact that isocores with equal 36205436638acc7c010349a69c3395f1a57c642dc62Ying Wang dominant contributions will have the same dominant contribution when 36305436638acc7c010349a69c3395f1a57c642dc62Ying Wang merged. Otherwise, we might have to worry that the presence of a 36405436638acc7c010349a69c3395f1a57c642dc62Ying Wang potential contribution might somehow be the culprit of that behavior 36505436638acc7c010349a69c3395f1a57c642dc62Ying Wang and thus need to be tracked regardless of the split stability of the 36605436638acc7c010349a69c3395f1a57c642dc62Ying Wang dominant contribution.) Thus, go ahead and discard the annotation 36705436638acc7c010349a69c3395f1a57c642dc62Ying Wang to save space now plus time during state splitting. 36805436638acc7c010349a69c3395f1a57c642dc62Ying Wang - Otherwise, record the annotation, and compute any resulting 36905436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotations needed on predecessor states. */ 37005436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (potential_contribution) 37105436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 37205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (ContributionIndex__none 37305436638acc7c010349a69c3395f1a57c642dc62Ying Wang != AnnotationList__computeDominantContribution ( 37405436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node, (*predecessor)->nitems, lookaheads, true)) 37505436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 37605436638acc7c010349a69c3395f1a57c642dc62Ying Wang obstack_free (annotations_obstackp, annotation_node); 37705436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node = NULL; 37805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 37905436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 38005436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t i; 38105436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (i = 0; i < (*predecessor)->nitems; ++i) 38205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (lookaheads[i]) 38305436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_free (lookaheads[i]); 38405436638acc7c010349a69c3395f1a57c642dc62Ying Wang free (lookaheads); 38505436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 38605436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (annotation_node) 38705436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 38805436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (AnnotationList__insertInto (annotation_node, 38905436638acc7c010349a69c3395f1a57c642dc62Ying Wang &annotation_lists[(*predecessor) 39005436638acc7c010349a69c3395f1a57c642dc62Ying Wang ->number], 39105436638acc7c010349a69c3395f1a57c642dc62Ying Wang (*predecessor)->nitems)) 39205436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 39305436638acc7c010349a69c3395f1a57c642dc62Ying Wang ++annotation_counts[(*predecessor)->number]; 39405436638acc7c010349a69c3395f1a57c642dc62Ying Wang AnnotationList__computePredecessorAnnotations ( 39505436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node, *predecessor, 39605436638acc7c010349a69c3395f1a57c642dc62Ying Wang follow_kernel_items, always_follows, predecessors, 39705436638acc7c010349a69c3395f1a57c642dc62Ying Wang item_lookahead_sets, annotation_lists, annotation_counts, 39805436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotations_obstackp); 39905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 40005436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 40105436638acc7c010349a69c3395f1a57c642dc62Ying Wang obstack_free (annotations_obstackp, annotation_node); 40205436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 40305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 40405436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 40505436638acc7c010349a69c3395f1a57c642dc62Ying Wang obstack_free (annotations_obstackp, annotation_node); 40605436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 40705436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 40805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 40905436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid 41005436638acc7c010349a69c3395f1a57c642dc62Ying WangAnnotationList__compute_from_inadequacies ( 41105436638acc7c010349a69c3395f1a57c642dc62Ying Wang state *s, bitsetv follow_kernel_items, bitsetv always_follows, 41205436638acc7c010349a69c3395f1a57c642dc62Ying Wang state ***predecessors, bitset **item_lookahead_sets, 41305436638acc7c010349a69c3395f1a57c642dc62Ying Wang InadequacyList **inadequacy_lists, AnnotationList **annotation_lists, 41405436638acc7c010349a69c3395f1a57c642dc62Ying Wang AnnotationIndex *annotation_counts, 41505436638acc7c010349a69c3395f1a57c642dc62Ying Wang ContributionIndex *max_contributionsp, 41605436638acc7c010349a69c3395f1a57c642dc62Ying Wang struct obstack *annotations_obstackp, 41705436638acc7c010349a69c3395f1a57c642dc62Ying Wang InadequacyListNodeCount *inadequacy_list_node_count) 41805436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 41905436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitsetv all_lookaheads; 42005436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset shift_tokens; 42105436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset conflicted_tokens; 42205436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_iterator biter_conflict; 42305436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_bindex conflicted_token; 42405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 42505436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Return an empty list if s->lookahead_tokens = NULL. */ 42605436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (s->consistent) 42705436638acc7c010349a69c3395f1a57c642dc62Ying Wang return; 42805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 42905436638acc7c010349a69c3395f1a57c642dc62Ying Wang all_lookaheads = bitsetv_create (s->nitems, ntokens, BITSET_FIXED); 43005436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitsetv_ones (all_lookaheads); 43105436638acc7c010349a69c3395f1a57c642dc62Ying Wang shift_tokens = AnnotationList__compute_shift_tokens (s->transitions); 43205436638acc7c010349a69c3395f1a57c642dc62Ying Wang conflicted_tokens = 43305436638acc7c010349a69c3395f1a57c642dc62Ying Wang AnnotationList__compute_conflicted_tokens (shift_tokens, s->reductions); 43405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 43505436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Add an inadequacy annotation for each conflicted_token. */ 43605436638acc7c010349a69c3395f1a57c642dc62Ying Wang BITSET_FOR_EACH (biter_conflict, conflicted_tokens, conflicted_token, 0) 43705436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 43805436638acc7c010349a69c3395f1a57c642dc62Ying Wang AnnotationList *annotation_node; 43905436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* FIXME: Would a BITSET_FRUGAL or BITEST_SPARSE be more efficient? Now 44005436638acc7c010349a69c3395f1a57c642dc62Ying Wang or convert it inside InadequacyList__new_conflict? */ 44105436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset actions = bitset_create (s->reductions->num + 1, BITSET_FIXED); 44205436638acc7c010349a69c3395f1a57c642dc62Ying Wang ContributionIndex contribution_count = 0; 44305436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool potential_contribution = false; 44405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 44505436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Allocate the annotation node. */ 44605436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 44705436638acc7c010349a69c3395f1a57c642dc62Ying Wang int rule_i; 44805436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (rule_i = 0; rule_i < s->reductions->num; ++rule_i) 44905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (bitset_test (s->reductions->lookahead_tokens[rule_i], 45005436638acc7c010349a69c3395f1a57c642dc62Ying Wang conflicted_token)) 45105436638acc7c010349a69c3395f1a57c642dc62Ying Wang ++contribution_count; 45205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (bitset_test (shift_tokens, conflicted_token)) 45305436638acc7c010349a69c3395f1a57c642dc62Ying Wang ++contribution_count; 45405436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node = 45505436638acc7c010349a69c3395f1a57c642dc62Ying Wang AnnotationList__alloc_on_obstack (contribution_count, 45605436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotations_obstackp); 45705436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 45805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 45905436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Add a contribution for each reduction that has conflicted_token as a 46005436638acc7c010349a69c3395f1a57c642dc62Ying Wang lookahead. */ 46105436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 46205436638acc7c010349a69c3395f1a57c642dc62Ying Wang ContributionIndex ci = 0; 46305436638acc7c010349a69c3395f1a57c642dc62Ying Wang int item_i = 0; 46405436638acc7c010349a69c3395f1a57c642dc62Ying Wang int rule_i; 46505436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (rule_i = 0; rule_i < s->reductions->num; ++rule_i) 46605436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 46705436638acc7c010349a69c3395f1a57c642dc62Ying Wang rule *the_rule = s->reductions->rules[rule_i]; 46805436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (bitset_test (s->reductions->lookahead_tokens[rule_i], 46905436638acc7c010349a69c3395f1a57c642dc62Ying Wang conflicted_token)) 47005436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 47105436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_set (actions, rule_i); 47205436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* If this reduction is on a kernel item, just add it. */ 47305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!item_number_is_rule_number (the_rule->rhs[0])) 47405436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 47505436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node->contributions[ci] = 47605436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset__new_on_obstack (s->nitems, 47705436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotations_obstackp); 47805436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Catch item_i up to rule_i. This works because both are 47905436638acc7c010349a69c3395f1a57c642dc62Ying Wang sorted on rule number. */ 48005436638acc7c010349a69c3395f1a57c642dc62Ying Wang while (!item_number_is_rule_number ( 48105436638acc7c010349a69c3395f1a57c642dc62Ying Wang ritem[s->items[item_i]]) 48205436638acc7c010349a69c3395f1a57c642dc62Ying Wang || item_number_as_rule_number ( 48305436638acc7c010349a69c3395f1a57c642dc62Ying Wang ritem[s->items[item_i]]) 48405436638acc7c010349a69c3395f1a57c642dc62Ying Wang != the_rule->number) 48505436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 48605436638acc7c010349a69c3395f1a57c642dc62Ying Wang ++item_i; 48705436638acc7c010349a69c3395f1a57c642dc62Ying Wang aver (item_i < s->nitems); 48805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 48905436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset__set (annotation_node->contributions[ci], item_i); 49005436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 49105436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Otherwise, add the kernel items whose lookahead sets 49205436638acc7c010349a69c3395f1a57c642dc62Ying Wang contribute the conflicted token to this reduction's 49305436638acc7c010349a69c3395f1a57c642dc62Ying Wang lookahead set. */ 49405436638acc7c010349a69c3395f1a57c642dc62Ying Wang else if (AnnotationList__compute_lhs_contributions ( 49505436638acc7c010349a69c3395f1a57c642dc62Ying Wang s, the_rule, conflicted_token, follow_kernel_items, 49605436638acc7c010349a69c3395f1a57c642dc62Ying Wang always_follows, predecessors, item_lookahead_sets, 49705436638acc7c010349a69c3395f1a57c642dc62Ying Wang &annotation_node->contributions[ci], 49805436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotations_obstackp)) 49905436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 50005436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node->contributions[ci++] = NULL; 50105436638acc7c010349a69c3395f1a57c642dc62Ying Wang continue; 50205436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 50305436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* The lookahead token has to come from somewhere. */ 50405436638acc7c010349a69c3395f1a57c642dc62Ying Wang aver (!Sbitset__isEmpty (annotation_node->contributions[ci], 50505436638acc7c010349a69c3395f1a57c642dc62Ying Wang s->nitems)); 50605436638acc7c010349a69c3395f1a57c642dc62Ying Wang ++ci; 50705436638acc7c010349a69c3395f1a57c642dc62Ying Wang potential_contribution = true; 50805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 50905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 51005436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 51105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 51205436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* If there are any contributions besides just "always" contributions: 51305436638acc7c010349a69c3395f1a57c642dc62Ying Wang - If there's also a shift contribution, record it. 51405436638acc7c010349a69c3395f1a57c642dc62Ying Wang - If the dominant contribution is split-stable, then the annotation 51505436638acc7c010349a69c3395f1a57c642dc62Ying Wang could not affect merging, so go ahead and discard the annotation and 51605436638acc7c010349a69c3395f1a57c642dc62Ying Wang the inadequacy to save space now plus time during state splitting. 51705436638acc7c010349a69c3395f1a57c642dc62Ying Wang - Otherwise, record the annotation and the inadequacy, and compute any 51805436638acc7c010349a69c3395f1a57c642dc62Ying Wang resulting annotations needed on predecessor states. */ 51905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (potential_contribution) 52005436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 52105436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (bitset_test (shift_tokens, conflicted_token)) 52205436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 52305436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_set (actions, s->reductions->num); 52405436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node->contributions[contribution_count - 1] = NULL; 52505436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 52605436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 52705436638acc7c010349a69c3395f1a57c642dc62Ying Wang InadequacyList *conflict_node = 52805436638acc7c010349a69c3395f1a57c642dc62Ying Wang InadequacyList__new_conflict ( 52905436638acc7c010349a69c3395f1a57c642dc62Ying Wang s, symbols[conflicted_token], actions, 53005436638acc7c010349a69c3395f1a57c642dc62Ying Wang inadequacy_list_node_count); 53105436638acc7c010349a69c3395f1a57c642dc62Ying Wang actions = NULL; 53205436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node->inadequacyNode = conflict_node; 53305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (ContributionIndex__none 53405436638acc7c010349a69c3395f1a57c642dc62Ying Wang != AnnotationList__computeDominantContribution ( 53505436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node, s->nitems, all_lookaheads, true)) 53605436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 53705436638acc7c010349a69c3395f1a57c642dc62Ying Wang obstack_free (annotations_obstackp, annotation_node); 53805436638acc7c010349a69c3395f1a57c642dc62Ying Wang InadequacyList__delete (conflict_node); 53905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 54005436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 54105436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 54205436638acc7c010349a69c3395f1a57c642dc62Ying Wang InadequacyList__prependTo (conflict_node, 54305436638acc7c010349a69c3395f1a57c642dc62Ying Wang &inadequacy_lists[s->number]); 54405436638acc7c010349a69c3395f1a57c642dc62Ying Wang aver (AnnotationList__insertInto ( 54505436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node, &annotation_lists[s->number], 54605436638acc7c010349a69c3395f1a57c642dc62Ying Wang s->nitems)); 54705436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* This aver makes sure the 54805436638acc7c010349a69c3395f1a57c642dc62Ying Wang AnnotationList__computeDominantContribution check above 54905436638acc7c010349a69c3395f1a57c642dc62Ying Wang does discard annotations in the simplest case of a S/R 55005436638acc7c010349a69c3395f1a57c642dc62Ying Wang conflict with no token precedence. */ 55105436638acc7c010349a69c3395f1a57c642dc62Ying Wang aver (!bitset_test (shift_tokens, conflicted_token) 55205436638acc7c010349a69c3395f1a57c642dc62Ying Wang || symbols[conflicted_token]->prec); 55305436638acc7c010349a69c3395f1a57c642dc62Ying Wang ++annotation_counts[s->number]; 55405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (contribution_count > *max_contributionsp) 55505436638acc7c010349a69c3395f1a57c642dc62Ying Wang *max_contributionsp = contribution_count; 55605436638acc7c010349a69c3395f1a57c642dc62Ying Wang AnnotationList__computePredecessorAnnotations ( 55705436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotation_node, s, 55805436638acc7c010349a69c3395f1a57c642dc62Ying Wang follow_kernel_items, always_follows, predecessors, 55905436638acc7c010349a69c3395f1a57c642dc62Ying Wang item_lookahead_sets, annotation_lists, annotation_counts, 56005436638acc7c010349a69c3395f1a57c642dc62Ying Wang annotations_obstackp); 56105436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 56205436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 56305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 56405436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 56505436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 56605436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_free (actions); 56705436638acc7c010349a69c3395f1a57c642dc62Ying Wang obstack_free (annotations_obstackp, annotation_node); 56805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 56905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 57005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 57105436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitsetv_free (all_lookaheads); 57205436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_free (shift_tokens); 57305436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_free (conflicted_tokens); 57405436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 57505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 57605436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid 57705436638acc7c010349a69c3395f1a57c642dc62Ying WangAnnotationList__debug (AnnotationList const *self, size_t nitems, int spaces) 57805436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 57905436638acc7c010349a69c3395f1a57c642dc62Ying Wang AnnotationList const *a; 58005436638acc7c010349a69c3395f1a57c642dc62Ying Wang AnnotationIndex ai; 58105436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (a = self, ai = 0; a; a = a->next, ++ai) 58205436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 58305436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 58405436638acc7c010349a69c3395f1a57c642dc62Ying Wang int j; 58505436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (j = 0; j < spaces; ++j) 58605436638acc7c010349a69c3395f1a57c642dc62Ying Wang putc (' ', stderr); 58705436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 58805436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (stderr, "Annotation %d (manifesting state %d):\n", 58905436638acc7c010349a69c3395f1a57c642dc62Ying Wang ai, a->inadequacyNode->manifestingState->number); 59005436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 59105436638acc7c010349a69c3395f1a57c642dc62Ying Wang ContributionIndex ci; 59205436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_bindex rulei = 0; /* init suppresses compiler warning */ 59305436638acc7c010349a69c3395f1a57c642dc62Ying Wang rulei = bitset_first (a->inadequacyNode->inadequacy.conflict.actions); 59405436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (ci = 0; ci < a->inadequacyNode->contributionCount; ++ci) 59505436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 59605436638acc7c010349a69c3395f1a57c642dc62Ying Wang symbol_number token = 59705436638acc7c010349a69c3395f1a57c642dc62Ying Wang InadequacyList__getContributionToken (a->inadequacyNode, ci) 59805436638acc7c010349a69c3395f1a57c642dc62Ying Wang ->number; 59905436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 60005436638acc7c010349a69c3395f1a57c642dc62Ying Wang int j; 60105436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (j = 0; j < spaces+2; ++j) 60205436638acc7c010349a69c3395f1a57c642dc62Ying Wang putc (' ', stderr); 60305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 60405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (ci == InadequacyList__getShiftContributionIndex ( 60505436638acc7c010349a69c3395f1a57c642dc62Ying Wang a->inadequacyNode)) 60605436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (stderr, "Contributes shift of token %d.\n", token); 60705436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 60805436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 60905436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (stderr, "Contributes token %d", token); 61005436638acc7c010349a69c3395f1a57c642dc62Ying Wang aver (rulei != BITSET_BINDEX_MAX); 61105436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (stderr, " as lookahead, rule number %d", 61205436638acc7c010349a69c3395f1a57c642dc62Ying Wang a->inadequacyNode->manifestingState 61305436638acc7c010349a69c3395f1a57c642dc62Ying Wang ->reductions->rules[rulei]->number); 61405436638acc7c010349a69c3395f1a57c642dc62Ying Wang rulei = 61505436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_next (a->inadequacyNode->inadequacy.conflict.actions, 61605436638acc7c010349a69c3395f1a57c642dc62Ying Wang rulei+1); 61705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (AnnotationList__isContributionAlways (a, ci)) 61805436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (stderr, " always."); 61905436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 62005436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 62105436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (stderr, ", items: "); 62205436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset__fprint (a->contributions[ci], nitems, stderr); 62305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 62405436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (stderr, "\n"); 62505436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 62605436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 62705436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 62805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 62905436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 63005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 63105436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid 63205436638acc7c010349a69c3395f1a57c642dc62Ying WangAnnotationList__computeLookaheadFilter (AnnotationList const *self, 63305436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t nitems, 63405436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitsetv lookahead_filter) 63505436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 63605436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitsetv_zero (lookahead_filter); 63705436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (; self; self = self->next) 63805436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 63905436638acc7c010349a69c3395f1a57c642dc62Ying Wang ContributionIndex ci; 64005436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (ci = 0; ci < self->inadequacyNode->contributionCount; ++ci) 64105436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!AnnotationList__isContributionAlways (self, ci)) 64205436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 64305436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset__Index item; 64405436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset biter; 64505436638acc7c010349a69c3395f1a57c642dc62Ying Wang symbol_number token = 64605436638acc7c010349a69c3395f1a57c642dc62Ying Wang InadequacyList__getContributionToken (self->inadequacyNode, ci) 64705436638acc7c010349a69c3395f1a57c642dc62Ying Wang ->number; 64805436638acc7c010349a69c3395f1a57c642dc62Ying Wang SBITSET__FOR_EACH (self->contributions[ci], nitems, biter, item) 64905436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_set (lookahead_filter[item], token); 65005436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 65105436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 65205436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 65305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 65405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** 65505436638acc7c010349a69c3395f1a57c642dc62Ying Wang * \pre 65605436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - <tt>self != NULL</tt>. 65705436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - \c nitems is the number of kernel items in the LR(0) state that \c self 65805436638acc7c010349a69c3395f1a57c642dc62Ying Wang * annotates. 65905436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - \c lookaheads describes the lookahead sets on the kernel items of some 66005436638acc7c010349a69c3395f1a57c642dc62Ying Wang * isocore of the LR(0) state that \c self annotates. Either: 66105436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - <tt>lookaheads = NULL</tt> only if the lookahead set on every kernel 66205436638acc7c010349a69c3395f1a57c642dc62Ying Wang * item is empty. 66305436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - For any <tt>0 <= i < nitems</tt>, <tt>lookaheads[i]</tt> is either: 66405436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - \c NULL only if the lookahead set on kernel item \c i is empty. 66505436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - The (possibly empty) lookahead set on kernel item \c i. 66605436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - <tt>0 <= ci < self->inadequacyNode->contributionCount</tt>. 66705436638acc7c010349a69c3395f1a57c642dc62Ying Wang * \post 66805436638acc7c010349a69c3395f1a57c642dc62Ying Wang * - \c result = true iff contribution \c ci in \c self is made by the state 66905436638acc7c010349a69c3395f1a57c642dc62Ying Wang * described by \c lookaheads. 67005436638acc7c010349a69c3395f1a57c642dc62Ying Wang */ 67105436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic bool 67205436638acc7c010349a69c3395f1a57c642dc62Ying WangAnnotationList__stateMakesContribution (AnnotationList const *self, 67305436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t nitems, ContributionIndex ci, 67405436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset *lookaheads) 67505436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 67605436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (AnnotationList__isContributionAlways (self, ci)) 67705436638acc7c010349a69c3395f1a57c642dc62Ying Wang return true; 67805436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!lookaheads) 67905436638acc7c010349a69c3395f1a57c642dc62Ying Wang return false; 68005436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 68105436638acc7c010349a69c3395f1a57c642dc62Ying Wang symbol_number token = 68205436638acc7c010349a69c3395f1a57c642dc62Ying Wang InadequacyList__getContributionToken (self->inadequacyNode, ci)->number; 68305436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset__Index item; 68405436638acc7c010349a69c3395f1a57c642dc62Ying Wang Sbitset biter; 68505436638acc7c010349a69c3395f1a57c642dc62Ying Wang SBITSET__FOR_EACH (self->contributions[ci], nitems, biter, item) 68605436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (lookaheads[item] && bitset_test (lookaheads[item], token)) 68705436638acc7c010349a69c3395f1a57c642dc62Ying Wang return true; 68805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 68905436638acc7c010349a69c3395f1a57c642dc62Ying Wang return false; 69005436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 69105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 69205436638acc7c010349a69c3395f1a57c642dc62Ying WangContributionIndex 69305436638acc7c010349a69c3395f1a57c642dc62Ying WangAnnotationList__computeDominantContribution (AnnotationList const *self, 69405436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t nitems, bitset *lookaheads, 69505436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool require_split_stable) 69605436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 69705436638acc7c010349a69c3395f1a57c642dc62Ying Wang symbol *token; 69805436638acc7c010349a69c3395f1a57c642dc62Ying Wang ContributionIndex const ci_shift = 69905436638acc7c010349a69c3395f1a57c642dc62Ying Wang InadequacyList__getShiftContributionIndex (self->inadequacyNode); 70005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 70105436638acc7c010349a69c3395f1a57c642dc62Ying Wang token = self->inadequacyNode->inadequacy.conflict.token; 70205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 70305436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* S/R conflict. */ 70405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (ci_shift != ContributionIndex__none) 70505436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 70605436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool find_stable_domination_over_shift = false; 70705436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool find_stable_error_action_domination = false; 70805436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 70905436638acc7c010349a69c3395f1a57c642dc62Ying Wang ContributionIndex ci; 71005436638acc7c010349a69c3395f1a57c642dc62Ying Wang int actioni; 71105436638acc7c010349a69c3395f1a57c642dc62Ying Wang ContributionIndex ci_rr_dominator = ContributionIndex__none; 71205436638acc7c010349a69c3395f1a57c642dc62Ying Wang int shift_precedence = token->prec; 71305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 71405436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* If the token has no precedence set, shift is always chosen. */ 71505436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!shift_precedence) 71605436638acc7c010349a69c3395f1a57c642dc62Ying Wang return ci_shift; 71705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 71805436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Figure out which reductions contribute, which of those would 71905436638acc7c010349a69c3395f1a57c642dc62Ying Wang dominate in a R/R comparison, and whether any reduction dominates 72005436638acc7c010349a69c3395f1a57c642dc62Ying Wang the shift so that the R/R comparison is actually needed. */ 72105436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (ci = 0, actioni = bitset_first (self->inadequacyNode->inadequacy 72205436638acc7c010349a69c3395f1a57c642dc62Ying Wang .conflict.actions); 72305436638acc7c010349a69c3395f1a57c642dc62Ying Wang ci < self->inadequacyNode->contributionCount; 72405436638acc7c010349a69c3395f1a57c642dc62Ying Wang ++ci, actioni = bitset_next (self->inadequacyNode->inadequacy 72505436638acc7c010349a69c3395f1a57c642dc62Ying Wang .conflict.actions, actioni+1)) 72605436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 72705436638acc7c010349a69c3395f1a57c642dc62Ying Wang int reduce_precedence = 0; 72805436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (ci == ci_shift) 72905436638acc7c010349a69c3395f1a57c642dc62Ying Wang continue; 73005436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 73105436638acc7c010349a69c3395f1a57c642dc62Ying Wang rule *r = self->inadequacyNode->manifestingState 73205436638acc7c010349a69c3395f1a57c642dc62Ying Wang ->reductions->rules[actioni]; 73305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (r->prec) 73405436638acc7c010349a69c3395f1a57c642dc62Ying Wang reduce_precedence = r->prec->prec; 73505436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 73605436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* If there's no need to check whether this reduction actually 73705436638acc7c010349a69c3395f1a57c642dc62Ying Wang contributes because the shift eliminates it from the R/R 73805436638acc7c010349a69c3395f1a57c642dc62Ying Wang comparison anyway, continue to the next reduction. */ 73905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (reduce_precedence 74005436638acc7c010349a69c3395f1a57c642dc62Ying Wang && (reduce_precedence < shift_precedence 74105436638acc7c010349a69c3395f1a57c642dc62Ying Wang || (reduce_precedence == shift_precedence 74205436638acc7c010349a69c3395f1a57c642dc62Ying Wang && token->assoc == right_assoc))) 74305436638acc7c010349a69c3395f1a57c642dc62Ying Wang continue; 74405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!AnnotationList__stateMakesContribution (self, nitems, ci, 74505436638acc7c010349a69c3395f1a57c642dc62Ying Wang lookaheads)) 74605436638acc7c010349a69c3395f1a57c642dc62Ying Wang continue; 74705436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* This uneliminated reduction contributes, so see if it can cause 74805436638acc7c010349a69c3395f1a57c642dc62Ying Wang an error action. */ 74905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (reduce_precedence == shift_precedence 75005436638acc7c010349a69c3395f1a57c642dc62Ying Wang && token->assoc == non_assoc) 75105436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 75205436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* It's not possible to find split-stable domination over 75305436638acc7c010349a69c3395f1a57c642dc62Ying Wang shift after a potential %nonassoc. */ 75405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (find_stable_domination_over_shift) 75505436638acc7c010349a69c3395f1a57c642dc62Ying Wang return ContributionIndex__none; 75605436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!require_split_stable 75705436638acc7c010349a69c3395f1a57c642dc62Ying Wang || AnnotationList__isContributionAlways (self, ci)) 75805436638acc7c010349a69c3395f1a57c642dc62Ying Wang return ContributionIndex__error_action; 75905436638acc7c010349a69c3395f1a57c642dc62Ying Wang find_stable_error_action_domination = true; 76005436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 76105436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Consider this uneliminated contributing reduction in the R/R 76205436638acc7c010349a69c3395f1a57c642dc62Ying Wang comparison. */ 76305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (ci_rr_dominator == ContributionIndex__none) 76405436638acc7c010349a69c3395f1a57c642dc62Ying Wang ci_rr_dominator = ci; 76505436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* If precedence is set for this uneliminated contributing 76605436638acc7c010349a69c3395f1a57c642dc62Ying Wang reduction, it dominates the shift, so try to figure out which 76705436638acc7c010349a69c3395f1a57c642dc62Ying Wang reduction dominates the R/R comparison. */ 76805436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (reduce_precedence) 76905436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 77005436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* It's not possible to find split-stable error action 77105436638acc7c010349a69c3395f1a57c642dc62Ying Wang domination after a potential reduction. */ 77205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (find_stable_error_action_domination) 77305436638acc7c010349a69c3395f1a57c642dc62Ying Wang return ContributionIndex__none; 77405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!require_split_stable) 77505436638acc7c010349a69c3395f1a57c642dc62Ying Wang return ci_rr_dominator; 77605436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!AnnotationList__isContributionAlways (self, 77705436638acc7c010349a69c3395f1a57c642dc62Ying Wang ci_rr_dominator)) 77805436638acc7c010349a69c3395f1a57c642dc62Ying Wang return ContributionIndex__none; 77905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (AnnotationList__isContributionAlways (self, ci)) 78005436638acc7c010349a69c3395f1a57c642dc62Ying Wang return ci_rr_dominator; 78105436638acc7c010349a69c3395f1a57c642dc62Ying Wang find_stable_domination_over_shift = true; 78205436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 78305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 78405436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 78505436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (find_stable_domination_over_shift 78605436638acc7c010349a69c3395f1a57c642dc62Ying Wang || find_stable_error_action_domination) 78705436638acc7c010349a69c3395f1a57c642dc62Ying Wang return ContributionIndex__none; 78805436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* No reduce or error action domination found, so shift dominates. */ 78905436638acc7c010349a69c3395f1a57c642dc62Ying Wang return ci_shift; 79005436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 79105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 79205436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* R/R conflict, so the reduction with the lowest rule number dominates. 79305436638acc7c010349a69c3395f1a57c642dc62Ying Wang Fortunately, contributions are sorted by rule number. */ 79405436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 79505436638acc7c010349a69c3395f1a57c642dc62Ying Wang ContributionIndex ci; 79605436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (ci = 0; ci < self->inadequacyNode->contributionCount; ++ci) 79705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (AnnotationList__stateMakesContribution (self, nitems, ci, 79805436638acc7c010349a69c3395f1a57c642dc62Ying Wang lookaheads)) 79905436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 80005436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (require_split_stable 80105436638acc7c010349a69c3395f1a57c642dc62Ying Wang && !AnnotationList__isContributionAlways (self, ci)) 80205436638acc7c010349a69c3395f1a57c642dc62Ying Wang return ContributionIndex__none; 80305436638acc7c010349a69c3395f1a57c642dc62Ying Wang return ci; 80405436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 80505436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 80605436638acc7c010349a69c3395f1a57c642dc62Ying Wang return ContributionIndex__none; 80705436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 808