File Coverage

blib/lib/Spp/ToSpp.pm
Criterion Covered Total %
statement 56 111 50.4
branch n/a
condition n/a
subroutine 11 24 45.8
pod 0 19 0.0
total 67 154 43.5


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