help-bison
[Top][All Lists]
Advanced

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

Re: Resolving shift/reduce conflicts?


From: Zartaj Majeed
Subject: Re: Resolving shift/reduce conflicts?
Date: Tue, 2 Feb 2021 17:23:27 -0500
User-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.7.0

I reran the full counterexamples report with the latest bison:

bison -Wcounterexamples --report=counterexamples --report-file=bisonreport.txt cmDependsJavaParser.y

the counterexamples now show rule numbers too

cmDependsJavaParser.y: warning: 4 shift/reduce conflicts [-Wconflicts-sr]
cmDependsJavaParser.y: warning: shift/reduce conflict on token jp_SEMICOL [-Wcounterexamples]
  Example: ClassBodyDeclarations MethodHeader MethodBody • jp_SEMICOL
  Shift derivation
    ClassBodyDeclarations
    ↳ 79: ClassBodyDeclarations ClassBodyDeclaration
                                ↳ 80: ClassMemberDeclaration
                                      ↳ 85: MethodDeclaration
                                            ↳ 97: MethodHeader MethodBody • jp_SEMICOL
  Example: ClassBodyDeclarations MethodHeader MethodBody • jp_SEMICOL
  Reduce derivation
    ClassBodyDeclarations
    ↳ 79: ClassBodyDeclarations ClassBodyDeclaration
          ↳ 79: ClassBodyDeclarations ClassBodyDeclaration                        ↳ 83: TypeDeclaration                                       ↳ 80: ClassMemberDeclaration                      ↳ 52: jp_SEMICOL
                                            ↳ 85: MethodDeclaration
                                                  ↳ 96: MethodHeader MethodBody •

this was the first of 4 conflicts

btw I think the report displays some conflicts twice - looks like a bug to me but not relevant here

rules 96 and 97 from the report are:

95 MethodDeclaration: MethodHeader jp_SEMICOL
96                  | MethodHeader MethodBody
97                  | MethodHeader MethodBody jp_SEMICOL

I know you said you understand the issue but I'll just point it out for anyone else looking for help

the issue is the semicolon can be handled by a reduce in rule 96 then process lookahead - or shift the semicolon

the rules seem to be for an optional semicolon - but they are ambiguous

If we say in the absence of a semicolon MethodBody is terminated by the end of line - you could fix the ambiguity by introducing an EOL token and changing rule 96 to:

96                  | MethodHeader MethodBody EOL

I looked at the other 3 conflicts too - I think these too can be fixed by eliminating or modifying some of the rules involved but needs familiarity with the semantics of the grammar


On 2/2/2021 1:50 AM, Christoph Grüninger wrote:
Dear Bisons,

I have another issue within the CMake parser code. When using the
attached cmDependsJavaParser.y with Bison 3.7.5, i get the following
warning: 4 shift/reduce conflicts [-Wconflicts-sr]. When adding
-Wcounterexamples I get the output below. Ok, I understand the issue and
Bison is right.
But what should I do to get rid of the problem?

Bye
Christoph


bison --name-prefix=cmDependsJava_yy
--defines=cmDependsJavaParserTokens.h -Wcounterexamples
-ocmDependsJavaParser.cxx cmDependsJavaParser.y
cmDependsJavaParser.y: warning: 4 shift/reduce conflicts [-Wconflicts-sr]
cmDependsJavaParser.y: warning: shift/reduce conflict on token
jp_SEMICOL [-Wcounterexamples]
   Example: ClassBodyDeclarations MethodHeader MethodBody . jp_SEMICOL
   Shift derivation
     ClassBodyDeclarations
     `-> ClassBodyDeclarations ClassBodyDeclaration
                               `-> ClassMemberDeclaration
                                   `-> MethodDeclaration
                                       `-> MethodHeader MethodBody .
jp_SEMICOL
   Reduce derivation
     ClassBodyDeclarations
     `-> ClassBodyDeclarations
ClassBodyDeclaration
         `-> ClassBodyDeclarations ClassBodyDeclaration
`-> TypeDeclaration
                                   `-> ClassMemberDeclaration
     `-> jp_SEMICOL
                                       `-> MethodDeclaration
                                           `-> MethodHeader MethodBody .
cmDependsJavaParser.y: warning: shift/reduce conflict on token jp_DOT
[-Wcounterexamples]
   Example: jp_THIS . jp_DOT Identifier
   Shift derivation
     FieldAccess
     `-> jp_THIS . jp_DOT Identifier
   Reduce derivation
     FieldAccess
     `-> Primary               jp_DOT Identifier
         `-> PrimaryNoNewArray
             `-> jp_THIS .
cmDependsJavaParser.y: warning: shift/reduce conflict on token jp_DOT
[-Wcounterexamples]
   Example: jp_THIS . jp_DOT Identifier jp_PARESTART jp_PAREEND
   Shift derivation
     MethodInvocation
     `-> jp_THIS . jp_DOT Identifier jp_PARESTART ArgumentListopt jp_PAREEND
                                                  `-> %empty
   Reduce derivation
     MethodInvocation
     `-> Primary               jp_DOT Identifier jp_PARESTART
ArgumentListopt jp_PAREEND
         `-> PrimaryNoNewArray                                `-> %empty
             `-> jp_THIS .
cmDependsJavaParser.y: warning: shift/reduce conflict on token
jp_SEMICOL [-Wcounterexamples]
   Example: ClassBodyDeclarations Modifiersopt ConstructorDeclarator
Throwsopt ConstructorBody . jp_SEMICOL
   Shift derivation
     ClassBodyDeclarations
     `-> ClassBodyDeclarations ClassBodyDeclaration
                               `-> ConstructorDeclaration
                                   `-> Modifiersopt ConstructorDeclarator
Throwsopt ConstructorBody . jp_SEMICOL
   Reduce derivation
     ClassBodyDeclarations
     `-> ClassBodyDeclarations
                                  ClassBodyDeclaration
         `-> ClassBodyDeclarations ClassBodyDeclaration
                                  `-> TypeDeclaration
                                   `-> ConstructorDeclaration
                                      `-> jp_SEMICOL
                                       `-> Modifiersopt
ConstructorDeclarator Throwsopt ConstructorBody .
cmDependsJavaParser.y: warning: shift/reduce conflict on token jp_DOT
[-Wcounterexamples]
   Example: jp_THIS . jp_DOT Identifier
   Shift derivation
     FieldAccess
     `-> jp_THIS . jp_DOT Identifier
   Reduce derivation
     FieldAccess
     `-> Primary               jp_DOT Identifier
         `-> PrimaryNoNewArray
             `-> jp_THIS .
cmDependsJavaParser.y: warning: shift/reduce conflict on token jp_DOT
[-Wcounterexamples]
   Example: jp_THIS . jp_DOT Identifier jp_PARESTART jp_PAREEND
   Shift derivation
     MethodInvocation
     `-> jp_THIS . jp_DOT Identifier jp_PARESTART ArgumentListopt jp_PAREEND
                                                  `-> %empty
   Reduce derivation
     MethodInvocation
     `-> Primary               jp_DOT Identifier jp_PARESTART
ArgumentListopt jp_PAREEND
         `-> PrimaryNoNewArray                                `-> %empty
             `-> jp_THIS .


reply via email to

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