/
compiler.t
80 lines (72 loc) · 1.51 KB
/
compiler.t
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
76
77
78
79
80
use v6;
use Test;
plan *;
use Yapsi;
my Yapsi::Compiler $c .= new;
my @programs-that-compile =
'',
';',
'; ',
'42',
'42;',
'my $a',
'my $a;',
'say 42',
'my $a = 42;',
'my $a; $a = 42;',
'my $a; my $a; my $a',
'my $a := 42; my $b = $a;',
'my $a; my $b := $a; $a = 42',
'my $a; say $a',
'my $a; ++$a',
'++my $a',
'++my $a = 42',
'my $a; {}; say $a',
"my \$a; \{\}\nsay \$a",
'my $a; { say $a }',
'if 1 { say 42 }',
'my $a; if $a {}',
'if my $a {} else { say 42 }',
'my $a; while $a { say $a }',
'unless 0 { say 42 }',
'my $a=0; unless $a { say $a }',
'my $a=0; until $a { say 42; ++$a; }',
;
sub escape($string) { $string.subst("\n", "\\n", :g) }
for @programs-that-compile -> $program {
my $can-compile = False;
try {
$c.compile($program);
$can-compile = True;
}
ok $can-compile, "will compile '{escape($program)}'";
}
my @programs-that-don't-compile = # '
'$a',
'my',
'$a; my $a',
'my $a =',
'$a = 42',
'42 = my $a',
'42 := my $a',
'say $a',
'say $a; my $a',
'++42',
'{ my $a }; say $a',
'else { 42 }',
'if 42 say 42',
'if $a {}',
'if 42 { $a }',
'if 5 {} else { $a }',
'unless {}',
'unless a {}',
;
for @programs-that-don't-compile -> $program { # '
my $can-compile = False;
try {
$c.compile($program);
$can-compile = True;
}
ok !$can-compile, "will not compile '$program'";
}
done_testing;