Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Caml-list] Camlp4 as a universal pre-processor ?

11 views
Skip to first unread message

David Teller

unread,
Oct 23, 2007, 1:55:05 AM10/23/07
to OCaml
Hello list,
I'm currently playing with camlp4 3.10. I've succeeded in making a
syntax extension to help me generate annotated trees, which is a good
start.

Now, I understand that, by invoking ocpp, camlp4 may be used as a
pre-processor for non-OCaml language, which sounds interesting, for I
have need of pre-processing some parser generator input (at the moment,
menhir, but there are good chances I'll switch to Dypgen to get around
some limitations) to maintain consistency between the implementation and
the specifications. There are very good chances that I could do that
with cpp, as it's essentially trivial pre-processing, but I'd rather use
camlp4, if only to learn more about it.

So, my question is: how do I write a pre-processor that doesn't depend
on the syntax of OCaml ? I'm hoping I can get away with one or two
quotations and one anti-quotation, but I have no clue how to register
these without adding dependencies to either OCaml's Original or Revised
syntax. Does anyone have any examples handy ?

Thanks,
David

--
David Teller ------------------------------------------
Security of Distributed Systems -----------------------
Project JStify: Static Analysis for JavaScript 2 -----
-- http://www.univ-orleans.fr/lifo/Members/David.Teller
----- Laboratoire d'Informatique Fondamentale d'Orleans

_______________________________________________
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs

Nicolas Pouillard

unread,
Oct 23, 2007, 5:40:46 AM10/23/07
to David Teller, caml-list
Excerpts from David Teller's message of Tue Oct 23 07:54:33 +0200 2007:

> Hello list,
> I'm currently playing with camlp4 3.10. I've succeeded in making a
> syntax extension to help me generate annotated trees, which is a good
> start.
>
> Now, I understand that, by invoking ocpp, camlp4 may be used as a
> pre-processor for non-OCaml language, which sounds interesting, for I
> have need of pre-processing some parser generator input (at the moment,
> menhir, but there are good chances I'll switch to Dypgen to get around
> some limitations) to maintain consistency between the implementation and
> the specifications. There are very good chances that I could do that
> with cpp, as it's essentially trivial pre-processing, but I'd rather use
> camlp4, if only to learn more about it.
>
> So, my question is: how do I write a pre-processor that doesn't depend
> on the syntax of OCaml ? I'm hoping I can get away with one or two
> quotations and one anti-quotation, but I have no clue how to register
> these without adding dependencies to either OCaml's Original or Revised
> syntax. Does anyone have any examples handy ?

A way to start this is to just keep the lexer and provide a new grammar
including quotations [2] and antiquotations. On the wiki [1] there is also a
small but complete example of a grammar for the untyped lambda calculus with
antiquotations [3], and also a tutorial of making a full parser with Camlp4 [4].

[1]: http://brion.inria.fr/gallium/index.php/Camlp4
[2]: http://brion.inria.fr/gallium/index.php/Quotation
[3]: http://brion.inria.fr/gallium/index.php/Lambda_calculus_quotations
[4]: http://brion.inria.fr/gallium/index.php/Full_parser_tutorial
--
Nicolas Pouillard aka Ertai

David Teller

unread,
Oct 23, 2007, 6:34:49 AM10/23/07
to Nicolas Pouillard, caml-list
I've read the Lambda example, but it looked to me like it was a syntax
extension for OCaml and no other language, unless I completely
misunderstand the meaning of, say, <:expr<...>> .

Now, do you suggest I should write a full lexer and parser with Camlp4
just in order to write simple macros ?

Cheers,
David

On Tue, 2007-10-23 at 11:39 +0200, Nicolas Pouillard wrote:
> A way to start this is to just keep the lexer and provide a new grammar
> including quotations [2] and antiquotations. On the wiki [1] there is also a
> small but complete example of a grammar for the untyped lambda calculus with
> antiquotations [3], and also a tutorial of making a full parser with Camlp4 [4].
>
> [1]: http://brion.inria.fr/gallium/index.php/Camlp4
> [2]: http://brion.inria.fr/gallium/index.php/Quotation
> [3]: http://brion.inria.fr/gallium/index.php/Lambda_calculus_quotations
> [4]: http://brion.inria.fr/gallium/index.php/Full_parser_tutorial
--

David Teller ------------------------------------------
Security of Distributed Systems -----------------------
Project JStify: Static Analysis for JavaScript 2 -----
-- http://www.univ-orleans.fr/lifo/Members/David.Teller
----- Laboratoire d'Informatique Fondamentale d'Orleans

_______________________________________________

Nicolas Pouillard

unread,
Oct 24, 2007, 9:24:39 AM10/24/07
to David Teller, caml-list
Excerpts from David Teller's message of Tue Oct 23 12:34:15 +0200 2007:

> I've read the Lambda example, but it looked to me like it was a syntax
> extension for OCaml and no other language, unless I completely
> misunderstand the meaning of, say, <:expr<...>> .

You're right the lambda example is not adapted.

> Now, do you suggest I should write a full lexer and parser with Camlp4
> just in order to write simple macros ?

Hum, in fact that's because ocpp is no longer supported in Camlp4 3.10
(another (external) tool that can replace it is in preparation).

However writing a small lexer that catch some quotation of yours is quite
simple; but since you where talking about menhir and dypgen they certainly
have lexing conventions quite close to OCaml, so the default lexer should
suffice.

It's mainly about writing a parser that search for some QUOTATION tokens and
expand them, in fact it will be even simpler to directly use a stream parser.

(* pseudo untested code *)
let rec go = parse
| [< '(QUOTATION q, _loc); strm >] -> expand q; go strm
| [< '(token, _loc); strm >] -> Token.<some function> tok; go strm
| [< >] -> ()

> On Tue, 2007-10-23 at 11:39 +0200, Nicolas Pouillard wrote:
> > A way to start this is to just keep the lexer and provide a new grammar
> > including quotations [2] and antiquotations. On the wiki [1] there is also a
> > small but complete example of a grammar for the untyped lambda calculus with
> > antiquotations [3], and also a tutorial of making a full parser with Camlp4 [4].
> >
> > [1]: http://brion.inria.fr/gallium/index.php/Camlp4
> > [2]: http://brion.inria.fr/gallium/index.php/Quotation
> > [3]: http://brion.inria.fr/gallium/index.php/Lambda_calculus_quotations
> > [4]: http://brion.inria.fr/gallium/index.php/Full_parser_tutorial

--
Nicolas Pouillard aka Ertai

0 new messages