summaryrefslogtreecommitdiff
path: root/examples/concurrent.rl
diff options
context:
space:
mode:
Diffstat (limited to 'examples/concurrent.rl')
-rw-r--r--examples/concurrent.rl126
1 files changed, 0 insertions, 126 deletions
diff --git a/examples/concurrent.rl b/examples/concurrent.rl
deleted file mode 100644
index 224f9601..00000000
--- a/examples/concurrent.rl
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Show off concurrent abilities.
- */
-
-#include <iostream>
-#include <stdlib.h>
-#include <stdio.h>
-
-using namespace std;
-
-#define BUFSIZE 2048
-
-struct Concurrent
-{
- int cur_char;
- int start_word;
- int start_comment;
- int start_literal;
-
- int cs;
-
- int init( );
- int execute( const char *data, int len, bool isEof );
- int finish( );
-};
-
-%%{
- machine Concurrent;
-
- action next_char {
- cur_char += 1;
- }
-
- action start_word {
- start_word = cur_char;
- }
- action end_word {
- cout << "word: " << start_word <<
- " " << cur_char-1 << endl;
- }
-
- action start_comment {
- start_comment = cur_char;
- }
- action end_comment {
- cout << "comment: " << start_comment <<
- " " << cur_char-1 << endl;
- }
-
- action start_literal {
- start_literal = cur_char;
- }
- action end_literal {
- cout << "literal: " << start_literal <<
- " " << cur_char-1 << endl;
- }
-
- # Count characters.
- chars = ( any @next_char )*;
-
- # Words are non-whitespace.
- word = ( any-space )+ >start_word %end_word;
- words = ( ( word | space ) $1 %0 )*;
-
- # Finds C style comments.
- comment = ( '/*' any* :>> '*/' ) >start_comment %end_comment;
- comments = ( comment | any )**;
-
- # Finds single quoted strings.
- literalChar = ( any - ['\\] ) | ( '\\' . any );
- literal = ('\'' literalChar* '\'' ) >start_literal %end_literal;
- literals = ( ( literal | (any-'\'') ) $1 %0 )*;
-
- main := chars | words | comments | literals;
-}%%
-
-%% write data;
-
-int Concurrent::init( )
-{
- %% write init;
- cur_char = 0;
- return 1;
-}
-
-int Concurrent::execute( const char *data, int len, bool isEof )
-{
- const char *p = data;
- const char *pe = data + len;
- const char *eof = isEof ? pe : 0;
-
- %% write exec;
-
- if ( cs == Concurrent_error )
- return -1;
- if ( cs >= Concurrent_first_final )
- return 1;
- return 0;
-}
-
-int Concurrent::finish( )
-{
- if ( cs == Concurrent_error )
- return -1;
- if ( cs >= Concurrent_first_final )
- return 1;
- return 0;
-}
-
-Concurrent concurrent;
-char buf[BUFSIZE];
-
-int main()
-{
- concurrent.init();
- while ( 1 ) {
- int len = fread( buf, 1, BUFSIZE, stdin );
- concurrent.execute( buf, len, len != BUFSIZE );
- if ( len != BUFSIZE )
- break;
- }
-
- if ( concurrent.finish() <= 0 )
- cerr << "concurrent: error parsing input" << endl;
- return 0;
-}