b14067ef17923555ba718a73f0792af2ef552aaf
[external/ragel.git] / test / repetition.rl
1 /*
2  * @LANG: c++
3  */
4
5 /* Test repeptition operators. */
6
7 #include <iostream>
8 #include <stdlib.h>
9 #include <stdio.h>
10
11 using namespace std;
12
13 struct Rep
14 {
15         int cs;
16
17         int init( );
18         int execute( const char *data, int len );
19         int finish( );
20 };
21
22 %%{
23         machine Rep;
24
25         action begin { cout << "begin" << endl; }
26         action in { cout << "in" << endl; }
27         action end { cout << "end" << endl; }
28
29         a = 'a' >begin @in %end;
30         b = 'b' >begin @in %end;
31         c = 'c' >begin @in %end;
32         d = 'd' >begin @in %end;
33
34         main := 
35                 ( a {5} '\n' )* '-\n'
36                 ( b {,5} '\n' )* '-\n'
37                 ( c {5,} '\n' )* '-\n'
38                 ( d {2,5} '\n' )*;
39 }%%
40
41 %% write data;
42
43 int Rep::init( )
44 {
45         %% write init;
46         return 1;
47 }
48
49 int Rep::execute( const char *_data, int _len )
50 {
51         const char *p = _data;
52         const char *pe = _data+_len;
53
54         %% write exec;
55
56         if ( cs == Rep_error )
57                 return -1;
58         if ( cs >= Rep_first_final )
59                 return 1;
60         return 0;
61 }
62
63 int Rep::finish( )
64 {
65         if ( cs == Rep_error )
66                 return -1;
67         if ( cs >= Rep_first_final )
68                 return 1;
69         return 0;
70 }
71
72 void test( char *buf )
73 {
74         Rep rep;
75         int len = strlen( buf );
76         rep.init();
77         rep.execute( buf, len );
78         if ( rep.finish() > 0 )
79                 printf("ACCEPT\n");
80         else
81                 printf("FAIL\n");
82 }
83
84 int main()
85 {
86         test(
87                 "aaaaa\n"
88                 "-\n"
89                 "\n"
90                 "b\n"
91                 "bb\n"
92                 "bbb\n"
93                 "bbbb\n"
94                 "bbbbb\n"
95                 "-\n"
96                 "ccccc\n"
97                 "ccccccc\n"
98                 "cccccccccc\n"
99                 "-\n"
100                 "dd\n"
101                 "ddd\n"
102                 "dddd\n"
103                 "ddddd\n"
104         );
105
106         test(
107                 "a\n"
108                 "-\n"
109                 "b\n"
110                 "-\n"
111                 "c\n"
112                 "-\n"
113                 "d\n"
114         );
115
116         return 0;
117 }
118
119 #ifdef _____OUTPUT_____
120 begin
121 in
122 end
123 begin
124 in
125 end
126 begin
127 in
128 end
129 begin
130 in
131 end
132 begin
133 in
134 end
135 begin
136 in
137 end
138 begin
139 in
140 end
141 begin
142 in
143 end
144 begin
145 in
146 end
147 begin
148 in
149 end
150 begin
151 in
152 end
153 begin
154 in
155 end
156 begin
157 in
158 end
159 begin
160 in
161 end
162 begin
163 in
164 end
165 begin
166 in
167 end
168 begin
169 in
170 end
171 begin
172 in
173 end
174 begin
175 in
176 end
177 begin
178 in
179 end
180 begin
181 in
182 end
183 begin
184 in
185 end
186 begin
187 in
188 end
189 begin
190 in
191 end
192 begin
193 in
194 end
195 begin
196 in
197 end
198 begin
199 in
200 end
201 begin
202 in
203 end
204 begin
205 in
206 end
207 begin
208 in
209 end
210 begin
211 in
212 end
213 begin
214 in
215 end
216 begin
217 in
218 end
219 begin
220 in
221 end
222 begin
223 in
224 end
225 begin
226 in
227 end
228 begin
229 in
230 end
231 begin
232 in
233 end
234 begin
235 in
236 end
237 begin
238 in
239 end
240 begin
241 in
242 end
243 begin
244 in
245 end
246 begin
247 in
248 end
249 begin
250 in
251 end
252 begin
253 in
254 end
255 begin
256 in
257 end
258 begin
259 in
260 end
261 begin
262 in
263 end
264 begin
265 in
266 end
267 begin
268 in
269 end
270 begin
271 in
272 end
273 begin
274 in
275 end
276 begin
277 in
278 end
279 begin
280 in
281 end
282 begin
283 in
284 end
285 begin
286 in
287 end
288 ACCEPT
289 begin
290 in
291 FAIL
292 #endif