blob: 0ea6e9a9d4633f1c47a0d71d80aa4db7e0d0a586 (
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
143
144
145
146
|
/*
* @LANG: obj-c
*/
/*
* Test error actions.
*/
#include <stdio.h>
#include <string.h>
#include <objc/Object.h>
@interface ErrAct : Object
{
@public
int cs;
};
// Initialize the machine. Invokes any init statement blocks. Returns 0
// if the machine begins in a non-accepting state and 1 if the machine
// begins in an accepting state.
- (int) initFsm;
// Execute the machine on a block of data. Returns -1 if after processing
// the data, the machine is in the error state and can never accept, 0 if
// the machine is in a non-accepting state and 1 if the machine is in an
// accepting state.
- (void) executeWithData:(const char *)data len:(int)len;
// Indicate that there is no more data. Returns -1 if the machine finishes
// in the error state and does not accept, 0 if the machine finishes
// in any other non-accepting state and 1 if the machine finishes in an
// accepting state.
- (int) finish;
@end
@implementation ErrAct
%%{
machine ErrAct;
action expect_digit_plus_minus { printf(" DIGIT PLUS MINUS\n"); }
action expect_digit { printf(" DIGIT\n"); }
action expect_digit_decimal { printf(" DIGIT DECIMAL\n"); }
float = (
(
[\-+] >!expect_digit_plus_minus %!expect_digit |
""
)
( [0-9] [0-9]* $!expect_digit_decimal )
( '.' [0-9]+ $!expect_digit )?
);
main := float '\n';
}%%
%% write data;
- (int) initFsm;
{
%% write init;
return 1;
}
- (void) executeWithData:(const char *)_data len:(int)_len;
{
const char *p = _data;
const char *pe = _data + _len;
const char *eof = pe;
%% write exec;
}
- (int) finish;
{
if ( cs == ErrAct_error )
return -1;
else if ( cs >= ErrAct_first_final )
return 1;
return 0;
}
@end
#define BUFSIZE 1024
void test( char *buf )
{
ErrAct *errAct = [[ErrAct alloc] init];
[errAct initFsm];
[errAct executeWithData:buf len:strlen(buf)];
if ( [errAct finish] > 0 )
printf("ACCEPT\n");
else
printf("FAIL\n");
}
int main()
{
test( "1\n" );
test( "+1\n" );
test( "-1\n" );
test( "1.1\n" );
test( "+1.1\n" );
test( "-1.1\n" );
test( "a\n" );
test( "-\n" );
test( "+\n" );
test( "-a\n" );
test( "+b\n" );
test( "1.\n" );
test( "1d\n" );
test( "1.d\n" );
test( "1.1d\n" );
return 0;
}
#ifdef _____OUTPUT_____
ACCEPT
ACCEPT
ACCEPT
ACCEPT
ACCEPT
ACCEPT
DIGIT PLUS MINUS
FAIL
DIGIT
FAIL
DIGIT
FAIL
DIGIT
FAIL
DIGIT
FAIL
DIGIT
FAIL
DIGIT DECIMAL
FAIL
DIGIT
FAIL
DIGIT
FAIL
#endif
|