Re: [PATCH] style: decouple different uses of item_number

Akim Demaille <[email protected]>
Newsgroups gmane.comp.parsers.bison.patches
Message-ID <[email protected]>

> Le 25 mai 2020 à 14:41, Vincent Imbimbo <[email protected]> a écrit :
> 
> Hey Akim,
> 
> I'm confused about these item_indices you've changed to item_number, since
> state->items is an array of item_indices.

Hi Vincent,

My turn to be confused: what you show is going from item_number to index.
Maybe you're showing the diff in your repo instead of quoting my patch?
Here it is.

> diff --git a/src/closure.c b/src/closure.c
> index 94439b13..ee0c9d4a 100644
> --- a/src/closure.c
> +++ b/src/closure.c
> @@ -60,10 +60,10 @@ closure_print (char const *title, item_index const *array, size_t size)
>    for (size_t i = 0; i < size; ++i)
>      {
>        fprintf (stderr, "  %2d: .", array[i]);
> -      item_index *rp;
> -      for (rp = &ritem[array[i]]; *rp >= 0; ++rp)
> +      item_number *rp;
> +      for (rp = &ritem[array[i]]; 0 <= *rp; ++rp)

rp is clearly iterating on ritem, which is a an array of item_numbers.

>          fprintf (stderr, " %s", symbols[*rp]->tag);
> -      fprintf (stderr, "  (rule %d)\n", -*rp - 1);
> +      fprintf (stderr, "  (rule %d)\n", item_number_as_rule_number (*rp));
>      }
>    fputs ("\n\n", stderr);
>  }
> diff --git a/src/gram.h b/src/gram.h
> index a4b58f0a..77fc7699 100644
> --- a/src/gram.h
> +++ b/src/gram.h
> @@ -111,14 +111,15 @@ extern int nsyms;
>  extern int ntokens;
>  extern int nvars;
>  
> -/* elements of ritem */
> +/* Elements of ritem. */
>  typedef int item_number;
> -/* indices into ritem */
> -typedef int item_index;
>  # define ITEM_NUMBER_MAX INT_MAX
>  extern item_number *ritem;
>  extern int nritems;
>  
> +/* Indices into ritem. */
> +typedef unsigned int item_index;
> +
>  /* There is weird relationship between OT1H item_number and OTOH
>     symbol_number and rule_number: we store the latter in
>     item_number.  symbol_number values are stored as-is, while
> diff --git a/src/ielr.c b/src/ielr.c
> index f86cd461..47ac714a 100644
> --- a/src/ielr.c
> +++ b/src/ielr.c
> @@ -1030,7 +1030,7 @@ ielr_split_states (bitsetv follow_kernel_items, bitsetv always_follows,
>          if (!node->state->consistent)
>            {
>              size_t i = 0;
> -            item_number *itemset = node->state->items;
> +            item_index *itemset = node->state->items;

struct state is:


struct state
{
  state_number number;
...
  /* Its items.  Must be last, since ITEMS can be arbitrarily large.  Sorted
     ascendingly on item index in RITEM, which is sorted on rule number.  */
  size_t nitems;
  item_index items[1];
};

So my change is consistent with yours.  And indeed it seems to be correct,
since, for instance:



>              for (size_t r = 0; r < node->state->reductions->num; ++r)
>                {
>                  rule *this_rule = node->state->reductions->rules[r];
> diff --git a/src/print-xml.c b/src/print-xml.c
> index a44af211..168d6bd5 100644
> --- a/src/print-xml.c
> +++ b/src/print-xml.c
> @@ -57,7 +57,7 @@ static struct escape_buf escape_bufs[num_escape_bufs];
>  static void
>  print_core (FILE *out, int level, state *s)
>  {
> -  item_number *sitems = s->items;
> +  item_index *sitems = s->items;
>    size_t snritems = s->nitems;
>  
>    /* Output all the items of a state, not only its kernel.  */


this continues with:

  /* Output all the items of a state, not only its kernel.  */
  closure (sitems, snritems);
  sitems = itemset;
  snritems = nitemset;

  if (!snritems)
    {
      xml_puts (out, level, "<itemset/>");
      return;
    }

  xml_puts (out, level, "<itemset>");

  for (size_t i = 0; i < snritems; i++)
    {
      bool printed = false;
      item_number *sp1 = ritem + sitems[i];
      rule const *r = item_rule (sp1);
      item_number *sp = r->rhs;

so indeed, sitems[i] is used as an index inside ritem, so it's an index.



> diff --git a/src/print.c b/src/print.c
> index 720740ee..1da0f9dd 100644
> --- a/src/print.c
> +++ b/src/print.c
> @@ -61,7 +61,7 @@ max_length (size_t *width, const char *str)
>  static void
>  print_core (FILE *out, state *s)
>  {
> -  item_number *sitems = s->items;
> +  item_index *sitems = s->items;
>    size_t snritems = s->nitems;
>    /* Output all the items of a state, not only its kernel.  */
>    if (report_flag & report_itemsets)



So I don't understand what is the problem you noticed.  You'll have to be more
specific, I don't see it :(

Cheers!
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.