H98 Report: expression syntax glitch

Arthur Baars [email protected]
Wed, 27 Feb 2002 16:00:39 +0100


In the context-free grammar proposed by Ross Paterson
the following line:
  expix -> expi+1B [qop(n,i) expi+1x]

should be replaced by
  expix -> [expi+1B qop(n,i)] expi+1x

Without this modification a single exp10A-expression can not be derived from
the nonterminal exp.

Apart from this small mistake, I think that the proposed grammar correctly
specifies the language we want.

Cheers Arthur

On 27-02-2002 11:42, "Ross Paterson" <[email protected]> wrote:

> OK, so you have a context-free grammar qualified by a rule forbidding
> some of the derivations of that grammar.
> 
> Another solution would be to subdivide exp^10 using a superscript I've
> called A or B from lack of imagination:
> 
>  exp10A -> \ apat[1] ... apat[n] -> exp    (lambda abstraction, n>=1)
>          | let decls in exp            (let expression)
>          | if exp then exp else exp        (conditional)
>  exp10B -> case exp of { alts }        (case expression)
>          | do { stmts }            (do expression)
>          | fexp
> 
> Only the latter sort can be followed by infix operators or type signatures.
> We could extend the distinction to the exp^i (here x ranges over {A,B}):
> 
>  exp -> exp0B :: [context =>] type        (expression type signature)
>       | exp0
>  expi -> expiA
>        | expiB
>  expix -> expi+1B [qop(n,i) expi+1x]
>         | lexpix
>         | rexpix
>  lexpix -> (lexpiB | expi+1B) qop(l,i) expi+1x
>  lexp6x -> - exp7x
>  rexpix -> expi+1B qop(r,i) (rexpix | expi+1x)
> 
> and the rules for sections would be
> 
>  aexp -> ...
>        | ( expi+1B qop(a,i) )            (left section)
>        | ( qop(a,i) expi+1 )            (right section)
> 
> It's complicated, but it does at least specify precisely the language
> and parses we want in a single context-free description.