Re: Web IDL parser for Guile (was: Re: [ANN] Hoot 0.6.1 released!)

Daniel Skinner <[email protected]> Fri, 6 Jun 2025 14:57:38 -0500
Newsgroups gmane.lisp.guile.user
Message-ID <CAJ7_s+K0SStFssD8ZWVFm_r0WNQyzTkmbBBUA_TVb897V7zDfA@mail.gmail.com>
Just a cursory glance over the lexer and this looks proper. Hopefully I can
make time to play with the parser results over the weekend.

Thanks!

On Fri, Jun 6, 2025, 2:36 PM Ricardo G. Herdt <[email protected]> wrote:

> Hi,
>
> Motivated by this discussion I took the chance to have some fun writing
> parsers and
> wrote one for Web IDL files in Guile:
>
> https://codeberg.org/rgherdt/webidl-parser
>
> Actually there are two parsers involved. The first reads the
> WebIDL-grammar and generates parts of
> the main parser for IDL files. But that's an implementation detail :) .
> See README.md.
>
> For now the result is an s-expression based parse tree, with some
> simplifications to make
> working with it easier. I could develop it further to simplify even more
> or help generating
> bindings or something like that. If you have ideas of what target
> bindings could look like let me know. Right
> now I'm not sure what information of IDL-described APIs are relevant for
> binding generation, so I will
> postpone work on it until needed.
>
> I did some tests with IDL references from
> https://github.com/w3c/webref/tree/curated. Most of them
> work, with two exceptions due a possible inconsistency in the spec, as
> noted in my README.
> Solving it should be trivial though. Some IDLs I got from Gecko are
> problematic, since they have #ifdef
> directives and stuff like that, which are not expected by the grammar.
> Adapting the lexer shouldn't be difficult,
> just let me know if that's needed.
>
> Have a nice weekend,
>
> Ricardo Herdt
>
>
> Am 20.05.2025 15:10 schrieb Daniel Skinner:
> > As I understand it, type resolution for method dispatching would need
> > to
> > happen at runtime. When I benchmarked this for a macro I was
> > experimenting
> > with that expanded to type switching between fibers signal and fibers
> > channel, I found the cost non-trivial. I don't know enough about the
> > macro
> > system to know if that can be accomplished at compile time. Because of
> > that, I think giving someone the option to import the 1:1 binding via
> > some
> > mechanism is important.
> >
> > I took approach of just appending argument arity to function names but
> > I
> > would be curious what the distinct argument aritys are that actually
> > have
> > overloads. For example, if it is always n=1 then I would be comfortable
> > making a not-necessarily-future-proof choice of just specifying the arg
> > type as part of the ffi export name. Preferably this entire file
> > doesn't
> > require hand editing.
> >
> > Additionally, methods need to be bound as well for externs from the
> > currently parsed idl; this isn't being done at all currently.
> >
> > From there, I would see a hand edited file that provided a nicer api
> > that
> > can expose and rename however and provide runtime method overloading if
> > desired. This part becomes more artistic and higher variety in opinion.
> >
> > For example, fill-style has overloads for rgba string and for gradient
> > object. Some options might be:
> >
> > * provide an overloaded fill-style
> > * provide fill-style-string and fill-style-gradient
> > * provide the idea of (color arg) and color just knows how to apply
> > itself
> > as a (fill-style) under the correct syntactic context so none of the
> > normal
> > stuff is necessarily exposed
> >
> > None of those choices are necessarily correct so I would consider it a
> > goal
> > to have the ffi.scm generated to not require hand editing based on
> > conventions informed by a little up front research so that people might
> > be
> > able to pursue their own ideas separate to whatever nicer api is built
> > on
> > top of ffi.scm
> >
> > On Mon, May 19, 2025, 1:25 PM Thompson, David
> > <[email protected]>
> > wrote:
> >
> >> Hey Daniel,
> >>
> >> On Mon, May 12, 2025 at 1:48 PM Daniel Skinner <[email protected]> wrote:
> >> >
> >> > I wrote a very haphazard idl parser during the last lisp game jam. I
> >> dont recommend using it for a number of reasons (for one, I don't have
> >> experience in designing scheme libraries for reuse) but it was enough
> >> to
> >> identify a few interesting questions that cropped up then and (during
> >> the
> >> current game jam) related to method overloading.
> >> >
> >> >
> >>
> https://codeberg.org/dskinner/shields-tyvm/src/branch/main/modules/dom/canvas
> >> >
> >> > Until i decided how to handle, i opted for some final hand editing to
> >> remove overloads and such.
> >> >
> >> > This generates the scheme and a JavaScript object to merge with custom
> >> module object when loading the wasm module.
> >> >
> >> > I ripped off some other parser pattern doing regex from something I
> >> think you wrote somewhere since it was quick and easy to do in context
> >> of a
> >> jam, but if doing proper i would want to write an actual lexer/parser
> >> which
> >> is well out of scope for something that could be done during a jam (or
> >> maybe there's a bison idl to leverage, but I don't have any experience
> >> with
> >> that sort of thing).
> >>
> >> Thanks for sharing this! Glad to know you have already been
> >> experimenting with WebIDL + Hoot. Seems like a good start to me!
> >>
> >> Method overloading is a tricky thing. We'd either have to embrace it
> >> and generate a single procedure that bakes in all the type dispatching
> >> or somehow generate one distinctly named procedure per overload. For
> >> the latter case, you'd probably want to hand edit the generated names.
> >> On the WebAssembly side, you'd need to generate a function per
> >> overload anyway because functions do not support variable length
> >> argument lists. Without thinking too hard about it, I think I could
> >> live with some amount of hand editing because compiling WebIDL is
> >> mostly a one-time process to reduce tedious work.
> >>
> >> - Dave
> >>
>