> Consider the following Haskell 98 expressions:
> 
>       (let x = 10 in x `div`)
>       (let x = 10 in x `div` 3)
> 
> To parse the first, a bottom-up parser should reduce the 
> let-expression
> before the operator, while to parse the second it should shift.
> But it needs 4 tokens of lookahead to decide which to do.  That seems
> unreasonable, and is well beyond the LALR(1) parsers used by 
> Hugs and GHC.
> Replacing `div` by + needs 2 tokens of lookahead, which is 
> still too much.
> I think the first should be made illegal, but can't think of 
> a clean rule.
> (There are similar expressions using lambda and if.)

This is a known problem with the Haskell grammar.  Another example in a similar vein is

        let x = 3 in x == 4 == True

which should parse as

        (let x = 3 in x == 4) == True

according to the "extends as far to the right as possible" rule, because '==' is 
nonfix.  In order to do this, the parser must have access to the fixity information 
for '==', which is unreasonable (fixity declarations can even be local to a binding 
group).  Perhaps it is possible to post-process the parse when the fixities have been 
resolved, but that seems overly complex even if it is possible.

My favourite solution would be to remove the notion of operator precedence from the 
grammar altogether and specify fixity resolution separately.

Cheers,
        Simon
_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to