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: Jot Dot
Subject: Re: Possible bug or simple nuisance compiler warning
Date: Fri, 27 Nov 2020 01:52:49 -0700 (MST)

> Have you looked at the examples in examples/c++? 

Yes. I can't see anything I'm doing different in that respect. btw: I've been 
aware of lex/yacc for about 40 years (I'm a fossil) but, up till now, preferred 
hand coding recursive decent parsers. 

> What do you mean by "I added a second error token into a rule"? Could you 
> please show that rule? 

** snip ** 
%start start-rule 

%% 

start-rule: 
{ scanner.yyout << "Version 0.0.1\n\n"; } 
stmts 
{ scanner.yyout << "\n\n*** END\n"; } 
| error// { scanner.yyout << scanner.loc.begin.line << ':' << 
scanner.loc.begin.column << " Syntax Error\n"; } 
/* ^^^^^ First occurance. btw docs refer to this as an error token. */ 
; 

stmts: 
proc_decl 
| CONST_ const_decl 

** snip ** 

const_decl: 
single_const_decl { $$ = $1; } 
| const_decl ';' single_const_decl { $$ = result.makeConstList($1, $3); } 
; 

single_const_decl: 
IDENTIFIER '=' expr { $$ = result.makeConstant($1, $3); } 
/* ^^^^^ Second one causes the issue. Remove it and no warning */ 
; 


> The definition of state_type depends on the grammar. What is your definition? 


It's what ever the default is? I haven't modified it: 
/// Stored state numbers (used for stacks). 
typedef signed char state_type; 

Ahhh!!. I see, by putting in the second error token in the rule, the definition 
for yytable_ changes from an initial 
static const signed char 
to: 
static const short 

where state_type remains as: 
typedef unsigned char state_type; 

Hmm.. a return value of unsigned char but 
if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate) 
return yytable_[yyr]; <<<< const signed char (1 error in rule) vs const short 
(2 error in 2 rules) 
else 
return yydefgoto_[yysym - YYNTOKENS]; <<<<< ******* const signed char both 
tests ******* 

There ya go. 
1) First of all, yydefgoto is signed vs return value of unsigned (potential 
no-no). I hope the table is widened after 127 not 255, Might be an issue. 
2) Definitely when we go to a short for yytable but then casting to unsigned 
char - that could have side effects. Unless the table is limited to 256 
entries. 

No point in widening the yytable entries unless the state_type definition 
changes. yydefgoto_ defn can be potentially a problem too. 

I think this is a possibility of a bug happening here. Just my luck. Things 
like this just always happen to follow me around. 
Well, my 1% odd feeling was onto something but the problem posted in help-bison 
is still there (I've removed the second error token so not to get a warning.) 

Thanks for your time with this. 


From: "Akim Demaille" <akim@lrde.epita.fr> 
To: "Jot Dot" <jotdot@shaw.ca> 
Cc: bug-bison@gnu.org 
Sent: Thursday, November 26, 2020 11:55:31 PM 
Subject: Re: Possible bug or simple nuisance compiler warning 

Hi Jot, 

> Le 27 nov. 2020 à 02:15, Jot Dot <jotdot@shaw.ca> a écrit : 
> 
> While beating my head senseless trying to get my first flex/bison (c++ style) 
> project going, 

Have you looked at the examples in examples/c++? 

> I try to catch some error tokens inside my bison rules to aid me by supplying 
> diagnostic output. 
> I added a second error token into a rule to debug an issue I'm trying to 
> figure out (which I posted in help-bison). 

I have not received your message on help-bison 
(https://lists.gnu.org/r/help-bison/). 

What do you mean by "I added a second error token into a rule"? Could you 
please show that rule? 


> 1>D:\data\c\FlexBisonLoader\My_Parser\parser.cpp(454,26): warning C4244: 
> 'return': conversion from 'const short' to 'gen::Parser::state_type', 
> possible loss of data 
> 
> The following snippet of code in the generated .cpp source file: 
> 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]; <<<<<<<< Warning. 
> } 
> 
> Now this is probably just a nuisance message that can be safely ignored, but 
> I wanted to bring it up to your attention. 
> IMO the return value just needs to be cast to Parser::state_type. 

The definition of state_type depends on the grammar. What is your definition? 


> Also, when I add that extra error line, my app freezes. Now, I'm 99% sure 
> this freeze is from what I'm doing, but that 1% tells me that I've never had 
> this compile issue, It's a bit odd, and this parser is a state engine which 
> might be in the wrong place.. etc. I've already triggered two Microsoft bugs 
> in this single project / endeavour, slowing me down, so now I'm getting a bit 
> paranoid. 

You may want to try another compiler too :) 

> Due to the odd behaviour, I figure I'd run it past you just to make sure. 

Your compiler might be right. I think it's unlikely, but it's possible. To 
understand why it warns, I need the definition of state_type. 

Cheers! 


reply via email to

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