File Coverage

blib/lib/Spp/ToSpp.pm
Criterion Covered Total %
statement 56 122 45.9
branch n/a
condition n/a
subroutine 10 21 47.6
pod 0 16 0.0
total 66 159 41.5


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