Trying to use mutually recursive values don't compile, giving the error:

syntax error: replacing  AND with  UNDER
Parse failure
----------

Here is a sample to try with:

  val rec even (i:int) = if i = 0 then True
                       else if i > 0 then odd (i -1)
                       else error <xml>error: negative input</xml>

  and val rec odd (i:int) = if i = 0 then False
                          else if i > 0 then even (i -1)
                          else error <xml>error: negative input</xml>

(* --- *)

I have found the syntax problem in urweb.grm in the non-terminal production "valis" used in declarations (decl production) and local declarations (edecl production).

decl   :...
       | VAL REC valis
       | FUN valis

vali   : SYMBOL eargl2 copt EQ eexp

valis  : vali                           ([vali])
       | vali AND valis                 (vali :: valis)

----------

A simple working patch:

valis  : vali                           ([vali])
       | vali AND VAL REC valis         (vali :: valis)
       | vali AND FUN valis             (vali :: valis)


But it is recommended to avoid right recursion in LR grammars because of rightmost derivation [1], so another tested proposal is

valis  : vali                           ([vali])
       | valis AND VAL REC vali         (valis @ [vali])
       | valis AND FUN vali             (valis @ [vali])


-------------
[1] Lex-YACC-HOWTO - 6.2 Recursion: 'right is wrong' (http://tldp.org/HOWTO/Lex-YACC-HOWTO-6.html#ss6.2)


_______________________________________________
Ur mailing list
[email protected]
http://www.impredicative.com/cgi-bin/mailman/listinfo/ur

Reply via email to