A test for the ruby frontend scanner.
[external/ragel.git] / test / atoi3.rl
1 #
2 # @LANG: ruby
3 #
4
5 %%{
6     machine atoi3;
7     action begin {
8         neg = false;
9         val = 0;
10     }
11     action see_neg {
12         neg = true;
13     }
14     action add_digit {
15                 val = val * 10 + (fc - "0"[0]);
16     }
17     action finish {
18                 val = -1 * val if neg
19     }
20     action print {
21         puts val;
22     }
23     atoi = (('-' @ see_neg | '+') ? (digit @ add_digit) +) > begin % finish;
24     main := atoi '\n' @ print;
25 }%%
26
27 %% write data;
28
29 def run_machine( data )
30         p = 0;
31         pe = data.length
32         cs = 0
33         val = 0;
34         neg = false;
35
36         %% write init;
37         %% write exec;
38         %% write eof;
39         if  cs >= atoi3_first_final
40                 puts "ACCEPT"
41         else
42                 puts "FAIL"
43         end
44 end
45
46 inp = [
47                 "1\n",
48                 "12\n",
49                 "222222\n",
50                 "+2123\n",
51                 "213 3213\n",
52                 "-12321\n",
53                 "--123\n",
54                 "-99\n",
55                 " -3000\n",
56 ]
57
58 inp.each { |str| run_machine(str) }
59
60 =begin _____OUTPUT_____
61 1
62 ACCEPT
63 12
64 ACCEPT
65 222222
66 ACCEPT
67 2123
68 ACCEPT
69 FAIL
70 -12321
71 ACCEPT
72 FAIL
73 -99
74 ACCEPT
75 FAIL
76 =end _____OUTPUT_____