minor H98 inconsistency: sections
Ross Paterson
ross@soi.city.ac.uk
Tue, 12 Mar 2002 10:00:15 +0000
The following passages differ on the status of (a+b+):
3 Expressions
aexp -> ...
| ( expi+1 qop(a,i) ) (left section)
| ( qop(a,i) expi+1 ) (right section)
3.5 Sections
Syntactic precedence rules apply to sections as follows. (op e) is
legal if and only if (x op e) parses in the same way as (x op (e));
and similarly for (e op). For example, (*a+b) is syntactically invalid,
but (+a*b) and (*(a+b)) are valid. Because (+) is left associative,
(a+b+) is syntactically correct, but (+a+b) is not; the latter may
legally be written as (+(a+b)).
ghc follows the grammar, rejecting (a+b+)
Hugs accepts (op a op' b) and rejects (a op b op') regardless of
associativity and precedence, while nhc accepts them both.
The grammar could be made to match the text by adding two alternatives:
| ( lexpi qop(l,i) ) (left section)
| ( qop(r,i) rexpi ) (right section)
Changing the text to match the grammar seems less attractive.
But the text says more than the revised grammar. For example, it deals
with the expression glitch I mentioned the other week: together with
the disambiguation meta-rule, it implies that the expression
(let x = 10 in x `div`)
is invalid, because
let x = 10 in x `div` z
doesn't parse as (let x = 10 in x) `div` z
(might be worth adding this as an example)
but it's no help with SimonM's example
let x = 10 in x == x == True