Removed the write eof command.
[external/ragel.git] / test / recdescent3.rl
1 #
2 # @LANG: ruby
3 #
4
5 %%{
6     machine recdescent3;
7
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         }
16
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         }
25
26         action item_start { item = p; }
27
28         action item_finish
29         {
30                 print( "item: " );
31                 print( data[item..p-1] );
32                 print( "\n" );
33         }
34
35         action call_main
36         {
37                 print( "calling main\n" );
38                 fcall main;
39         }
40
41         action return_main
42         {
43                 if top == 0 
44                         print( "STRAY CLOSE\n" );
45                         fbreak;
46                 end
47
48                 print( "returning from main\n" );
49                 fhold;
50                 fret;
51         }
52
53         id = [a-zA-Z_]+;
54         number = [0-9]+;
55         ws = [ \t\n]+;
56
57         main := ( 
58                 ws |
59                 ( number | id ) >item_start %item_finish |
60
61                 '{' @call_main '}' |
62
63                 '}' @return_main
64         )**;
65 }%%
66
67 %% write data;
68
69 def run_machine( data )
70         item = 0;
71         p = 0;
72         pe = data.length;
73         cs = 0;
74         stack = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];
75         stack_size = 1;
76         top = 0;
77
78         %% write init;
79         %% write exec;
80
81         if cs == recdescent3_error
82                 puts "SCANNER_ERROR"
83         end
84 end
85
86 inp = [
87                 "88 foo { 99 {{{{}}}}{ } }",
88                 "76 } sadf"
89 ]
90
91 inp.each { |str| run_machine(str) }
92
93 =begin _____OUTPUT_____
94 item: 88
95 item: foo
96 calling main
97 item: 99
98 calling main
99 growing stack
100 calling main
101 growing stack
102 calling main
103 calling main
104 growing stack
105 returning from main
106 returning from main
107 returning from main
108 returning from main
109 shrinking stack
110 calling main
111 returning from main
112 returning from main
113 shrinking stack
114 item: 76
115 STRAY CLOSE
116 =end _____OUTPUT_____