bug-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Possible bug or simple nuisance compiler warning


From: Akim Demaille
Subject: Re: Possible bug or simple nuisance compiler warning
Date: Mon, 30 Nov 2020 07:19:38 +0100

Hi Jot,

> Le 29 nov. 2020 à 09:33, Akim Demaille <akim@lrde.epita.fr> a écrit :
> 
> Hi Jot,
> 
>> Le 29 nov. 2020 à 02:12, Jot Dot <jotdot@shaw.ca> a écrit :
>> 
>> Let me know if you still want that file. 
> 
> I do.  Thanks!

So Jot sent me his file privately, and the relevant parts are:

    /// Stored state numbers (used for stacks).
    typedef unsigned char state_type;

   Parser ::state_type
   Parser ::yy_lr_goto_state_ (state_type yystate, int yysym)
  {
    int yyr = yypgoto_[yysym - YYNTOKENS] + yystate;
    if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
      return yytable_[yyr];
    else
      return yydefgoto_[yysym - YYNTOKENS];
  }

  const signed char
   Parser ::yydefgoto_[] =
  {
      -1,     2,     3,    10,    11,    19,    20,    21,    22,    63,
      64,    65,    12,    27,    41,    75,    76,    15,    16,    24,
      25,    52,    53,    54
  };

Jot's compiler's warning is about yy_lr_goto_state_ returning a signed char 
(from yydefgoto_) as an unsigned_char (state_type).

One can see that, except for the first value, everything in yydefgoto fits 
within an unsigned char (state_type).  The semantics of yydefgoto is to map a 
nonterminal to a state (to implement the "goto" phase of a reduction).  The 
table is indexed by the nonterminal number, starting at 0 for the first 
nonterminal: $accept.  The special nonterminal is never actually reduced, since 
reducing to $accept is actually accepting the input (returning successfully 
from yyparse).  So we actually _never_ use slot 0 of yydefgoto.

Therefore:
1. the compiler is right, a cast would be nice to avoid this warning.
2. it's actually a pity to use -1 here to mean "invalid value".

I won't address (1), I think it's better to address (2) by using 0 instead of 
-1, which in this precise case would result in the use of "unsigned char 
yydefgoto", i.e., the very same type as state_type.

In the case of Bison's parser itself, it will even allow to use smaller int 
types (unsigned char instead of int16):

  /* YYDEFGOTO[NTERM-NUM].  */
static const yytype_int16 yydefgoto[] =
{
      -1,     1,     2,    43,    81,   115,    76,    45,    83,    46,
      50,    49,    51,    47,    60,   158,   120,   121,   122,    96,
      92,    93,    94,   128,   142,    86,    87,    88,    99,    70,
      77,    78,    79,   136,   146,   147,   113,    55,   105,    71,
      80,    72,    73,   111
};


Thanks Jot for reporting this warning.

Cheers!


reply via email to

[Prev in Thread] Current Thread [Next in Thread]