summaryrefslogtreecommitdiff
path: root/test/erract4.rl
blob: 1a753eff71f50f9b605c5f1af12d3bb7abb69eb8 (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
/*
 * @LANG: obj-c
 */

#include <stdio.h>
#include <objc/Object.h>

#define IDENT_BUFLEN 256

@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;

	# The data that is to go into the fsm structure.
	action hello_fails { printf("hello fails\n");}

	newline = ( any | '\n' @{printf("newline\n");} )*;
	hello = 'hello\n'* $^hello_fails @/hello_fails;
	main := newline | hello;
}%%

%% 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;
	%% write exec;
}

- (int) finish;
{
	%% write eof;
	if ( cs == ErrAct_error )
		return -1;
	else if ( cs >= ErrAct_first_final )
		return 1;
	return 0;
}

@end

#include <stdio.h>
#include <string.h>
#define BUFSIZE 2048

ErrAct *fsm;
char buf[BUFSIZE];

void test( char *buf )
{
	int len = strlen(buf);
	fsm = [[ErrAct alloc] init];
	
	[fsm initFsm];
	[fsm executeWithData:buf len:len];
	if ( [fsm finish] > 0 )
		printf("ACCEPT\n");
	else
		printf("FAIL\n");
}


int main()
{
	test(
		"hello\n"
		"hello\n"
		"hello\n"
	);

	test(
		"hello\n"
		"hello\n"
		"hello there\n"
	);

	test(
		"hello\n"
		"hello\n"
		"he"	);

	test( "" );

	return 0;
}

#ifdef _____OUTPUT_____
newline
newline
newline
ACCEPT
newline
newline
hello fails
newline
ACCEPT
newline
newline
hello fails
ACCEPT
ACCEPT
#endif