[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Aaron Bohannon <bohannon@c...> |
| Subject: | Re: [Caml-list] camlp5/revised syntax questions |
Thanks for your detailed reply. I had a suspicion I would have to
read the source code to get the all of the necessary documentation.
However, I'm still missing some basic point here.
On Wed, Oct 7, 2009 at 4:16 PM, blue storm <bluestorm.dylc@gmail.com> wrote:
> The different "level names" are not absolute among all camlp4 grammars
> : they're a property of each grammar rule of each grammar. If you want
> to "modify" a specific grammar (that is, EXTEND it), you must check
> the different levels available in the definition.
Yes, I understand that. But how do you specify which grammar your
file is extending? My file is structured like this:
#load "pa_extend.cmo";
#load "q_MLast.cmo";
open Pcaml;
EXTEND
GLOBAL: expr;
...
END;
So where did I specify whether I was extending the original syntax or
the revised syntax (or some other grammar entirely)? I suppose I must
have implicitly chosen the original syntax because my code works fine
on that.
> While concrete syntaxes for revised and classical syntax are
> different, the abstract syntax tree is the same. Camlp4 quotations
> works by replacing (using camlp4) the quotation you wrote by the
> concrete ocaml AST representation.
Yes, this point is crystal clear, and I have no problem writing the
quotations in the revised syntax.
> In your specific case, you can parse whatever syntax you want using
> the "<-" operator, then output the corresponding AST using a quotation
> in the revised syntax, that is <:expr< a := b >> (instead of "a <-
> b"). For a reference, see the related rules in etc/pa_o.ml :
>
> | ":=" NONA
> [ e1 = SELF; ":="; e2 = expr LEVEL "expr1" ->
> <:expr< $e1$.val := $e2$ >>
> | e1 = SELF; "<-"; e2 = expr LEVEL "expr1" ->
> <:expr< $e1$ := $e2$ >> ]
Thanks, I found this piece of code. Now on a more specific point, I
am confused about the parsing of record access and update:
1) In the parsing rule for the simple dot noation...
| e1 = SELF; "."; e2 = SELF -> <:expr< $e1$ . $e2$ >> ]
...why is the field label an "expr"? This does not agree with the
OCaml manual, which has a separate syntactic category for "field"
(http://caml.inria.fr/pub/docs/manual-ocaml/expr.html), nor with my
intuition about the meaning of the code.
2) Furthermore, as one can see from the ":=" entry above, the entire
left side of a record update is parsed as its own subexpression. So
this means, that in the context of a record update, that subexpression
has to be interpreted as a reference, but in other contexts, the very
same expression must be interpreted as a value. I don't necessarily
care what kind of magic makes this possible on the back end, but I am
wondering whether this has any implications for modifying the record
syntax.
- Aaron