patch applied (ghc): Fix a bug in alternative layout rule

Simon Marlow marlowsd at gmail.com
Mon Nov 30 04:16:31 EST 2009


On 29/11/2009 19:40, Duncan Coutts wrote:
> On Fri, 2009-11-27 at 10:28 +0000, Simon Marlow wrote:
>> On 26/11/2009 11:50, Ian Lynagh wrote:
>>> Wed Nov 25 15:19:01 PST 2009  Ian Lynagh<igloo at earth.li>
>>>     * Fix a bug in alternative layout rule
>>>
>>>       M ./compiler/parser/Lexer.x +1
>>
>> Great that you've implemented this.  Are you planning to do a proposal
>> for Haskell 2011?
>
>> It doesn't particularly bother me that the simpler rule can't handle
>> some of the obscure cases.
>
> Here's the main one it cannot cope with that bothers me:
>
> foo x = case bar x of
>    Pattern1 ->  ...
>    Pattern1 ->  ...
>
>    where
>      baz = ...
>
> The new layout requires it to be:
>
> foo x = case bar x of
>      Pattern1 ->  ...
>      Pattern1 ->  ...
>    where
>      baz = ...

Right.  That one isn't fixable, because there's no way for the algorithm 
to know that the 'where' should close the layout context introduced by 
the 'case', without knowing more about the syntax.  If we were to keep 
extending the new layout rule to handle more of these cases by adding 
more knowledge about the Haskell grammar, eventually it would be the 
same as the current layout rule.

I'm actually quite surprised how often we really do use the "parse 
error" feature of the current layout rule.

> Another slightly odd one is:
>
>       if p c then do s<- munch p; return (c:s) else pfail
>
> which has to be
>
>       if p c then do s<- munch p; return (c:s)
>              else pfail

This one is fixable: the then/else pair should behave like brackets, so 
that 'else' can close a layout context.

 > So I'm not convinced. If the tradeoff is between ugly code in my
 > modules or the status quo of ugly code in ghc's lexer/parser then I'm
 > happy to stick with the status quo.

The new code isn't really that much simpler, in that it's full of 
special cases.  It is conceptually simpler in the sense that it is an 
independent pass, rather than a collaboration between the parser and lexer.

I think this is a worthwhile experiment.  Various people have said to me 
that implementing the layout rule correctly is a major obstacle in 
building a Haskell implementation.

Cheers,
	Simon



More information about the Cvs-ghc mailing list