summaryrefslogtreecommitdiff
path: root/test/atoi3.rl
blob: fcd4a4169e53f3ecf93116da57d9d822fa006b23 (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
75
#
# @LANG: ruby
#

%%{
    machine atoi3;
    action begin {
        neg = false;
        val = 0;
    }
    action see_neg {
        neg = true;
    }
    action add_digit {
		val = val * 10 + (fc - "0"[0]);
    }
    action finish {
		val = -1 * val if neg
    }
    action print {
        puts val;
    }
    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) }

=begin _____OUTPUT_____
1
ACCEPT
12
ACCEPT
222222
ACCEPT
2123
ACCEPT
FAIL
-12321
ACCEPT
FAIL
-99
ACCEPT
FAIL
=end _____OUTPUT_____