[ragel-users] Re: Any suggestions on implementing SMTP protocol inRagel?

Ross Thomas halfacan... at gmail.com
Tue May 13 04:46:48 UTC 2008


It seems to me that the approach I describe cannot work as I wanted it
to, because the regexps matching the commands are duplicated for each
state, only with a different target state. For example:

main := (
    start: (
        1 -> a
    ),
    a: (
        1 -> b
    ),
    ...
);

Given the input [1, 1] the machine will end up in state "a", not state
"final" as I thought. Which makes sense now I think about it.

Back to the drawing board... :)

-Ross


On Mon, May 12, 2008 at 6:15 PM, Adrian Thurston <thurs... at cs.queensu.ca> wrote:
> Hi Ross,
>
> To be honest I don't have much experience with this approach. Statecharts were originally made for small low-level machines that are awkward to do with regular expressions. But they turned out to be more useful. The only issue I can think of is dealing with whitespace ... but I don't know SMTP well enough to say for sure. Let us know if if you pursue it and it works out :)
>
> Adrian
> -----Original Message-----
> From: "Ross Thomas" <halfacan... at gmail.com>
>
> Date: Mon, 12 May 2008 15:17:27
> To:ragel-users <ragel-users at googlegroups.com>
> Subject: [ragel-users] Re: Any suggestions on implementing SMTP protocol in
>  Ragel?
>
>
>
> To reduce the scope of my question a little, here is the general
> structure I have so far:
>
>    main := (
>        start: (
>            helo @copy_helo @resp_250 -> wait_mail |
>            mail @resp_503 -> start |
>            vrfy @resp_503 -> start |
>            ...
>        wait_mail: (
>            helo @resp_250 -> wait_mail |
>            mail @copy_mail @resp_250 -> wait_rcpt |
>            vrfy @resp_252 -> wait_mail |
>            ...
>    );
>
> Each "helo", "mail", "vrfy" etc. machine corresponds to the SMTP
> command of the same name. They are defined as:
>
>    helo = (("HELO"i | "EHLO"i) " "       %sarg graph+ %earg     eol);
>    mail = ( "MAIL"i            " FROM:<" %sarg path*  %earg ">" eol);
>    vrfy = ( "VRFY"i            " "       %sarg graph+ %earg     eol);
>    ...
>
> So the idea is that the top-level state chart handles logical flow and
> knows which commands are valid in which states, and calls the
> appropriate actions. The tokenizing is done "inline", as it were.
>
> Does this strike anyone as a particularly foolish approach? Is there a
> better way?
>
> -Ross
>
>
> On Sun, May 11, 2008 at 11:57 AM, Ross Thomas <halfacan... at gmail.com> wrote:
>>
>> While hacking up a parser for SMTP (in an unprecedentedly small amount
>> of time, naturally :)) it occurred to me that given Ragel's ability to
>> mix regular expressions with state charts I could make the same
>> machine double-up as an SMTP protocol handler too. At least, I think I
>> could. Because a significant portion of my work involves the client/
>> server model this is an aspect of Ragel I'd very much like to explore
>> in more detail...
>>
>> I've browsed around on the list and read Zed's post on state charts
>> but still don't have a totally clear idea on how this might be
>> implemented. Can anyone out there with more Ragel experience point me
>> in the right direction?
>>
>> -Ross
>
>
>
>
> >
>



More information about the ragel-users mailing list