[ragel-users] Re: Ragel for network protocols?

Stéphane Bortzmeyer bortzme... at gmail.com
Thu Nov 9 15:17:16 UTC 2006


2006/11/8, Adrian Thurston <thurs... at cs.queensu.ca>:

> The mechanism for building machines with the state chart paradigm is hidden
> away in the language. You use the following operators
>
> label:  make labels
> ->      draw epsilon operations
> ,       join machines together without transitions
> ()      grouping comes in handy

OK, thanks, now, I have a state machine which is compiled. But, at
execution time, I always end in an invalid state. I wrote:

%%{
machine test;

      OPEN = 'O';
       CLOSE = 'C';

       main :=
               start:
               door_closed: (
                       OPEN -> door_open -> final
               ),
               door_open: (
                       CLOSE -> door_closed
               );
}%%

and then the ancillary code:

%% write data;

int main( int argc, char **argv )
{
        /* Mandatory Ragel variables, see the manual */
        int cs;
        char *p;
        char *pe;

        int res = 0;
        int i;
        %%write init;
        if ( argc > 1 ) {
           for (i=1; i<argc; i++)  {
              p = argv[i];
              pe = p + strlen(p) + 1;
              printf("Step %i: input %s, current state %i... ", i, p, cs);
              %%write exec;
              if (cs == test_error) {
                 printf("Error, invalid input\n");
                 break;
              }
              else {
                 printf("New state is %i\n", cs);
              }
           }
        }
        else {
	   printf("Usage: %s O C O C ...", argv[0]);
           return 1;
        }
        printf("result = %i\n", res );
        %%write eof;
        return 0;
}

But I always get:

% ragel test.rl | rlcodegen && gcc -o test test.c && ./test O C O
Step 1: input O, current state 0... Error, invalid input
result = 0



More information about the ragel-users mailing list