[ragel-users] How to look ahead

Adrian Thurston thurs... at cs.queensu.ca
Wed Jan 30 04:06:06 UTC 2008

Hey Jason,

Generally I do lookahead by moving p backwards. This should work even in
scanner actions (requires a recent version of Ragel). Can you give some
code that doesn't do what you expect? I don't understand exactly what
you're trying to do.


Jason Garber wrote:
> Hello Ragel users,
> I'm working on SuperRedCloth (a Ragel implementation of RedCloth that
> why the lucky stiff started awhile back).  I've run into some trouble
> and could use some help.
> In the inline scanner, we want the dimension rule to parse "1 x 2."
> and then the formatter outputs it as "1 × 2."  As it was:
> dim = ( digit+ >A %{ STORE(x) } " x " digit+ >A %{ STORE(y) } ) >X ;
> (where A registers the start of the string to capture and STORE
> captures it.  See
> http://code.whytheluckystiff.net/redcloth/browser/branches/superredcloth/ext/superredcloth_scan/superredcloth_inline.rl
> if you need more context.)
> But, since it was in a scanner and it had to entertain the possibility
> that the pattern was starting over (I assume), the STORE(y) action
> would never happen, so you'd get "1 × ."
> Assuming you can't have leaving actions at the end of a pattern in a
> scanner, I considered (with the help of Johan Sørensen) looking ahead
> for a digit but not consuming it, so with "1 x 2." the "1 x" is handed
> to the formatter and the rest is handled by the default pattern (not
> stored).  This gives the additional advantage of being able to parse
> something like "1 x 2 x 3 x 4."
> The question is, how to look ahead?  I've tried all kinds of things
> with fhold, p--, etc., but it seems I'm at the limit of my Ragel
> comprehension.  Or is there a better way than look-ahead?
> Thanks in advance!
> Jason Garber
> > 

More information about the ragel-users mailing list