[ragel-users] Some Ragel Ideas

Adrian Thurston thurs... at cs.queensu.ca
Tue Feb 13 16:17:36 UTC 2007

Hi Steve,

> Is this an appropriate place to discuss Kelbt?

Perhaps email is better for now.

> First off, could Ragel be extended to handle tail recursion? Direct
> tail recursion would be sufficient. Indirect tail recursion even
> better, but I imagine quite difficult.

In terms of just purely regular languages .. yes, I would think it would 
be doable. I imagine rewriting of the parse trees would be the proper 
way to do it. However, there might be issues with regards to the 
extensions to the regular language model. The user currently relies on 
the parse tree structure to reason about the order of execution of 
multiple actions on a single transition. Also, the parse tree is very 
important when reasoning about ambiguities. Parse tree rewrites might 
make reasoning about these things harder.

> Second, how about an equivalence assertion operator?

Ragel deals strictly with constructing deterministic state machines 
(that sometimes backtrack). There are many advantages to adhering to 
this model. Generating logic that executes a machine more than once on 
an input or that prints messages is outside of the scope of ragel.

On the other hand, at the machine construction level you could use the 
intersection operator & in Ragel to check if two machines match the same 
set of strings. For example, if two machines are identical then

( m1 | m2 ) - ( m1 & m2 )

should be empty (anyone please correct me if I'm wrong). A person well 
versed in language theory results (not me) would probably point you in 
the right direction.

> Third, Ragel seems to have a lot of cryptic operators. For those of us
> who will only be using it occasionally, it might be a bit more
> friendly if the less standard/obvious ones were given explicitly named
> equivalents. Perhaps something similar to...

Agreed. The operators are cryptic. Over the years I've played with 
various verbose embedding forms. So far nothing promising has been found 
so I've left it out of the docs. My current idea might be the one though.

main := m1 <-embedding_name(action_name)


main := m1 <-embedding_name{code}

This would also support user-defined embedding types, which I think is a 
big win.


More information about the ragel-users mailing list