summaryrefslogtreecommitdiff
path: root/test/ragel.d/atoi3.rl
blob: cb9192874841ba2023a144be0ea85b9d6bfd894c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#
# @LANG: ruby
#

%%{
    machine atoi3;
    action begin {
        neg = false;
        val = 0;
    }
    action see_neg {
        neg = true;
    }
    action add_digit {
		val = val * 10 + (fc - "0"[0].ord);
    }
    action finish {
		val = -1 * val if neg
    }
    action print {
        print val, "\n"
    }
    atoi = (('-' @ see_neg | '+') ? (digit @ add_digit) +) > begin % finish;
    main := atoi '\n' @ print;
}%%

%% write data;

def run_machine( data )
	p = 0;
	pe = data.length
	cs = 0
	val = 0;
	neg = false;

	%% write init;
	%% write exec;
	if  cs >= atoi3_first_final
		puts "ACCEPT"
	else
		puts "FAIL"
	end
end

inp = [
		"1\n",
		"12\n",
		"222222\n",
		"+2123\n",
		"213 3213\n",
		"-12321\n",
		"--123\n",
		"-99\n",
		" -3000\n",
]

inp.each { |str| run_machine(str) }

##### OUTPUT #####
1
ACCEPT
12
ACCEPT
222222
ACCEPT
2123
ACCEPT
FAIL
-12321
ACCEPT
FAIL
-99
ACCEPT
FAIL