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