Removed arg passing from frontend to backend functions.
[ragel.git] / test / recdescent3.rl
blob1216b432a0e6b5067cb9a71d5ff0d9fdac6a9369
2 # @LANG: ruby
5 %%{
6     machine recdescent3;
8         prepush { 
9                 if top == stack_size
10                         print( "growing stack\n" );
11                         stack_size = top * 2;
12                         # Don't actually bother to resize here, but we do print messages.
13                         # stack = (int*)realloc( stack, sizeof(int)*stack_size );
14                 end 
15         }
17         postpop { 
18                 if stack_size > (top * 4)
19                         print( "shrinking stack\n" );
20                         stack_size = top * 2;
21                         # Don't actually bother to resize here, but we do print messages.
22                         # stack = (int*)realloc( stack, sizeof(int)*stack_size );
23                 end
24         }
26         action item_start { item = p; }
28         action item_finish
29         {
30                 print( "item: " );
31                 print( data[item..p-1] );
32                 print( "\n" );
33         }
35         action call_main
36         {
37                 print( "calling main\n" );
38                 fcall main;
39         }
41         action return_main
42         {
43                 if top == 0 
44                         print( "STRAY CLOSE\n" );
45                         fbreak;
46                 end
48                 print( "returning from main\n" );
49                 fhold;
50                 fret;
51         }
53         id = [a-zA-Z_]+;
54         number = [0-9]+;
55         ws = [ \t\n]+;
57         main := ( 
58                 ws |
59                 ( number | id ) >item_start %item_finish |
61                 '{' @call_main '}' |
63                 '}' @return_main
64         )**;
65 }%%
67 %% write data;
69 def run_machine( data )
70         item = 0;
71         p = 0;
72         pe = data.length;
73         eof = pe;
74         cs = 0;
75         stack = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];
76         stack_size = 1;
77         top = 0;
79         %% write init;
80         %% write exec;
82         if cs == recdescent3_error
83                 puts "SCANNER_ERROR"
84         end
85 end
87 inp = [
88                 "88 foo { 99 {{{{}}}}{ } }",
89                 "76 } sadf"
92 inp.each { |str| run_machine(str) }
94 =begin _____OUTPUT_____
95 item: 88
96 item: foo
97 calling main
98 item: 99
99 calling main
100 growing stack
101 calling main
102 growing stack
103 calling main
104 calling main
105 growing stack
106 returning from main
107 returning from main
108 returning from main
109 returning from main
110 shrinking stack
111 calling main
112 returning from main
113 returning from main
114 shrinking stack
115 item: 76
116 STRAY CLOSE
117 =end _____OUTPUT_____