summaryrefslogtreecommitdiff
path: root/test/erract1.rl
blob: d5c01ea2b6bc138a3ca546bd520c2162cf567385 (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
/*
 * @LANG: c++
 */

/*
 * Test error actions.
 */

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

struct ErrAct 
{
	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 init( );

	// 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.
	int execute( const char *data, 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( );
};

%%{
	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 = (
		( 
			[\-+] >err expect_digit_plus_minus %err expect_digit |
			""
		)
		( [0-9] [0-9]* $err expect_digit_decimal )
		( '.' [0-9]+ $err expect_digit )? 
	);

	main := float '\n';
}%%

%% write data;

int ErrAct::init( )
{
	%% write init;
	return 0;
}

int ErrAct::execute( const char *_data, int _len )
{
	const char *p = _data;
	const char *pe = _data+_len;
	const char *eof = pe;
	%% write exec;

	if ( cs == ErrAct_error )
		return -1;
	if ( cs >= ErrAct_first_final )
		return 1;
	return 0;
}

int ErrAct::finish( )
{
	if ( cs == ErrAct_error )
		return -1;
	if ( cs >= ErrAct_first_final )
		return 1;
	return 0;
}

#define BUFSIZE 1024

void test( const char *buf )
{
	ErrAct errAct;
	errAct.init();
	errAct.execute( buf, strlen(buf) );
	if ( errAct.finish() > 0 )
		cout << "ACCEPT" << endl;
	else
		cout << "FAIL" << endl;
}

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