% Leaving Action Questions
francois.beausoleil
francois.beausol... at gmail.com
Wed Feb 27 03:59:27 UTC 2008
Hello Adrian,
On 25 fév, 17:01, "Adrian Thurston" <thurs... at cs.queensu.ca> wrote:
> The problem is the any* at the beginning of bla. It creates an ambiguity for the bla*. Changing that to bla** will fix that.
Thanks for that. I did finally manage to implement something that
works for the vast majority of cases. I can identify "closes #123,
fixes #321" and other patterns. My problem is now "assigned to
francois". Here's my latest machine:
%%{
machine commit_message_parser;
action mark { mark = p }
action bugid { bugid = data[mark .. p] }
action name { name = data[mark .. p] }
action close { action = :close }
action fix { action = :fix }
action reference { action = :reference }
action reopen { action = :reopen }
action reactivate { action = :reactivate }
action implement { action = :implement }
action assign { action = :assign }
action notify { listener.send(action, bugid.pack("C*")) }
action notify_assign { listener.send(action, name.pack("C*")) }
bugid = ("#" ('1'..'9')>mark ('0'..'9')**)@bugid %notify;
bugid_separator = (space* (punct | /and/i) space*);
bugids = (bugid (bugid_separator bugid)*);
close = (/close/i /s/i? /:/?) %close;
fix = (/fix/i /es/i? /:/?) %fix;
reference = (/reference/i /s/i? /:/?) %reference;
reopen = (/re/i? /open/i /s/i? /:/?) %reopen;
reactivate = (/re/i? /activate/i /s/i? /:/?) %reactivate;
implement = (/implement/i? /s/i? /:/?) %implement;
assign = (/re/i? /assign/i /ed/i? (space+ /to/i)?) %assign;
name = (alpha)+ >mark %name;
assignto = (assign space+ name) %notify_assign;
keywords = (close | fix | reference | reopen | reactivate |
assignto);
text = (any - (keywords | bugids));
main := (text* (keywords space* bugids)*);
}%%
With this machine, Ragel doesn't recognize "The parser assign
francois." (meaning my notify_action isn't called). But it does
recognize "The parser assign to francois.", but says the name is "to
".
> You might want to consider using a scanner to find the interesting things. In the event of only a partial match it can default to another pattern.
Regarding scanners, I looked at chapter 6 of the guide, but couldn't
find an immediate application. I don't really know where/how to start
to write my scanner.
Thanks for any other help !
François
More information about the ragel-users
mailing list