diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2014-10-13 19:14:30 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2014-10-13 19:14:30 +0000 |
commit | eafd7a3974e8605fd02794269db6114a3446e016 (patch) | |
tree | 064737b35dbe10f2995753ead92f95bac30ba048 /test/element1.rl | |
download | ragel-tarball-eafd7a3974e8605fd02794269db6114a3446e016.tar.gz |
ragel-6.9ragel-6.9
Diffstat (limited to 'test/element1.rl')
-rw-r--r-- | test/element1.rl | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/test/element1.rl b/test/element1.rl new file mode 100644 index 0000000..0795778 --- /dev/null +++ b/test/element1.rl @@ -0,0 +1,108 @@ +/* + * @LANG: c++ + */ + +#include <iostream> +using namespace std; + +struct LangEl +{ + int key; + const char *name; +}; + +struct Fsm +{ + 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( LangEl *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 Fsm; + + alphtype int; + getkey fpc->key; + variable eof eof_marker; + + action a1 {} + action a2 {} + action a3 {} + + main := ( 1 2* 3 ) + ${cout << fpc->name << endl;} + %/{cout << "accept" << endl;}; +}%% + +%% write data; + +int Fsm::init( ) +{ + %% write init; + return 0; +} + +int Fsm::execute( LangEl *data, int len ) +{ + LangEl *p = data; + LangEl *pe = data + len; + LangEl *eof_marker = pe; + %% write exec; + + if ( cs == Fsm_error ) + return -1; + if ( cs >= Fsm_first_final ) + return 1; + return 0; +} + +int Fsm::finish( ) +{ + if ( cs == Fsm_error ) + return -1; + if ( cs >= Fsm_first_final ) + return 1; + return 0; +} + +int main( ) +{ + static Fsm fsm; + static LangEl lel[] = { + {1, "one"}, + {2, "two-a"}, + {2, "two-b"}, + {2, "two-c"}, + {3, "three"} + }; + + fsm.init(); + fsm.execute( lel, 5 ); + fsm.finish(); + return 0; +} + +#ifdef _____OUTPUT_____ +one +two-a +two-b +two-c +three +accept +#endif |