[ragel-users] Re: Fixing an edge case
Matt Mower
s... at mattmower.com
Tue Jan 16 21:55:12 UTC 2007
Hi Adrian,
Many thanks for the recap :)
On 16/01/07, Adrian Thurston <thurs... at cs.queensu.ca> wrote:
> The following code is one way to fix the problem. It's like the above, but
> separates the leaving/eof actions from the non-empty case. When diff2 exits
> after only a diffHeader the empty diff action is executed. Note that here
> diffHeader is unioned with itself. This relies on the fact that ragel
> removes action duplicates from transition lists. Otherwise the actions of
> diffHeader would be doubled up.
>
> diff2 = (
> diffHeader %empty_diff %/empty_diff |
> diffHeader ( binaryDiff | textDiff )
> );
>
Interesting, so it can track that the leaving action should only
happen when neither of the non-empty diff paths is taken after
reduction? My gut feeling would have been that it would end up
executing them every time. I shall have to graph it and take a look.
> And finally, this is another way to do it. I essentially factor out the
> diffHeader. The "" machine is a single state which has the leaving/eof
> actions embedded into it.
>
> diff3 = (
> diffHeader (
> "" %empty_diff %/empty_diff |
> ( binaryDiff | textDiff )
> )
> );
>
Ah, I think that's more what I was intuitively trying to grasp for. Cool.
Thanks again for your help!
Regards,
Matt
--
Matt Mower :: http://matt.blogs.it/
More information about the ragel-users
mailing list