more parser conflicts?
Simon Peyton Jones
simonpj at microsoft.com
Mon Dec 15 17:18:25 UTC 2014
It would be great to have a patch that documents all this
Simon
| -----Original Message-----
| From: ghc-devs [mailto:ghc-devs-bounces at haskell.org] On Behalf Of
| Sergei Trofimovich
| Sent: 13 December 2014 15:20
| To: GHC Devs
| Cc: Simon Marlow; Dr. ERDI Gergo; Mike Izbicki
| Subject: Re: more parser conflicts?
|
| On Wed, 03 Dec 2014 11:59:42 +0000
| Simon Marlow <marlowsd at gmail.com> wrote:
|
| > >> In unrelated work, I saw this scroll across when happy'ing the
| parser:
| > >>
| > >>> shift/reduce conflicts: 60
| > >>> reduce/reduce conflicts: 16
| > >>
| > >> These numbers seem quite a bit higher than what I last remember
| > >> (which is something like 48 and 1, not 60 and 16). Does anyone
| know why?
|
| 4 of reduce/reduce conflicts are result of exact rule copy:
| https://phabricator.haskell.org/D569
|
| > reduce/reduce conflicts are bad, especially so since they're
| > undocumented. We don't know whether this introduced parser bugs or
| not.
| > Mike - could you look at this please? It was your commit that
| > introduced the new conflicts.
|
| Agreed.
|
| 11 more reduce/reduce (of left 12) came from single scary rule added
| in
| > commit bc2289e13d9586be087bd8136943dc35a0130c88
| > ghc generates more user-friendly error messages
|
| exp10 :: { LHsExpr RdrName }
| ...
| | 'let' binds {% parseErrorSDoc (combineLocs $1 $2) $ text
| "parse error in let binding: missing
| required 'in'"
| }
|
| The other rules add shift/reduce conflicts as follows:
|
| -- parsing error messages go below here
| {- s/r:1 r/r:0 -}
| | '\\' apat apats opt_asig '->' {% parseErrorSDoc (combineLocs $1
| $5) $ text
| "parse error in
| lambda: no expression after '->'"
| {- s/r:1 r/r:0 -}
| | '\\' {% parseErrorSDoc
| (getLoc $1) $ text
| "parse error:
| naked lambda expression '\'"
| }
| {- s/r:1 r/r:0 -}
| | 'let' binds 'in' {% parseErrorSDoc
| (combineLocs $1 $2) $ text
| "parse error in
| let binding: missing expression after 'in'"
| }
| {- s/r:0 r/r:11 -}
| | 'let' binds {% parseErrorSDoc
| (combineLocs $1 $2) $ text
| "parse error
| in let binding: missing required 'in'"
| }
| {- s/r:0 r/r:0 -}
| | 'let' {% parseErrorSDoc
| (getLoc $1) $ text
| "parse error:
| naked let binding"
| }
| {- s/r:1 r/r:0 -}
| | 'if' exp optSemi 'then' exp optSemi 'else' {% hintIf
| (combineLocs $1 $5) "else clause empty" }
| {- s/r:2 r/r:0 -}
| | 'if' exp optSemi 'then' exp optSemi {% hintIf
| (combineLocs $1 $5) "missing required else clause" }
| {- s/r:1 r/r:0 -}
| | 'if' exp optSemi 'then' {% hintIf
| (combineLocs $1 $2) "then clause empty" }
| {- s/r:2 r/r:0 -}
| | 'if' exp optSemi {% hintIf
| (combineLocs $1 $2) "missing required then and else clauses"
| {- s/r:2 r/r:0 -}
| | 'if' {% hintIf (getLoc
| $1) "naked if statement" }
| {- s/r:0 r/r:0 -}
| | 'case' exp 'of' {% parseErrorSDoc
| (combineLocs $1 $2) $ text
| "parse error
| in case statement: missing list after '->'"
| }
| {- s/r:1 r/r:0 -}
| | 'case' exp {% parseErrorSDoc
| (combineLocs $1 $2) $ text
| "parse error in
| case statement: missing required 'of'"
| }
| {- s/r:1 r/r:0 -}
| | 'case' {% parseErrorSDoc
| (getLoc $1) $ text
| "parse error:
| naked case statement"
| }
|
| Shift/reduces look harmless (like MultiWayIf ambiguity) as they seem
| to resolve as shift correctly.
|
| --
|
| Sergei
More information about the ghc-devs
mailing list