help-bison
[Top][All Lists]
Advanced

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

Re: Resolving shift/reduce conflicts?


From: Christoph Grüninger
Subject: Re: Resolving shift/reduce conflicts?
Date: Sat, 6 Feb 2021 00:28:54 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.6.1

Hi Hans, Evan, Zartaj,

thank you for all the helpful comments! I made some minor clean ups, but
I don't feel confident enough to upstream them.
I played around with semicolons rules as you advised, and I could see
some effect: I ended up having more conflicts :-) I think the problem is
too big for me to address it further at the moment.

Bye
Christoph

Am 02.02.21 um 11:36 schrieb Evan Lavelle:
> I don't know how familiar you are with this, so apologies if I'm stating
> the obvious.
> 
> General observations:
> 
> 1 - start by writing a skeleton with no actions; this makes it easier to
> find conflicts. When you're done, add the actions
> 
> 2 - this is *way*, *way* too verbose. You don't need tokens for ';',
> '{', '}', etc - just write them explicitly in the description; this
> makes it much easier to read. Get rid of all the $<str>$. Move all the
> common body actions out to routines at the bottom of the file, etc.
> yyGetParser->SetCurrentCombine("") is just noise.
> 
> 3 - if you have an optional ';' in your description, try not to repeat
> the body twice, once with a ';', and once without:
> 
> MethodDeclaration
>  : MethodHeader jp_SEMICOL
>  | MethodHeader MethodBody
>  | MethodHeader MethodBody jp_SEMICOL
> 
> this is asking for conflicts, and is too verbose. Try (4) for the
> conflicts, and/or this to reduce verbosity:
> 
> MethodDeclaration
>  : MethodHeader jp_SEMICOL
>  | MethodHeader MethodBody opt_semicolon
> 
> See also ConstructorDeclaration, etc.
> 
> 4 - I think your fundamental problem is that your semicolon handling is
> too complicated; I'm surprised that you only have 4 conflicts. Statement
> terminators are always difficult. My procedure is to move this to the
> top level, as far as possible. I can't easily explain why, but this does
> seem to make it much easier to write without conflicts (and to handle
> error recovery). If you're lucky, you end up with something like this,
> with no other terminators in your description:
> 
> statement
>  : statement_a ';'
>  | statement_b ';'
>  | statement_c ';'
>  | /* empty */ ';'
>  | ...
>  ;
> 
> 5 - turn the counter examples into real source code that demonstrates
> the problem - that makes it much easier for us to see the issue, and may
> make the resolution clearer.
> 

-- 
Als wär es nix, leb' ich von [IT] und mach' nur, was ich lieb'
Lebe wie im Paradies, womit hab' ich das verdient?
Die Wahrheit ist: Hab' ich nicht, ich bin nur reicher beschenkt
Als jemand in einem armen Land mit dem gleichen Talent
[frei nach Tua von Die Orsons - Oioioiropa]



reply via email to

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