[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