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