1/* 2 * @LANG: c 3 */ 4 5#include <stdio.h> 6#include <string.h> 7 8struct forder 9{ 10 int cs; 11}; 12 13%%{ 14 machine forder; 15 variable cs fsm->cs; 16 17 m1 = ( "" %{printf("enter m1 aa\n");} | 18 'aa'* >{printf("enter m1 aa\n");} %{printf("leave m1 aa\n");} ) 19 'b' @{printf("through m1 b\n");} . 'b'* . 'a'*; 20 21 m2 = 'bbb'* 'aa'*; 22 23 main := ( 24 m1 %{printf("accept m1\n");} | 25 "" %{printf("enter m2\n");} | 26 m2 >{printf("enter m2\n");} %{printf("accept m2\n");} 27 ) . '\n'; 28}%% 29 30%% write data; 31 32void forder_init( struct forder *fsm ) 33{ 34 %% write init; 35} 36 37void forder_execute( struct forder *fsm, const char *_data, int _len ) 38{ 39 const char *p = _data; 40 const char *pe = _data+_len; 41 42 %% write exec; 43} 44 45int forder_finish( struct forder *fsm ) 46{ 47 if ( fsm->cs == forder_error ) 48 return -1; 49 if ( fsm->cs >= forder_first_final ) 50 return 1; 51 return 0; 52} 53 54struct forder fsm; 55 56void test( char *buf ) 57{ 58 int len = strlen( buf ); 59 forder_init( &fsm ); 60 forder_execute( &fsm, buf, len ); 61 if ( forder_finish( &fsm ) > 0 ) 62 printf("ACCEPT\n"); 63 else 64 printf("FAIL\n"); 65} 66 67int main() 68{ 69 test( "aaaaaabbbaa\n" ); 70 test( "\n" ); 71 test( "bbbbbbaaaaaaa\n" ); 72 test( "bbbbbbaaaaaa\n" ); 73 test( "aaaaa\n" ); 74 75 return 0; 76} 77 78#ifdef _____OUTPUT_____ 79enter m1 aa 80enter m2 81leave m1 aa 82through m1 b 83accept m1 84ACCEPT 85enter m2 86enter m2 87accept m2 88ACCEPT 89enter m1 aa 90enter m1 aa 91leave m1 aa 92through m1 b 93enter m2 94accept m1 95ACCEPT 96enter m1 aa 97enter m1 aa 98leave m1 aa 99through m1 b 100enter m2 101accept m1 102accept m2 103ACCEPT 104enter m1 aa 105enter m2 106FAIL 107#endif 108