[ragel-users] Re: two state machines
Arne Goedeke
la... at laramies.com
Sat Jun 7 20:32:32 UTC 2008
As far as I understand the problem, it would be the right thing to use
fexec instead of setting p.
your action could look like this:
action entpt1 {
...
fexec FN;
fgoto FSM1;
}
I attached a sample ragel machine..
arne
On Sat, 7 Jun 2008, massimiliano cialdi wrote:
>
> On Sat, Jun 7, 2008 at 7:39 AM, mitchell <mforal.n... at gmail.com> wrote:
>>
>> Hi,
>>
>> Untested, but it's an idea I had:
>
> I tried the same thing, and I have some doubt
>
> here is my source (is only a simplified example of my really need):
> ----------------------------8<-------------------------------------
> #include <string.h>
> #include <stdio.h>
> %%{
> # test for dua FSM definition
> # I want to match a pattern like A"12345FFF01"B ( or A"99FFFFF99"B or
> A"321FFFFF14"B )
> # once take the substring between quotes I want to pass it to FSM1
> that match exacly
>
> machine test1;
>
> action copycar
> {
> printf("%c\n",fc);
> // populating FN
> *fn = fc;
> fn++;
> }
>
> action error
> {
> printf("error %d, %c\n",cs,fc);
> fbreak;
> }
>
> action endpt1
> {
> printf("OK\n%s\n", FN);
> // setting new buffer margin for FSM1. It must operate on FN
> p = FN;
> pe = p + strlen(p) + 1;
> fgoto FSM1;
> }
>
> action endsubstr
> {
> // placing null termination to substring in FN
> *fn = '\0';
> }
>
> action endpt2
> {
> // substring matches
> printf("OK pt2\n");
> }
>
> FSM1 := '12345FFF' @!error @endpt2 >~{printf("*** %d %c %s ***\n",cs,
> fc, fpc);};
>
> main := ( 'A"' ( digit{2} (digit | 'F'){3} 'F'{3} ) $copycar
> @endsubstr digit{2} '"B' ) @!error @endpt1 ;
>
> }%%
>
> %% write data;
>
>
> void parse(char *buf)
> {
> int cs;
> char *eof = 0;
> char *p = buf;
> char *pe = p + strlen(p) + 1;
>
> char FN[16];
> char *fn;
>
> // FN is the container fo the substring
> fn = FN;
> %% write init;
> %% write exec;
> }
>
> int main( int argc, char **argv )
> {
> if ( argc > 1 ) {
> parse(argv[1]);
> }
> return 0;
> }
>
> ----------------------------8<-------------------------------------
>
> if you try to execute it fails:
>
> test A\"12345FFF01\"B
> 1
> 2
> 3
> 4
> 5
> F
> F
> F
> OK
> 12345FFF
> *** 15 1 12345FFF ***
> error 0, 2
>
> but the string exactly match the pattern (as can be seen in line "***
> 15 1 12345FFF ***")
>
> so now try to change the pattern of FSM1 as follow (we delete '1'):
> FSM1 := '2345FFF' @!error @endpt2 >~{printf("*** %d %c %s ***\n",cs,
> fc, fpc);};
>
> and retry to execute:
>
> test A\"12345FFF01\"B
> 1
> 2
> 3
> 4
> 5
> F
> F
> F
> OK
> 12345FFF
> *** 15 1 12345FFF ***
> OK pt2
>
> now it report the string matching but we had changed the pattern.
> It seems that it skip the first character after fgoto.
>
> so I tried another way.
> lets use originale FSM1 definition (pattern '12345FFF'), but change
> action endpt1 to add an fhold statement as follow:
>
> action endpt1
> {
> printf("OK\n%s\n", FN);
> // setting new buffer margin for FSM1. It must operate on FN
> p = FN;
> pe = p + strlen(p) + 1;
> // fhold is translated in C as p--;
> fhold;
> fgoto FSM1;
> }
>
> and let execute:
>
> test A\"12345FFF01\"B
> 1
> 2
> 3
> 4
> 5
> F
> F
> F
> OK
> 12345FFF
> *** 15 ***
> OK pt2
>
> it seems to work, but action to-state start of FSM1 fails, it cannot
> print neither fc character nor pfc string...
>
> is this the right way to do this?
>
> thanks
> --
> Et nunc, auxilium solis, vincam!
> Oppugnatio solaris!
> VIS!
>
> Massimiliano Cialdi
> cia... at gmail.com
> massimiliano.cia... at powersoft.it
>
> >
>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: 2.rl
URL: <http://www.colm.net/pipermail/ragel-users/attachments/20080607/46f32987/attachment-0001.ksh>
More information about the ragel-users
mailing list