caml-list - the Caml user's mailing list
 help / Atom feed
From: Gabriel Scherer <gabriel.scherer@gmail.com>
To: Jocelyn Sérot <jocelyn.serot@uca.fr>
Cc: caml users <caml-list@inria.fr>
Subject: Re: [Caml-list] Camlp4-free implementation of stream parsers (was camlp4 & OCaml 4.08)
Date: Thu, 25 Jul 2019 13:42:49 +0200
Message-ID: <CAPFanBHeEM_osrF5ue4QO=vLVvNYZi+fywRSHrSzn-C1hSbHpA@mail.gmail.com> (raw)
In-Reply-To: <6300BCD6-A188-46E1-BA13-D9ACBE80FD49@uca.fr>

[-- Attachment #1: Type: text/plain, Size: 5053 bytes --]

Hi,

The parser from
https://github.com/jserot/lascar/blob/master/src/lib/fsm_expr.ml seems
fairly trivial, have you considered just rewriting it to use the functions
of the Stream primitives directly?

For example, roughly (I have not tried to type-check or test the code),

    let rec aux = parser
    | [< 'Int n when n<0; t=aux >] -> [< 'Kwd "-"; 'Int (-n); t >]
    | [< 'h; t=aux >] -> [< 'h; t >]
    | [< >] -> [< >] in

would become

    let aux s =
      let next = ref [] in
      Stream.from @@ fun _ ->
        match !next with
        | tok::toks -> next := toks; Some tok
        | [] -> match Stream.next with
                | exception Stream.Failure -> None
                | Int n when n < 0 ->
                  next := [Int (-n)];
                  Some (Kwd "-")
                | tok -> Some tok

and

    let rec p_exp0  = parser
    | [< 'Int n >] -> EConst n
    | [< 'Ident i >] -> EVar i
    | [< 'Kwd "("; e=p_exp ; 'Kwd ")" >] -> e

becomes

    let rec p_exp0 s = match Stream.next s with
    | Int n -> EConst n
    | Ident i -> EVar i
    | Kwd "(" ->
      let e = p_exp s in
      match Stream.peek s with
      | Some (Kwd ")") -> Stream.junk s; e
      | _ -> raise Stream.Failure

This is not exactly exciting code to write, but it's not a lot of work
either for such a simple grammar.

On Thu, Jul 25, 2019 at 12:28 PM Jocelyn Sérot <jocelyn.serot@uca.fr> wrote:

> HI Daniil,
>
> Thanks for the example. It clearly shows how to embed a Menhir-specified
> parser into an existing program.
>
> I still think, however that using Menhir for parsing arithmetic
> expressions is a bit overkill.
>
> I’m having a look at Angstrom (and all the other parser combinator libs
> cited on the corresp. page).
> It seems simpler.
>
> Jocelyn
>
> Le 24 juil. 2019 à 17:31, Daniil Baturin <daniil@baturin.org> a écrit :
>
> > Hi Jocelyn,
> >
> > I've completed the first version of my project, so now I can start
> > looking into this again!
> >
> > There's a third option: parser combinators like angstrom.
> > My experience with Menhir is very positive though. After initial
> > struggle, I came to like its new incremental API and declarative error
> > reporting.
> >
> > Here's my parser for an extended BNF:
> > Menhir grammar:
> > https://github.com/dmbaturin/bnfgen/blob/master/src/bnf_parser.mly
> > Parser driver that feeds it tokens:
> > https://github.com/dmbaturin/bnfgen/blob/master/src/parse_bnf.ml
> > Error messages:
> > https://github.com/dmbaturin/bnfgen/blob/master/src/bnf_parser.messages
> > Error message module build:
> > https://github.com/dmbaturin/bnfgen/blob/master/src/dune#L6-L8
> >
> > On 7/24/19 10:10 PM, Jocelyn Sérot wrote:
> >> Hi Daniil (and everyone interested by the subject),
> >>
> >> Did you have a closer look at this ?
> >>
> >> I’m still hesitating between these three approaches for replacing the
> implementation of the small arithm expression parser used in Lascar [1] :
> >>
> >> i. rewrite it using the basic fns provided by the Stream library (pro:
> no additionnal dependency, cons: not so trivial..)
> >>
> >> ii. replace camlp4 by camlp5 (pro: straightforward, cons: long term
> maintainability of camlp5 (?))
> >>
> >> iii. rewrite it using ocamlex/menhir and embed it in the main code
> (pro: « standard » soon; cons: a bit heavy)
> >>
> >> Jocelyn
> >>
> >> [1] https://github.com/jserot/lascar/blob/master/src/lib/fsm_expr.ml,
> lines 70–112
> >>
> >> Le 2 juil. 2019 à 11:25, Daniil Baturin <daniil@baturin.org> a écrit :
> >>
> >>> Hi Jocelyn,
> >>> Camlp5 is still sort of maintained, but I don't think it's going to be
> >>> developed beyond compatibility updates.
> >>> For syntax extensions, everyone is switching to PPX.
> >>>
> >>> From a quick look, it seems like the only bit of camlp4 you use is
> >>> stream expressions.
> >>> This is one of the things PPX can't do (on purpose, since it doesn't
> >>> allow _arbitrary_ extensions),
> >>> but I don't think just using streams directly is going to make code
> much
> >>> longer.
> >>>
> >>> Or I missed some other camlp4 bits?
> >>>
> >>> I'm ready to work on a patch if you are open to it.
> >>>
> >>> On 7/2/19 1:44 PM, Jocelyn Sérot wrote:
> >>>> Le 29 juin 2019 à 17:15, Daniil Baturin <daniil@baturin.org> a écrit
> :
> >>>>
> >>>>> Perhaps we should make some coordinated effort to help them.
> >>>>> I've just sent a pull request to the ocamldot maintainer that enables
> >>>>> the graphviz files parsing and printing modules
> >>>>> to build and work with 4.08. The GTK parts have their own issues.
> >>>>> Next I'm going to look into LASCAR/RFSM (packages that interest me
> first ;).
> >>>>>
> >>>> Hi Daniil,
> >>>>
> >>>> I’ve been been thinking of removing the dependency of Lascar and RFSM
> on camlp4 for a while.
> >>>> Is switching to CamlP5 a good alternative ?
> >>>>
> >>>> Jocelyn
> >>>>
> >>>>
> >>>
> >
> >
>
>
>

[-- Attachment #2: Type: text/html, Size: 8298 bytes --]

  reply index

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-27 13:45 [Caml-list] camlp4 & OCaml 4.08 Richard W.M. Jones
2019-06-29  9:06 ` Anil Madhavapeddy
2019-06-29 15:15   ` Daniil Baturin
     [not found]     ` <5CE377AD-CB06-4261-BD26-A2A697253F02@uca.fr>
     [not found]       ` <393603fa-0efa-5714-82da-ba4bc3e869b8@baturin.org>
2019-07-24 15:10         ` [Caml-list] Camlp4-free implementation of stream parsers (was camlp4 & OCaml 4.08) Jocelyn Sérot
2019-07-24 15:31           ` Daniil Baturin
     [not found] <C4399DA5-3383-4A7E-9546-0021083D6EF3@uca.fr>
2019-07-25 10:28 ` Jocelyn Sérot
2019-07-25 11:42   ` Gabriel Scherer [this message]
2019-07-25 15:21     ` Jocelyn Sérot

Reply instructions:

You may reply publically to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAPFanBHeEM_osrF5ue4QO=vLVvNYZi+fywRSHrSzn-C1hSbHpA@mail.gmail.com' \
    --to=gabriel.scherer@gmail.com \
    --cc=caml-list@inria.fr \
    --cc=jocelyn.serot@uca.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

caml-list - the Caml user's mailing list

Archives are clonable: git clone --mirror https://inbox.ocaml.org/caml-list

AGPL code for this site: git clone https://public-inbox.org/ public-inbox