File Coverage

blib/lib/Spp/ToSpp.pm
Criterion Covered Total %
statement 56 128 43.7
branch n/a
condition n/a
subroutine 10 21 47.6
pod 0 16 0.0
total 66 165 40.0


line stmt bran cond sub pod time code
1             package Spp::ToSpp;
2              
3 2     2   26 use 5.012;
  2         6  
4 2     2   8 no warnings "experimental";
  2         4  
  2         52  
5              
6 2     2   8 use Exporter;
  2         3  
  2         113  
7             our @ISA = qw(Exporter);
8             our @EXPORT =
9             qw(ast_to_spp to_spp atoms_to_spp group_to_spp branch_to_spp rept_to_spp look_to_spp chclass_to_spp nclass_to_spp str_to_spp cclass_to_spp char_to_spp cchar_to_spp till_to_spp not_to_spp range_to_spp);
10 2     2   10 use Spp::Builtin;
  2         3  
  2         306  
11 2     2   11 use Spp::Tools;
  2         3  
  2         1655  
12              
13             sub ast_to_spp {
14 3     3 0 6 my $ast = shift;
15 3         5 my $strs = [];
16 3         6 for my $spec (@{ atoms($ast) }) {
  3         8  
17 3         11 my ($name, $rule) = flat($spec);
18 3         14 my $rule_str = to_spp($rule);
19 3         8 push @{$strs}, "$name = $rule_str";
  3         14  
20             }
21 3         6 return join ';', @{ strings($strs) };
  3         12  
22             }
23              
24             sub to_spp {
25 9     9 0 14 my $rule = shift;
26 9         19 my ($name, $value) = flat($rule);
27 9         18 given ($name) {
28 9         18 when ('Rules') { return atoms_to_spp($value) }
  2         8  
29 7         13 when ('Group') { return group_to_spp($value) }
  0         0  
30 7         11 when ('Branch') { return branch_to_spp($value) }
  0         0  
31 7         12 when ('Rept') { return rept_to_spp($value) }
  1         7  
32 6         10 when ('Look') { return look_to_spp($value) }
  0         0  
33 6         9 when ('Chclass') { return chclass_to_spp($value) }
  0         0  
34 6         15 when ('Nclass') { return nclass_to_spp($value) }
  0         0  
35 6         10 when ('Str') { return str_to_spp($value) }
  0         0  
36 6         9 when ('Char') { return char_to_spp($value) }
  0         0  
37 6         9 when ('Cclass') { return cclass_to_spp($value) }
  2         8  
38 4         6 when ('Till') { return till_to_spp($value) }
  0         0  
39 4         6 when ('Not') { return not_to_spp($value) }
  0         0  
40 4         5 when ('Range') { return range_to_spp($value) }
  0         0  
41 4         6 when ('Cchar') { return cchar_to_spp($value) }
  0         0  
42 4         5 default { return $value }
  4         16  
43             }
44             }
45              
46             sub atoms_to_spp {
47 2     2 0 4 my $atoms = shift;
48             return join ' ',
49 2         4 @{ [map { to_spp($_) } @{ atoms($atoms) }] };
  2         3  
  5         15  
  2         5  
50             }
51              
52             sub group_to_spp {
53 0     0 0 0 my $rule = shift;
54 0         0 return add("(", atoms_to_spp($rule), ")");
55             }
56              
57             sub branch_to_spp {
58 0     0 0 0 my $branch = shift;
59 0         0 return add("|", atoms_to_spp($branch), "|");
60             }
61              
62             sub rept_to_spp {
63 1     1 0 2 my $rule = shift;
64 1         2 my ($rept, $atom) = flat($rule);
65 1         3 return add(to_spp($atom), $rept);
66             }
67              
68             sub look_to_spp {
69 0     0 0 0 my $rule = shift;
70 0         0 my ($rept, $atom_look) = flat($rule);
71 0         0 my ($atom, $look) = flat($atom_look);
72 0         0 return add(to_spp($atom), $rept, to_spp($look));
73             }
74              
75             sub chclass_to_spp {
76 0     0 0 0 my $atoms = shift;
77 0         0 return add("[", atoms_to_spp($atoms), "]");
78             }
79              
80             sub nclass_to_spp {
81 0     0 0 0 my $atoms = shift;
82 0         0 return add("[^", atoms_to_spp($atoms), "]");
83             }
84              
85             sub str_to_spp {
86 0     0 0 0 my $str = shift;
87 0         0 return add("'", $str, "'");
88             }
89              
90             sub cclass_to_spp {
91 2     2 0 4 my $cclass = shift;
92 2         7 return add("\\", $cclass);
93             }
94              
95             sub char_to_spp {
96 0     0 0   my $char = shift;
97 0           given ($char) {
98 0           when (In) { return '<' }
  0            
99 0           when (Out) { return '>' }
  0            
100 0           when (Qstr) { return '#' }
  0            
101 0           when (Qint) { return '&' }
  0            
102 0           when ('"') { return "\\\"" }
  0            
103 0           when ("\n") { return "\\n" }
  0            
104 0           when ("\r") { return "\\r" }
  0            
105 0           when ("\t") { return "\\t" }
  0            
106 0           when ("\\") { return "\\\\" }
  0            
107 0           default { return "'$char'" }
  0            
108             }
109             }
110              
111             sub cchar_to_spp {
112 0     0 0   my $char = shift;
113 0           given ($char) {
114 0           when ("\n") { return "\\n" }
  0            
115 0           when ("\r") { return "\\r" }
  0            
116 0           when ("\t") { return "\\t" }
  0            
117 0           when ("\\") { return "\\\\" }
  0            
118 0           when ('-') { return "\\-" }
  0            
119 0           when (']') { return "\\]" }
  0            
120 0           when ('^') { return "\\^" }
  0            
121 0           default { return $char }
  0            
122             }
123             }
124              
125             sub till_to_spp {
126 0     0 0   my $rule = shift;
127 0           return add("~", to_spp($rule));
128             }
129              
130             sub not_to_spp {
131 0     0 0   my $rule = shift;
132 0           return add("!", to_spp($rule));
133             }
134              
135             sub range_to_spp {
136 0     0 0   my $atom = shift;
137 0           return join '-', @{ atoms($atom) };
  0            
138             }
139             1;