[ragel-users] Re: Some Ragel Ideas

Adrian Thurston thurs... at cs.queensu.ca
Wed Feb 14 05:31:44 UTC 2007

Hey Steve,

Steve Horne wrote:
> It should be possible to do this without a parse tree rewrite, though
> - think of the recursion as a 'goto' rather than as a structured loop.
> Any tail call results in a special annotation in the state model. When
> this machine gets inserted into the appropriately named larger
> machine, the annotations are detected and result in appropriate
> epsilon -like transitions being added, linking back to the larger
> machines start state. At least, I think that would work.

Ah, I see. Yes I think that could work in Ragel. Indirect recursion 
could be made to work by traversing the machine definition stack upwards 
to search for currently active references "higher up" when the parse 
tree is interpreted.

> Equivalence would be tested as Ragel compiles the machine, and one of
> the two equivalent models would then be discarded. The idea is
> redundant definition with compile-time validation, not a run-time
> mechanism.

Yeah, that could also be made to work. Actions would pose an additional 
challenge, but I don't think they would prevent it from working. If 
you're serious about this talk to me off list and I can give you some 
pointers. The question is whether or not there would be enough of a 
benefit to justify working on it.

> I'm a little confused about user-defined embedding types, though - how
> would they be used?

I'm thinking like this;

embedding buffer_and_exec(m, a) { m >buf_clear $buf_append %a }

main = foo <-buffer_and_exec{ print buf; }


More information about the ragel-users mailing list