Scanners now ensure that a pattern's leaving actions are executed.
[ragel.git] / test / cond2.rl
blob7e49ab88cbb13e76c7ed6d1c47e17f326826ddf8
1 /* 
2  * @LANG: c++
3  */
5 #include <iostream>
6 #include <string.h>
7 using std::cout;
8 using std::endl;
10 %%{
11         machine foo;
13         action c1 {i}
14         action c2 {j}
16         action one { cout << "  one" << endl;}
17         action two { cout << "  two" << endl;}
19         main := (
20                         [a-z] |
21                         ('\n' when c1 @one)
22                 )*
23                 ('\n' when c2 @two);
24 }%%
26 %% write data noerror;
28 void test( int i, int j, const char *str )
30         int cs = foo_start;
31         const char *p = str;
32         const char *pe = str + strlen( str );
34         cout << "run:" << endl;
35         %% write exec;
36         if ( cs >= foo_first_final )
37                 cout << "  success" << endl;
38         else
39                 cout << "  failure" << endl;
40         cout << endl;
43 int main()
45         test( 0, 0, "hi\n\n" );
46         test( 1, 0, "hi\n\n" );
47         test( 0, 1, "hi\n" );
48         test( 0, 1, "hi\n\n" );
49         test( 1, 1, "hi\n" );
50         test( 1, 1, "hi\n\n" );
51         test( 1, 1, "hi\n\nx" );
52         return 0;
55 #ifdef _____OUTPUT_____
56 run:
57   failure
59 run:
60   one
61   one
62   failure
64 run:
65   two
66   success
68 run:
69   two
70   failure
72 run:
73   one
74   two
75   success
77 run:
78   one
79   two
80   one
81   two
82   success
84 run:
85   one
86   two
87   one
88   two
89   failure
91 #endif