summaryrefslogtreecommitdiff
path: root/test/genrep1.rl
blob: a7b29656eba6d8f5c277439a4b113eaf0ca249d2 (plain)
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
 * @LANG: c
 * @PROHIBIT_GENFLAGS: -T0 -T1 -F0 -G0 -G1 -G2
 */

#include <stddef.h>  /* NULL */
#include <stdint.h>  /* uint64_t */
#include <stdlib.h>  /* malloc(3) free(3) */
#include <stdbool.h> /* bool */
#include <string.h>
#include <stdio.h>

struct nfa_bp_rec
{
	long state;
	const unsigned char *p;
	int pop;
};

struct nfa_bp_rec nfa_bp[1024];
long nfa_len = 0;
long nfa_count = 0;

long c;

struct nfa_state_rec
{
	long c;
};

struct nfa_state_rec nfa_s[1024];

void nfa_push()
{
	nfa_s[nfa_len].c = c;
}

void nfa_pop()
{
	c = nfa_s[nfa_len].c;
}

%%{
	machine match_any;
	alphtype unsigned char;

	action eol { p+1 == eof }

	eol = '' %when eol;

	action ini6
	{
		c = 0;
	}

	action min6
	{
		if ( ++c < 2 )
			fgoto *match_any_error;
	}

	action max6
	{
		if ( ++c == 3 )
			fgoto *match_any_error;
	}

	main := 
		( :( ( 'a' ), ini6, min6, max6, {nfa_push();}, {nfa_pop();} ): ' ' ) {2}
		eol
		any @{printf("----- MATCH\n");}
	;

	write data;
}%%

int test( const char *data )
{
	int cs;
	const unsigned char *p = (const unsigned char *)data;
	const unsigned char *pe = p + strlen(data) + 1;
	const unsigned char *eof = pe;

	printf( "testing: %s\n", data );

	%% write init;
	%% write exec;
	
	return 0;
}

int main()
{
	test( "a " );
	test( "aa " );
	test( "aaa " );
	test( "aaaa " );

	test( "a a " );
	test( "aa aa " );
	test( "aaa aaa " );
	test( "aaaa aaaa " );

	test( "a a a " );
	test( "aa aa aa " );
	test( "aaa aaa aaa " );
	test( "aaaa aaaa aaaa " );

	test( "aa a " );
	test( "aa aaa " );
	test( "aa aaaa " );

	test( "aaa a " );
	test( "aaa aa " );
	test( "aaa aaaa " );

	return 0;
}

##### OUTPUT #####
testing: a 
testing: aa 
testing: aaa 
testing: aaaa 
testing: a a 
testing: aa aa 
----- MATCH
testing: aaa aaa 
----- MATCH
testing: aaaa aaaa 
testing: a a a 
testing: aa aa aa 
testing: aaa aaa aaa 
testing: aaaa aaaa aaaa 
testing: aa a 
testing: aa aaa 
----- MATCH
testing: aa aaaa 
testing: aaa a 
testing: aaa aa 
----- MATCH
testing: aaa aaaa