<br><br><div class="gmail_quote">On Mon, Jan 23, 2012 at 11:11 AM, Gerald Gutierrez <span dir="ltr"><<a href="mailto:gerald.gutierrez@gmail.com">gerald.gutierrez@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hello folks,<br>
<br>
I recently found Ragel and have discovered that it is a very pleasant<br>
piece of software. That said, I've run into a problem that I was<br>
hoping is common and a solution available.<br>
<br></blockquote><div>Sadly the problem is common but solution is quite explicitly is NOT available.<br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

Please see the example code at <a href="https://gist.github.com/1661150" target="_blank">https://gist.github.com/1661150</a>.<br>
<br>
Basically, I'd like to parse the following:<br>
<br>
name:name<br>
<br>
where the names start and end with an alnum, and can contain any<br>
combination of alnum and spaces inside. They could also be blank. My<br>
rules for this are:<br>
<br>
identifier = alnum (space* alnum)*;<br>
name       = (identifier | zlen) >sName $pName %fName;<br>
<br>
The names can be separated by a colon and optionally spaces inbetween<br>
the names and the colon. My rules for this are:<br>
<br>
sep = space* ":" space*;<br>
main := name sep name;<br>
<br>
This doesn't work because apparently the space* in identifier and the<br>
space* in sep confuse the parser. I end up getting the action fName<br>
executed in every space of the name.<br>
<br>
If I change sep to:<br>
<br>
sep = ":";<br>
<br>
then everything is fine. How do I modify these rules so that the<br>
parser does what I intend?<br></blockquote><div><br>The answer is simple: you can't. Ragel generates DFA with actions attached. This means: symbol in => action out.<br><br>Your definition is ambigous: when you see a space you have no idea if it belongs to the identifier or not. You must scan ahead and look for the next non-space char: if it's colon then the previous space was not part of the identifier, if it's alnum then it is. This is not something DFA can/should do...<br>
<br>To solve your problem you need something more powerful: scanner (see the last chapter of ragel documentation), or full-blown parser: kelbt - <a href="http://www.complang.org/kelbt/">http://www.complang.org/kelbt/</a> (ragel itself uses it), bison - <a href="http://www.gnu.org/software/bison/">http://www.gnu.org/software/bison/</a> (most commonly used parser), etc.<br>
<br></div></div>