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