File Coverage

blib/lib/Mylisp/OptSppAst.pm
Criterion Covered Total %
statement 14 218 6.4
branch 0 48 0.0
condition n/a
subroutine 5 31 16.1
pod 0 26 0.0
total 19 323 5.8


line stmt bran cond sub pod time code
1             package Mylisp::OptSppAst;
2            
3 1     1   22 use 5.012;
  1         4  
4 1     1   8 use experimental 'switch';
  1         2  
  1         8  
5            
6 1     1   137 use Exporter;
  1         2  
  1         74  
7             our @ISA = qw(Exporter);
8             our @EXPORT = qw(OptSppAst);
9            
10 1     1   8 use Mylisp::Builtin;
  1         2  
  1         261  
11 1     1   9 use Mylisp::Estr;
  1         2  
  1         3880  
12            
13             sub OptSppAst {
14 0     0 0   my $ast = shift;
15 0 0         if (is_atom($ast)) {
16 0           return estr(opt_spp_atom($ast));
17             }
18 0           return map_opt_spp_atom($ast);
19             }
20            
21             sub map_opt_spp_atom {
22 0     0 0   my $atoms = shift;
23 0           return estr_strs([ map { opt_spp_atom($_) } @{atoms($atoms)} ]);
  0            
  0            
24             }
25            
26             sub opt_spp_atom {
27 0     0 0   my $atom = shift;
28 0           my ($name,$value) = flat($atom);
29 0           given ($name) {
30 0           when ('Spec') {
31 0           return opt_spp_spec($value);
32             }
33 0           when ('Rule') {
34 0           return opt_spp_spec($value);
35             }
36 0           when ('Group') {
37 0           return opt_spp_group($value);
38             }
39 0           when ('Branch') {
40 0           return opt_spp_branch($value);
41             }
42 0           when ('Cclass') {
43 0           return opt_spp_cclass($value);
44             }
45 0           when ('Char') {
46 0           return opt_spp_char($value);
47             }
48 0           when ('Str') {
49 0           return opt_spp_str($value);
50             }
51 0           when ('String') {
52 0           return opt_spp_str($value);
53             }
54 0           when ('Kstr') {
55 0           return opt_spp_kstr($value);
56             }
57 0           when ('Chclass') {
58 0           return opt_spp_chclass($value);
59             }
60 0           when ('Rept') {
61 0           return opt_spp_rept($value);
62             }
63 0           when ('Token') {
64 0           return opt_spp_token($value);
65             }
66 0           when ('Expr') {
67 0           return opt_spp_expr($value);
68             }
69 0           when ('Array') {
70 0           return opt_spp_array($value);
71             }
72 0           when ('Blank') {
73 0           return opt_spp_blank($value);
74             }
75 0           when ('Assert') {
76 0           return estr($name,$value);
77             }
78 0           when ('Till') {
79 0           return estr($name,$value);
80             }
81 0           when ('Any') {
82 0           return estr($name,$value);
83             }
84 0           default {
85 0           say "unknown Spp atom: |$name| to Opt";
86 0           return estr($name,$value);
87             }
88             }
89             }
90            
91             sub opt_spp_spec {
92 0     0 0   my $atoms = shift;
93 0           my ($token,$rules) = match($atoms);
94 0           my $name = value($token);
95 0           my $opt_rules = opt_spp_rules($rules);
96 0           return estr($name,$opt_rules);
97             }
98            
99             sub opt_spp_rules {
100 0     0 0   my $atoms = shift;
101 0           my $opt_atoms = opt_spp_atoms($atoms);
102 0 0         if (elen($opt_atoms) == 1) {
103 0           return substr($opt_atoms, 1,-1);
104             }
105 0           return estr('Rules',$opt_atoms);
106             }
107            
108             sub opt_spp_group {
109 0     0 0   my $atoms = shift;
110 0           my $opt_atoms = opt_spp_atoms($atoms);
111 0 0         if (elen($opt_atoms) == 1) {
112 0           return substr($opt_atoms, 1,-1);
113             }
114 0           return estr('Group',$opt_atoms);
115             }
116            
117             sub opt_spp_branch {
118 0     0 0   my $atoms = shift;
119 0           my $opt_atoms = opt_spp_atoms($atoms);
120 0 0         if (elen($opt_atoms) == 1) {
121 0           return substr($opt_atoms, 1,-1);
122             }
123 0           return estr('Branch',$opt_atoms);
124             }
125            
126             sub opt_spp_atoms {
127 0     0 0   my $atoms = shift;
128 0           return gather_spp_rept(gather_spp_till(map_opt_spp_atom($atoms)));
129             }
130            
131             sub opt_spp_kstr {
132 0     0 0   my $kstr = shift;
133 0           my $str = rest_str($kstr);
134 0 0         if (len($str) == 1) {
135 0           return estr('Char',$str);
136             }
137 0           return estr('Str',$str);
138             }
139            
140             sub opt_spp_cclass {
141 0     0 0   my $cclass = shift;
142 0           return estr('Cclass',last_char($cclass));
143             }
144            
145             sub opt_spp_char {
146 0     0 0   my $char = shift;
147 0           return estr('Char',opt_spp_ep($char));
148             }
149            
150             sub opt_spp_ep {
151 0     0 0   my $str = shift;
152 0           my $char = last_char($str);
153 0           given ($char) {
154 0           when ('n') {
155 0           return "\n";
156             }
157 0           when ('r') {
158 0           return "\r";
159             }
160 0           when ('t') {
161 0           return "\t";
162             }
163 0           default {
164 0           return $char;
165             }
166             }
167             }
168            
169             sub opt_spp_chclass {
170 0     0 0   my $nodes = shift;
171 0           my $atoms = [];
172 0           my $flip = 0;
173 0           for my $node (@{atoms($nodes)}) {
  0            
174 0           my ($name,$value) = flat($node);
175 0 0         if ($name eq 'Flip') {
176 0           $flip = 1;
177             }
178             else {
179 0           my $atom = opt_spp_catom($name,$value);
180 0           apush($atoms,$atom);
181             }
182             }
183 0 0         if ($flip == 0) {
184 0           return estr('Chclass',estr_strs($atoms));
185             }
186 0           return estr('Nclass',estr_strs($atoms));
187             }
188            
189             sub opt_spp_catom {
190 0     0 0   my ($name,$value) = @_;
191 0           given ($name) {
192 0           when ('Cclass') {
193 0           return opt_spp_cclass($value);
194             }
195 0           when ('Range') {
196 0           return opt_spp_range($value);
197             }
198 0           when ('Char') {
199 0           return opt_spp_cchar($value);
200             }
201 0           default {
202 0           return estr('Cchar',$value);
203             }
204             }
205             }
206            
207             sub opt_spp_cchar {
208 0     0 0   my $char = shift;
209 0           return estr('Cchar',opt_spp_ep($char));
210             }
211            
212             sub opt_spp_range {
213 0     0 0   my $atom = shift;
214 0           return estr('Range',estr_strs(asplit('-',$atom)));
215             }
216            
217             sub opt_spp_rept {
218 0     0 0   my $estr = shift;
219 0           return estr('rept',$estr);
220             }
221            
222             sub gather_spp_till {
223 0     0 0   my $atoms = shift;
224 0           my $opt_atoms = [];
225 0           my $flag = 0;
226 0           for my $atom (@{atoms($atoms)}) {
  0            
227 0 0         if ($flag == 0) {
228 0 0         if (is_till($atom)) {
229 0           $flag = 1;
230             }
231             else {
232 0           apush($opt_atoms,$atom);
233             }
234             }
235             else {
236 0 0         if (not(is_till($atom))) {
237 0           apush($opt_atoms,estr('Till',$atom));
238 0           $flag = 0;
239             }
240             }
241             }
242 0 0         if ($flag > 0) {
243 0           error("Till without token!");
244             }
245 0           return estr_strs($opt_atoms);
246             }
247            
248             sub is_till {
249 0     0 0   my $atom = shift;
250 0 0         if (is_atom_name($atom,'Till')) {
251 0           return 1;
252             }
253 0           return 0;
254             }
255            
256             sub gather_spp_rept {
257 0     0 0   my $atoms = shift;
258 0           my $opt_atoms = [];
259 0           my $flag = 0;
260 0           my $cache = '';
261 0           for my $atom (@{atoms($atoms)}) {
  0            
262 0 0         if ($flag == 0) {
263 0 0         if (not(is_rept($atom))) {
264 0           $cache = $atom;
265 0           $flag = 1;
266             }
267             }
268             else {
269 0 0         if (is_rept($atom)) {
270 0           my $rept = value($atom);
271 0           $cache = estr('Rept',estr($rept,$cache));
272 0           apush($opt_atoms,$cache);
273 0           $flag = 0;
274             }
275             else {
276 0           apush($opt_atoms,$cache);
277 0           $cache = $atom;
278             }
279             }
280             }
281 0 0         if ($flag == 1) {
282 0           apush($opt_atoms,$cache);
283             }
284 0           return estr_strs($opt_atoms);
285             }
286            
287             sub is_rept {
288 0     0 0   my $atom = shift;
289 0           return is_atom_name($atom,'rept');
290             }
291            
292             sub opt_spp_token {
293 0     0 0   my $name = shift;
294 0           my $char = first_char($name);
295 0 0         if (is_upper($char)) {
296 0           return estr('Ntoken',$name);
297             }
298 0 0         if (is_lower($char)) {
299 0           return estr('Ctoken',$name);
300             }
301 0           return estr('Rtoken',$name);
302             }
303            
304             sub opt_spp_str {
305 0     0 0   my $string = shift;
306 0           my $chars = [];
307 0           my $mode = 0;
308 0           my $value = substr($string, 1,-1);
309 0           for my $char (@{to_chars($value)}) {
  0            
310 0 0         if ($mode == 0) {
311 0 0         if ($char eq Ep) {
312 0           $mode = 1;
313             }
314             else {
315 0           apush($chars,$char);
316             }
317             }
318             else {
319 0           $mode = 0;
320 0           apush($chars,opt_spp_ep($char));
321             }
322             }
323 0           my $str = to_str($chars);
324 0 0         if (len($str) == 1) {
325 0           return estr('Char',$str);
326             }
327 0           return estr('Str',$str);
328             }
329            
330             sub opt_spp_expr {
331 0     0 0   my $atoms = shift;
332 0           my ($action,$args) = match($atoms);
333 0 0         if (is_atom_name($action,'Sub')) {
334 0           my $call = value($action);
335 0 0         if ($call ~~ ['push','my']) {
336 0           my $opt_args = map_opt_spp_atom($args);
337 0           my $expr = estr($call,$opt_args);
338 0           return estr('Call',$expr);
339             }
340             else {
341 0           croak("not implement action: |$call|");
342             }
343             }
344 0           my $action_str = estr_to_json($action);
345 0           croak("Expr not action: $action-str");
346 0           return '';
347             }
348            
349             sub opt_spp_array {
350 0     0 0   my $atoms = shift;
351 0 0         if (is_str($atoms)) {
352 0           return estr('Array',Blank);
353             }
354 0           my $opt_atoms = map_opt_spp_atom($atoms);
355 0           return estr('Array',$opt_atoms);
356             }
357            
358             sub opt_spp_blank {
359 0     0 0   my $blank = shift;
360 0           return estr('Blank','b');
361             }
362             1;