1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
/*
* @LANG: c
*/
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <stdio.h>
const char s[4096];
struct nfa_stack
{
void *data;
unsigned long sz;
};
struct nfa_bp_rec
{
long state;
const char *p;
long popTrans;
long q_2;
};
%%{
machine atoi;
action a {a}
action b {b}
action psh { nfa_bp[nfa_len].q_2 = q_2; }
action pop { ({ q_2 = nfa_bp[nfa_len].q_2; 1; }) }
action ini { ({ q_2 = 0; 1; }) }
action stay { ({ 1; }) }
action repeat { ({ ++q_2 < 2; }) }
action exit { ({ ++q_2 >= 2; }) }
main :=
(
( 'a' %when a %when b)
|
( 'a' %when a )
)
:nfa( ( '.' ), psh, pop, ini, stay, repeat, exit ):
';'
@{ printf( " --> MATCH\n" ); };
}%%
%% write data;
int test( const char *p, bool a, bool b )
{
int len = strlen( p ) + 1;
const char *pe = p + len;
const char *eof = pe;
int cs;
struct nfa_bp_rec *nfa_bp = (struct nfa_bp_rec*) s;
long nfa_len = 0;
long nfa_count = 0;
long q_2 = 0;
printf( "testing: %s %d %d\n", p, a, b );
%%{
write init;
write exec;
}%%
return 0;
}
int main()
{
test( "a.;", 0, 0 );
test( "a.;", 0, 1 );
test( "a.;", 1, 0 );
test( "a.;", 1, 1 );
test( "a..;", 0, 0 );
test( "a..;", 0, 1 );
test( "a..;", 1, 0 );
test( "a..;", 1, 1 );
test( "a...;", 0, 0 );
test( "a...;", 0, 1 );
test( "a...;", 1, 0 );
test( "a...;", 1, 1 );
return 0;
}
##### OUTPUT #####
testing: a.; 0 0
testing: a.; 0 1
testing: a.; 1 0
testing: a.; 1 1
testing: a..; 0 0
testing: a..; 0 1
testing: a..; 1 0
--> MATCH
testing: a..; 1 1
--> MATCH
testing: a...; 0 0
testing: a...; 0 1
testing: a...; 1 0
testing: a...; 1 1
|