Hi, Nicolas Pouillard wrote: > On 3/30/07, Hugo Ferreira <[EMAIL PROTECTED]> wrote: >> Hello Nicolas, >> >> Nicolas Pouillard wrote: >> snip.. >>>> let _ = Logic.print term in >>>> ... >>>> and I would like to change that to: >>>> >>>> let _ = Logic.print env term in >>>> ... >>>> where env is declared by the extension. >>>> >>>> Looking at the Pcaml module I would say I am after a Pcaml.expr (Because >>>> at first I thought we have a "let" label here, so this should be it). >>>> >>>> | "expr1" LEFTA >>>> ... >>>> | "let"; OPT "rec"; LIST1 let_binding SEP "and"; "in"; expr LEVEL "top" >>> Please don't do this. Not that way... >>> >>> You should traverse the AST and then substitute function calls. >>> >> Hmm.. I seem to understand less that I imagined about camlp4 (old >> version). The only solution I found was: >> >> Pcaml.expr: LEVEL "apply" [ >> [ e1 = LIDENT; e2 = SELF -> subst_func loc e1 e2 >> | OPT UIDENT ; "." ; e1 = LIDENT; e2 = SELF -> subst_func loc e1 e2 ] >> ]; >> >> where "subst_func loc e1 e2" simply checks for "e1 = print". (Still need >> to work on "OPT UIDENT ; ." to accept only the "Logical" module though.) >> Is this what you mean by traversing the AST? > > No, here you are extending the language to treat differently > something. Some times that's simple enough to be acceptable but > overriding the application rule is not a good idea. >
Ok. I think I get it. What you saying is: don't substitute the parsing/lexing rules themselves, instead match directly against the AST that is provided by the parsed/lexer and then substitute those elements. >>> In the new camlp4 one can do that easily with filters: >>> >>> open Camlp4.PreCast;; >>> AstFilters.register_str_item_filter begin >>> Ast.map_expr begin function >>> | <:[EMAIL PROTECTED]< Logic.print $e$ >> -> <:[EMAIL PROTECTED]< >>> Logic.print env $e$ >> >>> | e -> e >>> end >>> end#str_item;; >>> >> Interesting. Is this all that is needed? > Yes > >> Doesn't one require an EXTEND? > That's my point. > In other words, the parsing/lexing rules are the same. You "just" provide a means to find that part of the AST we are interested in and change that. Which is really what we want. I guess then the philosophy behind the old camlp4 and the new one has changed somewhat. I suspect porting the code may require quite a bit of change. > This << Logic.print expr >> is valid OCaml so you don't need to extend > the syntax. > >> Note that I am stuck with 3.09.3 and the previous version of ocamlp4. > > If so you should look at http://sylvain.le-gall.net/ocaml-ast-analyze.html > That also provides some generic tool to process the AST. > Hmmm... yet another tool. I will try to stick it out otherwise this will never end 8-). >> Now I wonder how much work will be required to port my stuff to the new >> version. > > It depends (but it worths its). > I will wait for 3.10's availability eagerly. >> Venting: Is it just me or is an IQ above 180 required for working with >> camlp4 (and certain Ocaml constructs). Took the whole morning to find >> the solution above! > > You're not alone... Camlp4 is hard to understand... > This coming from you is no solace ;-) Thanks once again. Hugo F. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "ocaml-developer" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/ocaml-developer?hl=en For other OCaml forums, see http://caml.inria.fr/resources/forums.en.html -~----------~----~----~----~------~----~------~--~---
