diff options
Diffstat (limited to 'test/recdescent2.rl')
-rw-r--r-- | test/recdescent2.rl | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/test/recdescent2.rl b/test/recdescent2.rl new file mode 100644 index 0000000..59c4586 --- /dev/null +++ b/test/recdescent2.rl @@ -0,0 +1,116 @@ +/* + * @LANG: java + */ + +class recdescent2 +{ + %%{ + machine recdescent; + + prepush { + if ( top == stack_size ) { + System.out.print( "growing stack\n" ); + stack_size = top * 2; + // Don't actually bother to resize here, but we do print messages. + //stack = (int*)realloc( stack, sizeof(int)*stack_size ); + } + } + + postpop { + if ( stack_size > (top * 4) ) { + stack_size = top * 2; + // Don't actually bother to resize here, but we do print messages. + //stack = (int*)realloc( stack, sizeof(int)*stack_size ); + System.out.print( "shrinking stack\n" ); + } + } + + action item_start { item = p; } + + action item_finish + { + String item_data = new String ( data, item, p-item ); + System.out.print( "item: " ); + System.out.print( item_data ); + System.out.print( "\n" ); + } + + action call_main + { + System.out.print( "calling main\n" ); + fcall main; + } + + action return_main + { + if ( top == 0 ) { + System.out.print( "STRAY CLOSE\n" ); + fbreak; + } + + System.out.print( "returning from main\n" ); + fhold; + fret; + } + + id = [a-zA-Z_]+; + number = [0-9]+; + ws = [ \t\n]+; + + main := ( + ws | + ( number | id ) >item_start %item_finish | + + '{' @call_main '}' | + + '}' @return_main + )**; + }%% + + %% write data; + + static void test( char data[] ) + { + int cs, p = 0, pe = data.length, eof = data.length, item = 0; + int stack[] = new int[1024]; + int stack_size = 1; + int top; + + %% write init; + %% write exec; + + if ( cs == recdescent_error ) + System.out.println( "SCANNER ERROR" ); + } + + public static void main( String args[] ) + { + test( "88 foo { 99 {{{{}}}}{ } }".toCharArray() ); + test( "76 } sadf".toCharArray() ); + } +} + +/* _____OUTPUT_____ +item: 88 +item: foo +calling main +item: 99 +calling main +growing stack +calling main +growing stack +calling main +calling main +growing stack +returning from main +returning from main +returning from main +returning from main +shrinking stack +calling main +returning from main +returning from main +shrinking stack +item: 76 +STRAY CLOSE +*/ |