H98 Report: expression syntax glitch
Simon Marlow
simonmar@microsoft.com
Mon, 25 Feb 2002 16:27:56 -0000
> Consider the following Haskell 98 expressions:
>=20
> (let x =3D 10 in x `div`)
> (let x =3D 10 in x `div` 3)
>=20
> To parse the first, a bottom-up parser should reduce the=20
> 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=20
> Hugs and GHC.
> Replacing `div` by + needs 2 tokens of lookahead, which is=20
> still too much.
> I think the first should be made illegal, but can't think of=20
> 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 =3D 3 in x =3D=3D 4 =3D=3D True
which should parse as
(let x =3D 3 in x =3D=3D 4) =3D=3D True
according to the "extends as far to the right as possible" rule, because =
'=3D=3D' is nonfix. In order to do this, the parser must have access to =
the fixity information for '=3D=3D', 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