Removed the write eof command.
[external/ragel.git] / test / erract5.rl
1 /*
2  * @LANG: obj-c
3  */
4
5 /*
6  * Test error actions.
7  */
8
9 #include <stdio.h>
10 #include <string.h>
11 #include <objc/Object.h>
12
13
14 @interface ErrAct : Object
15 {
16 @public
17         int cs;
18 };
19
20 // Initialize the machine. Invokes any init statement blocks. Returns 0
21 // if the machine begins in a non-accepting state and 1 if the machine
22 // begins in an accepting state.
23 - (int) initFsm;
24
25 // Execute the machine on a block of data. Returns -1 if after processing
26 // the data, the machine is in the error state and can never accept, 0 if
27 // the machine is in a non-accepting state and 1 if the machine is in an
28 // accepting state.
29 - (void) executeWithData:(const char *)data len:(int)len;
30
31 // Indicate that there is no more data. Returns -1 if the machine finishes
32 // in the error state and does not accept, 0 if the machine finishes
33 // in any other non-accepting state and 1 if the machine finishes in an
34 // accepting state.
35 - (int) finish;
36
37 @end
38
39 @implementation ErrAct
40
41 %%{
42         machine ErrAct;
43
44         action expect_digit_plus_minus { printf(" DIGIT PLUS MINUS\n"); } 
45         action expect_digit { printf(" DIGIT\n"); } 
46         action expect_digit_decimal { printf(" DIGIT DECIMAL\n"); }
47
48         float = (
49                 ( 
50                         [\-+] >!expect_digit_plus_minus %!expect_digit |
51                         ""
52                 )
53                 ( [0-9] [0-9]* $!expect_digit_decimal )
54                 ( '.' [0-9]+ $!expect_digit )? 
55         );
56
57         main := float '\n';
58 }%%
59
60 %% write data;
61
62 - (int) initFsm;
63 {
64         %% write init;
65         return 1;
66 }
67
68 - (void) executeWithData:(const char *)_data len:(int)_len;
69 {
70         const char *p = _data;
71         const char *pe = _data + _len;
72         %% write exec;
73 }
74
75 - (int) finish;
76 {
77         if ( cs == ErrAct_error )
78                 return -1;
79         else if ( cs >= ErrAct_first_final )
80                 return 1;
81         return 0;
82 }
83
84
85 @end
86
87 #define BUFSIZE 1024
88
89 void test( char *buf )
90 {
91         ErrAct *errAct = [[ErrAct alloc] init];
92         [errAct initFsm];
93         [errAct executeWithData:buf len:strlen(buf)];
94         if ( [errAct finish] > 0 )
95                 printf("ACCEPT\n");
96         else
97                 printf("FAIL\n");
98 }
99
100 int main()
101 {
102         test( "1\n" );
103         test( "+1\n" );
104         test( "-1\n" );
105         test( "1.1\n" );
106         test( "+1.1\n" );
107         test( "-1.1\n" );
108         test( "a\n" );
109         test( "-\n" );
110         test( "+\n" );
111         test( "-a\n" );
112         test( "+b\n" );
113         test( "1.\n" );
114         test( "1d\n" );
115         test( "1.d\n" );
116         test( "1.1d\n" );
117         return 0;
118 }
119
120 #ifdef _____OUTPUT_____
121 ACCEPT
122 ACCEPT
123 ACCEPT
124 ACCEPT
125 ACCEPT
126 ACCEPT
127  DIGIT PLUS MINUS
128 FAIL
129  DIGIT
130 FAIL
131  DIGIT
132 FAIL
133  DIGIT
134 FAIL
135  DIGIT
136 FAIL
137  DIGIT
138 FAIL
139  DIGIT DECIMAL
140 FAIL
141  DIGIT
142 FAIL
143  DIGIT
144 FAIL
145 #endif