File Coverage

blib/lib/PPR/X.pm
Criterion Covered Total %
statement 23 40 57.5
branch 1 6 16.6
condition 3 14 21.4
subroutine 9 13 69.2
pod n/a
total 36 73 49.3


line stmt bran cond sub pod time code
1             package PPR::X;
2              
3 1     1   82373 use 5.010;
  1         19  
4 1     1   749 use if $] < 5.018004, re => 'eval';
  1         17  
  1         7  
5              
6             BEGIN {
7 1 50 33 1   159 if ($] >= 5.020 && $] <= 5.021) {
8 0         0 say {STDERR} <<" END_WARNING"
  0         0  
9             Warning: This program is running under Perl $^V and uses the PPR::X module.
10             Due to an unresolved issue with compilation of large regexes
11             in this version of Perl, your code is likely to compile
12             extremely slowly (i.e. it may take more than a minute).
13 0         0 PPR::X is being loaded at ${\join ' line ', (caller 2)[1,2]}.
14             END_WARNING
15             }
16             }
17 1     1   9 use warnings;
  1         2  
  1         60  
18             our $VERSION = '0.000013';
19 1     1   506 use utf8;
  1         17  
  1         7  
20              
21             # Class for $PPR::X::ERROR objects...
22             { package PPR::X::ERROR;
23              
24 1     1   1410 use overload q{""} => 'source', q{0+} => 'line', fallback => 1;
  1         1164  
  1         8  
25              
26             sub new {
27 1     1   9 my ($class, %obj) = @_;
28 1         9 return bless \%obj, $class;
29             }
30              
31 0     0   0 sub prefix { return shift->{prefix} }
32              
33 0     0   0 sub source { return shift->{source} }
34              
35 1     1   6 sub line { my $self = shift;
36 1   33     12 my $offset = $self->{line} // shift // 1;
      50        
37 1         21 return $offset + $self->{prefix} =~ tr/\n//;
38             }
39              
40 0     0     sub origin { my $self = shift;
41 0   0       my $line = shift // 0;
42 0   0       my $file = shift // "";
43 0           return bless { %{$self}, line => $line, file => $file }, ref($self);
  0            
44             }
45              
46 0     0     sub diagnostic { my $self = shift;
47             my $line = defined $self->{line}
48 0 0         ? $self->{line} + $self->{prefix} =~ tr/\n//
49             : 0;
50 0   0       my $file = $self->{file} // q{};
51 0 0         return q{} if eval "no strict;\n"
52             . "#line $line $file\n"
53             . "sub{ $self->{source} }";
54 0           my $diagnostic = $@;
55 0           $diagnostic =~ s{ \s*+ \bat \s++ \( eval \s++ \d++ \) \s++ line \s++ 0,
56             | \s*+ \( eval \s++ \d++ \)
57             | \s++ \Z
58             }{}gx;
59 0           return $diagnostic;
60             }
61             }
62              
63             # Define the grammar...
64             our $GRAMMAR = qr{
65             (?(DEFINE)
66              
67             (? (?
68             \x{FEFF}?+ # Optional BOM marker
69             (?>(?&PerlOWS))
70             (?: (?>(?&PerlStatement)) (?&PerlOWS) )*+
71             )) # End of rule
72              
73             (? (?
74             (?: (?>(?&PerlPod)) (?&PerlOWS) )?+
75             (?>
76             (?: (?>(?&PerlLabel)) (?&PerlOWS) )?+
77             (?: (?>(?&PerlPod)) (?&PerlOWS) )?+
78             (?>
79             (?&PerlKeyword)
80             |
81             # Inlined (?&PerlSubroutineDeclaration)...
82             (?>
83             sub \b (?>(?&PerlOWS))
84             (?>(?&PerlOldQualifiedIdentifier)) (?&PerlOWS)
85             |
86             AUTOLOAD (?&PerlOWS)
87             |
88             DESTROY (?&PerlOWS)
89             )
90             (?:
91             (?>
92             (?&PerlParenthesesList) # Parameter list
93             |
94             \( [^)]*+ \) # Prototype (
95             ) (?&PerlOWS)
96             )?+
97             (?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
98             (?> ; | (?&PerlBlock) )
99             |
100             # Inlined (?&PerlUseStatement)...
101             (?: use | no ) (?>(?&PerlNWS))
102             (?>
103             (?&PerlVersionNumber)
104             |
105             (?>(?&PerlQualifiedIdentifier))
106             (?: (?>(?&PerlNWS)) (?&PerlVersionNumber)
107             (?! (?>(?&PerlOWS)) (?> (?&PerlInfixBinaryOperator) | (?&PerlComma) | \? ) )
108             )?+
109             (?: (?>(?&PerlNWS)) (?&PerlPod) )?+
110             (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
111             )
112             (?>(?&PerlOWS)) (?> ; | (?= \} | \z ))
113             |
114             # Inlined (?&PerlPackageDeclaration)...
115             package
116             (?>(?&PerlNWS)) (?>(?&PerlQualifiedIdentifier))
117             (?: (?>(?&PerlNWS)) (?&PerlVersionNumber) )?+
118             (?>(?&PerlOWS)) (?> ; | (?&PerlBlock) | (?= \} | \z ))
119             |
120             (?&PerlControlBlock)
121             |
122             (?&PerlFormat)
123             |
124             (?>(?&PerlExpression)) (?>(?&PerlOWS))
125             (?&PerlStatementModifier)?+ (?>(?&PerlOWS))
126             (?> ; | (?= \} | \z ))
127             |
128             (?&PerlBlock)
129             |
130             ;
131             )
132              
133             | # A yada-yada...
134             \.\.\. (?>(?&PerlOWS))
135             (?> ; | (?= \} | \z ))
136              
137             | # Just a Label...
138             (?>(?&PerlLabel)) (?>(?&PerlOWS))
139             (?> ; | (?= \} | \z ))
140              
141             | # Just an empty statement...
142             (?>(?&PerlOWS)) ;
143              
144             | # An error (report it, if it's the first)...
145             (?(?{ !defined $PPR::X::ERROR })
146             (?> (?&PerlOWS) )
147             (?! (?: \} | \z ) )
148             (?{ pos() })
149             ( (?&PerlExpression) (?&PerlOWS) [^\n]++ | [^;\}]++ )
150             (?{ $PPR::X::ERROR //= PPR::X::ERROR->new(source => $^N, prefix => substr($_, 0, $^R) ) })
151             (?!)
152             )
153             )
154             )) # End of rule
155              
156             (? (?
157             (?>
158             sub \b (?>(?&PerlOWS))
159             (?>(?&PerlOldQualifiedIdentifier)) (?&PerlOWS)
160             |
161             AUTOLOAD (?&PerlOWS)
162             |
163             DESTROY (?&PerlOWS)
164             )
165             (?:
166             (?>
167             (?&PerlParenthesesList) # Parameter list
168             |
169             \( [^)]*+ \) # Prototype (
170             ) (?&PerlOWS)
171             )?+
172             (?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
173             (?> ; | (?&PerlBlock) )
174             )) # End of rule
175              
176             (? (?
177             (?: use | no ) (?>(?&PerlNWS))
178             (?>
179             (?&PerlVersionNumber)
180             |
181             (?>(?&PerlQualifiedIdentifier))
182             (?: (?>(?&PerlNWS)) (?&PerlVersionNumber)
183             (?! (?>(?&PerlOWS)) (?> (?&PerlInfixBinaryOperator) | (?&PerlComma) | \? ) )
184             )?+
185             (?: (?>(?&PerlNWS)) (?&PerlPod) )?+
186             (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
187             )
188             (?>(?&PerlOWS)) (?> ; | (?= \} | \z ))
189             )) # End of rule
190              
191             (? (?
192             return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
193             (?>(?&PerlOWS)) (?> ; | (?= \} | \z ))
194             )) # End of rule
195              
196             (? (?
197             package
198             (?>(?&PerlNWS)) (?>(?&PerlQualifiedIdentifier))
199             (?: (?>(?&PerlNWS)) (?&PerlVersionNumber) )?+
200             (?>(?&PerlOWS)) (?> ; | (?&PerlBlock) | (?= \} | \z ))
201             )) # End of rule
202              
203             (? (?
204             (?>(?&PerlLowPrecedenceNotExpression))
205             (?: (?>(?&PerlOWS)) (?>(?&PerlLowPrecedenceInfixOperator))
206             (?>(?&PerlOWS)) (?&PerlLowPrecedenceNotExpression) )*+
207             )) # End of rule
208              
209              
210             (? (?
211             (?: not \b (?&PerlOWS) )*+ (?&PerlCommaList)
212             )) # End of rule
213              
214             (? (?
215             (?>(?&PerlAssignment)) (?>(?&PerlOWS))
216             (?:
217             (?: (?>(?&PerlComma)) (?&PerlOWS) )++
218             (?>(?&PerlAssignment)) (?>(?&PerlOWS))
219             )*+
220             (?: (?>(?&PerlComma)) (?&PerlOWS) )*+
221             )) # End of rule
222              
223             (? (?
224             (?>(?&PerlConditionalExpression))
225             (?:
226             (?>(?&PerlOWS)) (?>(?&PerlAssignmentOperator))
227             (?>(?&PerlOWS)) (?&PerlConditionalExpression)
228             )*+
229             )) # End of rule
230              
231             (? (?
232             (? (?
233             (?>(?&PerlBinaryExpression))
234             (?:
235             (?>(?&PerlOWS)) \? (?>(?&PerlOWS)) (?>(?&PerlAssignment))
236             (?>(?&PerlOWS)) : (?>(?&PerlOWS)) (?&PerlConditionalExpression)
237             )?+
238             )) # End of rule
239             )) # End of rule
240              
241             (? (?
242             (?>(?&PerlPrefixPostfixTerm))
243             (?: (?>(?&PerlOWS)) (?>(?&PerlInfixBinaryOperator))
244             (?>(?&PerlOWS)) (?&PerlPrefixPostfixTerm) )*+
245             )) # End of rule
246              
247             (? (?
248             (?: (?>(?&PerlPrefixUnaryOperator)) (?&PerlOWS) )*+
249             (?>(?&PerlTerm))
250             (?:
251             (?>(?&PerlOWS)) -> (?>(?&PerlOWS))
252             (?>
253             (?> (?&PerlQualifiedIdentifier) | (?&PerlVariableScalar) )
254             (?: (?>(?&PerlOWS)) (?&PerlParenthesesList) )?+
255              
256             | (?&PerlParenthesesList)
257             | (?&PerlArrayIndexer)
258             | (?&PerlHashIndexer)
259             )
260              
261             (?:
262             (?>(?&PerlOWS))
263             (?>
264             -> (?>(?&PerlOWS))
265             (?> (?&PerlQualifiedIdentifier) | (?&PerlVariableScalar) )
266             (?: (?>(?&PerlOWS)) (?&PerlParenthesesList) )?+
267             |
268             (?: -> (?&PerlOWS) )?+
269             (?> (?&PerlParenthesesList)
270             | (?&PerlArrayIndexer)
271             | (?&PerlHashIndexer)
272             )
273             )
274             )*+
275             (?:
276             (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\@%]
277             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
278             )?+
279             )?+
280             (?: (?>(?&PerlOWS)) (?&PerlPostfixUnaryOperator) )?+
281             )) # End of rule
282              
283             (? (?
284             (?>
285             \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier)
286             |
287             \( (?>(?&PerlOWS))
288             (?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
289             (?:
290             (?>(?&PerlComma)) (?>(?&PerlOWS))
291             (?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
292             )*+
293             (?: (?>(?&PerlComma)) (?&PerlOWS) )?+
294             \)
295             )
296             )) # End of rule
297              
298             (? (?
299             (?>
300             # Inlined (?&PerlReturnStatement)...
301             return \b (?>(?&PerlOWS)) (?&PerlExpression)
302             |
303             # Inlined (?&PerlVariableDeclaration)...
304             (?> my | state | our ) \b (?>(?&PerlOWS))
305             (?: (?&PerlQualifiedIdentifier) (?&PerlOWS) )?+
306             (?>(?&PerlLvalue)) (?>(?&PerlOWS))
307             (?&PerlAttributes)?+
308             |
309             (?&PerlAnonymousSubroutine)
310             |
311             (?&PerlVariable)
312             |
313             (?>(?&PerlNullaryBuiltinFunction)) (?! (?>(?&PerlOWS)) \( )
314             |
315             # Inlined (?&PerlDoBlock) and (?&PerlEvalBlock)...
316             (?> do | eval ) (?>(?&PerlOWS)) (?&PerlBlock)
317             |
318             (?&PerlCall)
319             |
320             (?&PerlTypeglob)
321             |
322             (?>(?&PerlParenthesesList))
323             (?: (?>(?&PerlOWS)) (?&PerlArrayIndexer) )?+
324             (?:
325             (?>(?&PerlOWS))
326             (?>
327             (?&PerlArrayIndexer)
328             | (?&PerlHashIndexer)
329             )
330             )*+
331             |
332             (?&PerlAnonymousArray)
333             |
334             (?&PerlAnonymousHash)
335             |
336             (?&PerlDiamondOperator)
337             |
338             (?&PerlContextualMatch)
339             |
340             (?&PerlQuotelikeS)
341             |
342             (?&PerlQuotelikeTR)
343             |
344             (?&PerlQuotelikeQX)
345             |
346             (?&PerlLiteral)
347             )
348             )) # End of rule
349              
350             (? (?
351             (?> # Conditionals...
352             (?> if | unless ) \b (?>(?&PerlOWS))
353             (?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
354             (?>(?&PerlBlock))
355              
356             (?:
357             (?>(?&PerlOWS))
358             (?: (?>(?&PerlPod)) (?&PerlOWS) )*+
359             elsif \b (?>(?&PerlOWS))
360             (?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
361             (?&PerlBlock)
362             )*+
363              
364             (?:
365             (?>(?&PerlOWS))
366             (?: (?>(?&PerlPod)) (?&PerlOWS) )*+
367             else \b (?>(?&PerlOWS))
368             (?&PerlBlock)
369             )?+
370              
371             | # Loops...
372             (?>
373             for(?:each)?+ \b
374             (?>(?&PerlOWS))
375             (?:
376             (?:
377             (?: \\ (?>(?&PerlOWS)) (?> my | our | state )?+
378             | (?> my | our | state ) (?: (?>(?&PerlOWS)) \\ )?+
379             )?+
380             (?>(?&PerlOWS)) (?&PerlVariableScalar)
381             )?+
382             (?>(?&PerlOWS))
383             (?> (?&PerlParenthesesList) | (?&PerlQuotelikeQW) )
384             |
385             (?&PPR_X_three_part_list)
386             )
387             |
388             (?> while | until) \b (?>(?&PerlOWS))
389             (?&PerlParenthesesList)
390             )
391              
392             (?>(?&PerlOWS))
393             (?>(?&PerlBlock))
394              
395             (?:
396             (?>(?&PerlOWS)) continue
397             (?>(?&PerlOWS)) (?&PerlBlock)
398             )?+
399              
400             | # Phasers...
401             (?> BEGIN | END | CHECK | INIT | UNITCHECK ) \b (?>(?&PerlOWS))
402             (?&PerlBlock)
403              
404             | # Switches...
405             (?> given | when ) \b (?>(?&PerlOWS))
406             (?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
407             (?&PerlBlock)
408             |
409             default (?>(?&PerlOWS))
410             (?&PerlBlock)
411             )
412             )) # End of rule
413              
414             (? (?
415             format
416             (?: (?>(?&PerlNWS)) (?&PerlQualifiedIdentifier) )?+
417             (?>(?&PerlOWS)) = [^\n]*+
418             (?&PPR_X_newline_and_heredoc)
419             (?:
420             (?! \. \n )
421             [^\n\$\@]*+
422             (?:
423             (?>
424             (?= \$ (?! \s ) ) (?&PerlScalarAccessNoSpace)
425             |
426             (?= \@ (?! \s ) ) (?&PerlArrayAccessNoSpace)
427             )
428             [^\n\$\@]*+
429             )*+
430             (?&PPR_X_newline_and_heredoc)
431             )*+
432             \. (?&PerlEndOfLine)
433             )) # End of rule
434              
435             (? (?
436             (?> if | for(?:each)?+ | while | unless | until | when )
437             \b
438             (?>(?&PerlOWS))
439             (?&PerlExpression)
440             )) # End of rule
441              
442             (? (?
443             \{ (?>(?&PerlOWS))
444             (?: (?>(?&PerlStatement)) (?&PerlOWS) )*+
445             (?: (?>(?&PerlPod)) (?&PerlOWS) )?+
446             \}
447             )) # End of rule
448              
449             (? (?
450             (?>
451             [&] (?>(?&PerlOWS))
452             (?> (?&PerlBlock)
453             | (?&PerlVariableScalar)
454             | (?&PerlQualifiedIdentifier)
455             ) (?>(?&PerlOWS))
456             (?:
457             \( (?>(?&PerlOWS))
458             (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
459             \)
460             )?+
461             |
462             - (?>(?&PPR_X_filetest_name)) (?>(?&PerlOWS))
463             (?&PerlPrefixPostfixTerm)?+
464             |
465             (?>(?&PerlBuiltinFunction)) (?>(?&PerlOWS))
466             (?>
467             \( (?>(?&PerlOWS))
468             (?>
469             (?= (?>(?&PPR_X_non_reserved_identifier))
470             (?>(?&PerlOWS))
471             (?! \( | (?&PerlComma) )
472             )
473             (?&PerlCall)
474             |
475             (?>(?&PerlBlock)) (?>(?&PerlOWS))
476             (?&PerlExpression)?+
477             |
478             (?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
479             (?&PerlExpression)
480             |
481             (?&PerlExpression)?+
482             ) (?>(?&PerlOWS))
483             \)
484             |
485             (?>
486             (?=
487             (?>(?&PPR_X_non_reserved_identifier))
488             (?>(?&PerlOWS))
489             (?! \( | (?&PerlComma) )
490             )
491             (?&PerlCall)
492             |
493             (?>(?&PerlBlock)) (?>(?&PerlOWS))
494             (?&PerlCommaList)?+
495             |
496             (?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
497             (?&PerlCommaList)
498             |
499             (?&PerlCommaList)?+
500             )
501             )
502             |
503             (?>(?&PPR_X_non_reserved_identifier)) (?>(?&PerlOWS))
504             (?>
505             \( (?>(?&PerlOWS))
506             (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
507             \)
508             |
509             (?>
510             (?=
511             (?>(?&PPR_X_non_reserved_identifier))
512             (?>(?&PerlOWS))
513             (?! \( | (?&PerlComma) )
514             )
515             (?&PerlCall)
516             |
517             (?>(?&PerlBlock)) (?>(?&PerlOWS))
518             (?&PerlCommaList)?+
519             |
520             (?>(?&PPR_X_indirect_obj)) (?&PerlNWS)
521             (?&PerlCommaList)
522             |
523             (?&PerlCommaList)?+
524             )
525             )
526             )
527             )) # End of rule
528              
529             (? (?
530             (?> my | state | our ) \b (?>(?&PerlOWS))
531             (?: (?&PerlQualifiedIdentifier) (?&PerlOWS) )?+
532             (?>(?&PerlLvalue)) (?>(?&PerlOWS))
533             (?&PerlAttributes)?+
534             )) # End of rule
535              
536             (? (?
537             do (?>(?&PerlOWS)) (?&PerlBlock)
538             )) # End of rule
539              
540             (? (?
541             eval (?>(?&PerlOWS)) (?&PerlBlock)
542             )) # End of rule
543              
544             (? (?
545             :
546             (?>(?&PerlOWS))
547             (?>(?&PerlIdentifier))
548             (?:
549             (?= \( ) (?&PPR_X_quotelike_body)
550             )?+
551              
552             (?:
553             (?> (?>(?&PerlOWS)) : (?&PerlOWS) | (?&PerlNWS) )
554             (?>(?&PerlIdentifier))
555             (?:
556             (?= \( ) (?&PPR_X_quotelike_body)
557             )?+
558             )*+
559             )) # End of rule
560              
561             (? (?
562             (?> (?&PerlParenthesesList) | (?&PerlCommaList) )
563             )) # End of rule
564              
565             (? (?
566             \( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \)
567             )) # End of rule
568              
569             (? (?
570             \[ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \]
571             )) # End of rule
572              
573             (? (?
574             \{ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \}
575             )) # End of rule
576              
577             (? (?
578             \[ (?>(?&PerlOWS))
579             (?>(?&PerlExpression)) (?>(?&PerlOWS))
580             \]
581             )) # End of rule
582              
583             (? (?
584             \{ (?>(?&PerlOWS))
585             (?: -?+ (?&PerlIdentifier) | (?&PerlExpression) ) # (Note: MUST allow backtracking here)
586             (?>(?&PerlOWS))
587             \}
588             )) # End of rule
589              
590             (? (?
591             <<>> # Perl 5.22 "double diamond"
592             |
593             < (?! < )
594             (?>(?&PPR_X_balanced_angles))
595             >
596             (?=
597             (?>(?&PerlOWS))
598             (?> \z | [,;\}\])?] | => | : (?! :) # (
599             | (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
600             | (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
601             )
602             )
603             )) # End of rule
604              
605             (? (?
606             (?> , | => )
607             )) # End of rule
608              
609             (? (?
610             (?> [!\\+~] | \+\+ | -- | - (?! (?&PPR_X_filetest_name) \b ) )
611             )) # End of rule
612              
613             (? (?
614             (?> \+\+ | -- )
615             )) # End of rule
616              
617             (? (?
618             (?> [=!][~=]
619             | cmp
620             | <= >?+
621             | >=
622             | [lg][te]
623             | eq
624             | ne
625             | [+] (?! [+=] )
626             | - (?! [-=] )
627             | [.]{2,3}+
628             | [.%x] (?! [=] )
629             | [&|^][.] (?! [=] )
630             | [<>*&|/]{1,2}+ (?! [=] )
631             | \^ (?! [=] )
632             | ~~
633             )
634             )) # End of rule
635              
636             (? (?
637             (?: [<>*&|/]{2}
638             | [-+.*/%x]
639             | [&|^][.]?+
640             )?+
641             =
642             (?! > )
643             )) # End of rule
644              
645             (? (?
646             (?> or | and | xor )
647             )) # End of rule
648              
649             (? (?
650             sub \b
651             (?>(?&PerlOWS))
652             (?:
653             (?>
654             (?&PerlParenthesesList) # Parameter list
655             |
656             \( [^)]*+ \) # Prototype (
657             )
658             (?&PerlOWS)
659             )?+
660             (?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
661             (?&PerlBlock)
662             )) # End of rule
663              
664             (? (?
665             (?= [\$\@%] )
666             (?>
667             (?&PerlScalarAccess)
668             | (?&PerlHashAccess)
669             | (?&PerlArrayAccess)
670             )
671             )) # End of rule
672              
673             (? (?
674             \*
675             (?>
676             \d++
677             |
678             \^ [][A-Z^_?\\]
679             |
680             \{ \^ [A-Z_] \w*+ \}
681             |
682             (?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
683             |
684             (?&PerlVariableScalar)
685             |
686             [][!"#\$%&'()*+,./:;<=>?\@\^`|~-]
687             |
688             (?&PerlBlock)
689             )
690             (?:
691             (?>(?&PerlOWS)) (?: -> (?&PerlOWS) )?+
692             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
693             )*+
694             (?:
695             (?>(?&PerlOWS)) -> (?>(?&PerlOWS))
696             [\@%]
697             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
698             )?+
699             )) # End of rule
700              
701             (? (?
702             (?>(?&PerlVariableArray))
703             (?:
704             (?>(?&PerlOWS)) (?: -> (?&PerlOWS) )?+
705             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
706             )*+
707             (?:
708             (?>(?&PerlOWS)) -> (?>(?&PerlOWS))
709             [\@%]
710             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
711             )?+
712             )) # End of rule
713              
714             (? (?
715             (?>(?&PerlVariableArrayNoSpace))
716             (?:
717             (?: -> )?+
718             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
719             )*+
720             (?:
721             ->
722             [\@%]
723             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
724             )?+
725             )) # End of rule
726              
727             (? (?
728             (?>(?&PerlVariableArray))
729             (?:
730             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
731             )*+
732             )) # End of rule
733              
734             (? (?
735             (?>(?&PerlVariableHash))
736             (?:
737             (?>(?&PerlOWS)) (?: -> (?&PerlOWS) )?+
738             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
739             )*+
740             (?:
741             (?>(?&PerlOWS)) -> (?>(?&PerlOWS))
742             [\@%]
743             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
744             )?+
745             )) # End of rule
746              
747             (? (?
748             (?>(?&PerlVariableScalar))
749             (?:
750             (?>(?&PerlOWS))
751             (?:
752             (?:
753             (?>(?&PerlOWS)) -> (?>(?&PerlOWS))
754             (?&PerlParenthesesList)
755             |
756             (?>(?&PerlOWS)) (?: -> (?&PerlOWS) )?+
757             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
758             )
759             (?:
760             (?>(?&PerlOWS)) (?: -> (?&PerlOWS) )?+
761             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
762             )*+
763             )?+
764             (?:
765             (?>(?&PerlOWS)) -> (?>(?&PerlOWS))
766             [\@%]
767             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
768             )?+
769             )?+
770             )) # End of rule
771              
772             (? (?
773             (?>(?&PerlVariableScalarNoSpace))
774             (?:
775             (?:
776             (?:
777             ->
778             (?&PerlParenthesesList)
779             |
780             (?: -> )?+
781             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
782             )
783             (?:
784             (?: -> )?+
785             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
786             )*+
787             )?+
788             (?:
789             ->
790             [\@%]
791             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
792             )?+
793             )?+
794             )) # End of rule
795              
796             (? (?
797             (?>(?&PerlVariableScalarNoSpace))
798             (?:
799             (?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
800             )*+
801             )) # End of rule
802              
803             (? (?
804             \$\$
805             (?! [\$\{\w] )
806             |
807             (?:
808             \$
809             (?:
810             [#]
811             (?= (?> [\$^\w\{:+] | - (?! > ) ) )
812             )?+
813             (?&PerlOWS)
814             )++
815             (?>
816             \d++
817             |
818             \^ [][A-Z^_?\\]
819             |
820             \{ \^ [A-Z_] \w*+ \}
821             |
822             (?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
823             |
824             :: (?&PerlBlock)
825             |
826             [][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
827             |
828             \{ [!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-] \}
829             |
830             \{ \w++ \}
831             |
832             (?&PerlBlock)
833             )
834             |
835             \$\#
836             )) # End of rule
837              
838             (? (?
839             \$\$
840             (?! [\$\{\w] )
841             |
842             (?:
843             \$
844             (?:
845             [#]
846             (?= (?> [\$^\w\{:+] | - (?! > ) ) )
847             )?+
848             )++
849             (?>
850             \d++
851             |
852             \^ [][A-Z^_?\\]
853             |
854             \{ \^ [A-Z_] \w*+ \}
855             |
856             (?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
857             |
858             :: (?&PerlBlock)
859             |
860             [][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
861             |
862             \{ \w++ \}
863             |
864             (?&PerlBlock)
865             )
866             |
867             \$\#
868             )) # End of rule
869              
870             (? (?
871             \@ (?>(?&PerlOWS))
872             (?: \$ (?&PerlOWS) )*+
873             (?>
874             \d++
875             |
876             \^ [][A-Z^_?\\]
877             |
878             \{ \^ [A-Z_] \w*+ \}
879             |
880             (?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
881             |
882             :: (?&PerlBlock)
883             |
884             [][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
885             |
886             (?&PerlBlock)
887             )
888             )) # End of rule
889              
890             (? (?
891             \@
892             (?: \$ )*+
893             (?>
894             \d++
895             |
896             \^ [][A-Z^_?\\]
897             |
898             \{ \^ [A-Z_] \w*+ \}
899             |
900             (?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
901             |
902             :: (?&PerlBlock)
903             |
904             [][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
905             |
906             (?&PerlBlock)
907             )
908             )) # End of rule
909              
910             (? (?
911             % (?>(?&PerlOWS))
912             (?: \$ (?&PerlOWS) )*+
913             (?>
914             \d++
915             |
916             \^ [][A-Z^_?\\]
917             |
918             \{ \^ [A-Z_] \w*+ \}
919             |
920             (?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
921             |
922             :: (?&PerlBlock)?+
923             |
924             [][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
925             |
926             (?&PerlBlock)
927             )
928             )) # End of rule
929              
930             (? (?
931             (?! (?> [msy] | q[wrxq]?+ | tr ) \b )
932             (?>(?&PerlIdentifier))
933             : (?! : )
934             )) # End of rule
935              
936             (? (?
937             (?> (?&PerlString)
938             | (?&PerlQuotelikeQR)
939             | (?&PerlQuotelikeQW)
940             | (?&PerlNumber)
941             | (?&PerlBareword)
942             )
943             )) # End of rule
944              
945             (? (?
946             (?>
947             " [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
948             |
949             ' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
950             |
951             qq \b
952             (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
953             (?&PPR_X_quotelike_body_interpolated)
954             |
955             q \b
956             (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
957             (?&PPR_X_quotelike_body)
958             |
959             (?&PerlHeredoc)
960             |
961             (?&PerlVString)
962             )
963             )) # End of rule
964              
965             (? (?
966             (?> (?&PerlString)
967             | (?&PerlQuotelikeQR)
968             | (?&PerlQuotelikeQW)
969             | (?&PerlQuotelikeQX)
970             | (?&PerlContextualMatch)
971             | (?&PerlQuotelikeS)
972             | (?&PerlQuotelikeTR)
973             )
974             )) # End of rule
975              
976             (? (?
977             # Match the introducer...
978             <<
979             (?<_heredoc_indented> [~]?+ )
980              
981             # Match the terminator specification...
982             (?>
983             \\?+ (?<_heredoc_terminator> (?&PerlIdentifier) )
984             |
985             (?>(?&PerlOWS))
986             (?>
987             " (?<_heredoc_terminator> [^"\\]*+ (?: \\. [^"\\]*+ )*+ ) " #"
988             |
989             (? ' )
990             (?<_heredoc_terminator> [^'\\]*+ (?: \\. [^'\\]*+ )*+ ) ' #'
991             |
992             ` (?<_heredoc_terminator> [^`\\]*+ (?: \\. [^`\\]*+ )*+ ) ` #`
993             )
994             |
995             (?<_heredoc_terminator> )
996             )
997              
998             # Do we need to reset the heredoc cache???
999             (?{
1000             if ( ($PPR::X::_heredoc_origin // q{}) ne $_ ) {
1001             %PPR::X::_heredoc_skip = ();
1002             %PPR::X::_heredoc_parsed_to = ();
1003             $PPR::X::_heredoc_origin = $_;
1004             }
1005             })
1006              
1007             # Do we need to cache content lookahead for this heredoc???
1008             (?(?{ my $need_to_lookahead = !$PPR::X::_heredoc_parsed_to{+pos()};
1009             $PPR::X::_heredoc_parsed_to{+pos()} = 1;
1010             $need_to_lookahead;
1011             })
1012              
1013             # Lookahead to detect and remember trailing contents of heredoc
1014             (?=
1015             [^\n]*+ \n # Go to the end of the current line
1016             (?{ +pos() }) # Remember the start of the contents
1017             (??{ $PPR::X::_heredoc_skip{+pos()} // q{} }) # Skip earlier heredoc contents
1018             (?> # The heredoc contents consist of...
1019             (?:
1020             (?!
1021 1     1   2239 (?(?{ $+{_heredoc_indented} }) \h*+ ) # An indent (if it was a <<~)
  1         406  
  1         42906  
1022             \g{_heredoc_terminator} # The terminator
1023             (?: \n | \z ) # At an end-of-line
1024             )
1025             (?()
1026             [^\n]*+ \n
1027             |
1028             [^\n\$\@]*+
1029             (?:
1030             (?>
1031             (?{ local $PPR::X::_heredoc_EOL_start = $^R })
1032             (?= \$ (?! \s ) ) (?&PerlScalarAccessNoSpace)
1033             (?{ $PPR::X::_heredoc_EOL_start })
1034             |
1035             (?{ local $PPR::X::_heredoc_EOL_start = $^R })
1036             (?= \@ (?! \s ) ) (?&PerlArrayAccessNoSpace)
1037             (?{ $PPR::X::_heredoc_EOL_start })
1038             )
1039             [^\n\$\@]*+
1040             )*+
1041             \n (??{ $PPR::X::_heredoc_skip{+pos()} // q{} })
1042             )
1043             )*+
1044              
1045             (?(?{ $+{_heredoc_indented} }) \h*+ ) # An indent (if it was a <<~)
1046             \g{_heredoc_terminator} # The specified terminator
1047             (?: \n | \z ) # Followed by EOL
1048             )
1049              
1050             # Then memoize the skip for when it's subsequently needed by PerlOWS or PerlNWS...
1051             (?{
1052             $PPR::X::_heredoc_skip{$^R} = "(?s:.\{" . (pos() - $^R) . "\})";
1053             })
1054             )
1055             )
1056              
1057             )) # End of rule
1058              
1059             (? (?
1060             (?>
1061             ' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
1062             |
1063             \b q \b
1064             (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
1065             (?&PPR_X_quotelike_body)
1066             )
1067             )) # End of rule
1068              
1069             (? (?
1070             (?>
1071             " [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
1072             |
1073             \b qq \b
1074             (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
1075             (?&PPR_X_quotelike_body_interpolated)
1076             )
1077             )) # End of rule
1078              
1079             (? (?
1080             (?>
1081             qw \b
1082             (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
1083             (?&PPR_X_quotelike_body)
1084             )
1085             )) # End of rule
1086              
1087             (? (?
1088             (?>
1089             ` [^`]*+ (?: \\. [^`]*+ )*+ `
1090             |
1091             qx
1092             (?:
1093             (?&PerlOWS) ' (?&PPR_X_quotelike_body)
1094             |
1095             \b (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
1096             (?&PPR_X_quotelike_body_interpolated)
1097             )
1098             )
1099             )) # End of rule
1100              
1101             (? (?
1102             (? (?
1103             s \b
1104             (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
1105             (?>
1106             # Hashed syntax...
1107             (?= [#] )
1108             (?>(?&PPR_X_quotelike_body_interpolated_unclosed))
1109             (?&PPR_X_quotelike_s_e_check)
1110             (?>(?&PPR_X_quotelike_body_interpolated))
1111             |
1112             # Bracketed syntax...
1113             (?= (?>(?&PerlOWS)) [\[(<\{] ) # )
1114             (?>(?&PPR_X_quotelike_body_interpolated))
1115             (?>(?&PerlOWS))
1116             (?&PPR_X_quotelike_s_e_check)
1117             (?>(?&PPR_X_quotelike_body_interpolated))
1118             |
1119             # Delimited syntax...
1120             (?>(?&PPR_X_quotelike_body_interpolated_unclosed))
1121             (?&PPR_X_quotelike_s_e_check)
1122             (?>(?&PPR_X_quotelike_body_interpolated))
1123             )
1124             [msixpodualgcern]*+
1125             )) # End of rule
1126             )) # End of rule
1127              
1128             (? (?
1129             (? (?
1130             (?> tr | y ) \b
1131             (?! (?>(?&PerlOWS)) => )
1132             (?>
1133             # Hashed syntax...
1134             (?= [#] )
1135             (?>(?&PPR_X_quotelike_body_interpolated_unclosed))
1136             (?&PPR_X_quotelike_body_interpolated)
1137             |
1138             # Bracketed syntax...
1139             (?= (?>(?&PerlOWS)) [\[(<\{] ) # )
1140             (?>(?&PPR_X_quotelike_body_interpolated))
1141             (?>(?&PerlOWS))
1142             (?&PPR_X_quotelike_body_interpolated)
1143             |
1144             # Delimited syntax...
1145             (?>(?&PPR_X_quotelike_body_interpolated_unclosed))
1146             (?&PPR_X_quotelike_body_interpolated)
1147             )
1148             [cdsr]*+
1149             )) # End of rule
1150             )) # End of rule
1151              
1152             (? (?
1153             (? (?
1154             (?
1155             (?
1156             (?>
1157             \/\/
1158             |
1159             (?>
1160             m (?= [#] )
1161             |
1162             m \b
1163             (?! (?>(?&PerlOWS)) => )
1164             |
1165             (?= \/ [^/] )
1166             )
1167             (?&PPR_X_quotelike_body_interpolated)
1168             )
1169             [msixpodualgcn]*+
1170             ) # End of rule
1171             ) # End of rule
1172             (?=
1173             (?>(?&PerlOWS))
1174             (?> \z | [,;\}\])?] | => | : (?! :)
1175             | (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
1176             | (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
1177             )
1178             )
1179             )) # End of rule
1180             )) # End of rule
1181              
1182             (? (?
1183             qr \b
1184             (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
1185             (?>(?&PPR_X_quotelike_body_interpolated))
1186             [msixpodualn]*+
1187             )) # End of rule
1188              
1189             (? (?
1190             (?>
1191             (?&PerlMatch)
1192             |
1193             (?&PerlQuotelikeQR)
1194             )
1195             )) # End of rule
1196              
1197             (? (?
1198             (?>
1199             (?&PerlContextualMatch)
1200             |
1201             (?&PerlQuotelikeQR)
1202             )
1203             )) # End of rule
1204              
1205              
1206             (? (?
1207             # Optimized to match any Perl builtin name, without backtracking...
1208             (?=[^\W\d]) # Skip if possible
1209             (?>
1210             s(?>e(?>t(?>(?>(?>(?>hos|ne)t|gr)en|s(?>erven|ockop))t|p(?>r(?>iority|otoent)|went|grp))|m(?>ctl|get|op)|ek(?>dir)?|lect|nd)|y(?>s(?>write|call|open|read|seek|tem)|mlink)|h(?>m(?>write|read|ctl|get)|utdown|ift)|o(?>cket(?>pair)?|rt)|p(?>li(?>ce|t)|rintf)|(?>cala|ubst)r|t(?>ate?|udy)|leep|rand|qrt|ay|in)
1211             | g(?>et(?>p(?>r(?>oto(?>byn(?>umber|ame)|ent)|iority)|w(?>ent|nam|uid)|eername|grp|pid)|s(?>erv(?>by(?>name|port)|ent)|ock(?>name|opt))|host(?>by(?>addr|name)|ent)|net(?>by(?>addr|name)|ent)|gr(?>ent|gid|nam)|login|c)|mtime|lob|oto|rep)
1212             | r(?>e(?>ad(?>lin[ek]|pipe|dir)?|(?>quir|vers|nam)e|winddir|turn|set|cv|do|f)|index|mdir|and)
1213             | c(?>h(?>o(?>m?p|wn)|r(?>oot)?|dir|mod)|o(?>n(?>tinue|nect)|s)|lose(?>dir)?|aller|rypt)
1214             | e(?>nd(?>(?>hos|ne)t|p(?>roto|w)|serv|gr)ent|x(?>i(?>sts|t)|ec|p)|ach|val(?>bytes)?+|of)
1215             | l(?>o(?>c(?>al(?>time)?|k)|g)|i(?>sten|nk)|(?>sta|as)t|c(?>first)?|ength)
1216             | u(?>n(?>(?>lin|pac)k|shift|def|tie)|c(?>first)?|mask|time)
1217             | p(?>r(?>ototype|intf?)|ack(?>age)?|o[ps]|ipe|ush)
1218             | d(?>bm(?>close|open)|e(?>fined|lete)|ump|ie|o)
1219             | f(?>or(?>m(?>line|at)|k)|ileno|cntl|c|lock)
1220             | t(?>i(?>mes?|ed?)|ell(?>dir)?|runcate)
1221             | w(?>a(?>it(?>pid)?|ntarray|rn)|rite)
1222             | m(?>sg(?>ctl|get|rcv|snd)|kdir|ap)
1223             | b(?>in(?>mode|d)|less|reak)
1224             | i(?>n(?>dex|t)|mport|octl)
1225             | a(?>ccept|larm|tan2|bs)
1226             | o(?>pen(?>dir)?|ct|rd)
1227             | v(?>alues|ec)
1228             | k(?>eys|ill)
1229             | quotemeta
1230             | join
1231             | next
1232             | hex
1233             | _
1234             )
1235             \b
1236             )) # End of rule
1237              
1238             (? (?
1239             # Optimized to match any Perl builtin name, without backtracking...
1240             (?= [^\W\d] ) # Skip if possible
1241             (?>
1242             get(?:(?:(?:hos|ne)t|serv|gr)ent|p(?:(?:roto|w)ent|pid)|login)
1243             | end(?:(?:hos|ne)t|p(?:roto|w)|serv|gr)ent
1244             | wa(?:ntarray|it)
1245             | times?
1246             | fork
1247             | _
1248             )
1249             \b
1250             )) # End of rule
1251              
1252             (? (?
1253             (?>
1254             (?&PerlVString)
1255             |
1256             (?>(?&PPR_X_digit_seq))
1257             (?: \. (?&PPR_X_digit_seq)?+ )*+
1258             )
1259             )) # End of rule
1260              
1261             (? (?
1262             v (?>(?&PPR_X_digit_seq)) (?: \. (?&PPR_X_digit_seq) )*+
1263             )) # End of rule
1264              
1265             (? (?
1266             [+-]?+
1267             (?>
1268             0 (?> x (?&PPR_X_x_digit_seq)
1269             | b (?&PPR_X_b_digit_seq)
1270             | (?&PPR_X_o_digit_seq)
1271             )
1272             |
1273             (?>
1274             (?>(?&PPR_X_digit_seq))
1275             (?: \. (?&PPR_X_digit_seq)?+ )?+
1276             |
1277             \. (?&PPR_X_digit_seq)
1278             )
1279             (?: [eE] [+-]?+ (?&PPR_X_digit_seq) )?+
1280             )
1281             )) # End of rule
1282              
1283             (? (?
1284             (?> (?> :: | ' ) \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
1285             )) # End of rule
1286              
1287             (? (?
1288             (?> :: \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
1289             )) # End of rule
1290              
1291             (? (?
1292             [^\W\d]\w*+
1293             )) # End of rule
1294              
1295             (? (?
1296             (?! (?> (?= \w )
1297             (?> for(?:each)?+ | while | if | unless | until | use | no | given | when | sub | return )
1298             | (?&PPR_X_named_op)
1299             | __ (?> END | DATA ) __ (?&PerlEndOfLine)
1300             ) \b
1301             (?! (?>(?&PerlOWS)) => )
1302             )
1303             (?! (?> q[qwrx]?+ | [mys] | tr ) \b
1304             (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
1305             )
1306             (?: :: )?+
1307             [^\W\d]\w*+
1308             (?: (?: :: | ' ) [^\W\d]\w*+ )*+
1309             (?: :: )?+
1310             (?! \( ) # )
1311             |
1312             :: (?! \w | \{ )
1313             )) # End of rule
1314              
1315             (? (?
1316             (?!) # None, by default, but can be overridden in a composing regex
1317             )) # End of rule
1318              
1319             (? (?
1320             ^ = [^\W\d]\w*+ # A line starting with =
1321             .*? # Up to the first...
1322             ^ = cut \b [^\n]*+ $ # ...line starting with =cut
1323             )) # End of rule
1324              
1325              
1326             ##### Whitespace matching (part of API) #################################
1327              
1328             (? (?
1329             (?:
1330             \h++
1331             |
1332             (?&PPR_X_newline_and_heredoc)
1333             |
1334             [#] [^\n]*+
1335             |
1336             __ (?> END | DATA ) __ \b .*+ \z
1337             )*+
1338             )) # End of rule
1339              
1340             (? (?
1341             (?:
1342             \h++
1343             |
1344             (?&PPR_X_newline_and_heredoc)
1345             |
1346             [#] [^\n]*+
1347             |
1348             __ (?> END | DATA ) __ \b .*+ \z
1349             )++
1350             )) # End of rule
1351              
1352             (? (?
1353             \n
1354             )) # End of rule
1355              
1356              
1357             ###### Internal components (not part of API) ##########################
1358              
1359             (?
1360             (?> cmp
1361             | [lg][te]
1362             | eq
1363             | ne
1364             | and
1365             | or
1366             | xor
1367             )
1368             )
1369              
1370             (?
1371             (?! (?>
1372             for(?:each)?+ | while | if | unless | until | given | when | default
1373             | sub | format | use | no
1374             | (?&PPR_X_named_op)
1375             | [msy] | q[wrxq]?+ | tr
1376             | __ (?> END | DATA ) __ \n
1377             )
1378             \b
1379             )
1380             (?>(?&PerlQualifiedIdentifier))
1381             (?! :: )
1382             )
1383              
1384             (?
1385             \( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
1386             ; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
1387             ; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
1388             \)
1389             )
1390              
1391             (?
1392             (?&PerlBareword)
1393             |
1394             (?>(?&PerlVariableScalar))
1395             (?! (?>(?&PerlOWS)) (?> [<\[\{] | -> ) )
1396             )
1397              
1398             (?
1399             (?>(?&PPR_X_quotelike_body_unclosed))
1400             \S # (Note: Don't have to test that this matches; the preceding subrule already did that)
1401             )
1402              
1403             (?
1404             [^)(\\\n]*+
1405             (?:
1406             (?>
1407             \\.
1408             |
1409             \( (?>(?&PPR_X_balanced_parens)) \)
1410             |
1411             (?&PPR_X_newline_and_heredoc)
1412             )
1413             [^)(\\\n]*+
1414             )*+
1415             )
1416              
1417             (?
1418             [^\}\{\\\n]*+
1419             (?:
1420             (?>
1421             \\.
1422             |
1423             \{ (?>(?&PPR_X_balanced_curlies)) \}
1424             |
1425             (?&PPR_X_newline_and_heredoc)
1426             )
1427             [^\}\{\\\n]*+
1428             )*+
1429             )
1430              
1431             (?
1432             [^][\\\n]*+
1433             (?:
1434             (?>
1435             \\.
1436             |
1437             \[ (?>(?&PPR_X_balanced_squares)) \]
1438             |
1439             (?&PPR_X_newline_and_heredoc)
1440             )
1441             [^][\\\n]*+
1442             )*+
1443             )
1444              
1445             (?
1446             [^><\\\n]*+
1447             (?:
1448             (?>
1449             \\.
1450             |
1451             < (?>(?&PPR_X_balanced_angles)) >
1452             |
1453             (?&PPR_X_newline_and_heredoc)
1454             )
1455             [^><\\\n]*+
1456             )*+
1457             )
1458              
1459             (?
1460             (?>
1461             [#]
1462             [^#\\\n]*+
1463             (?:
1464             (?: \\. | (?&PPR_X_newline_and_heredoc) )
1465             [^#\\\n]*+
1466             )*+
1467             (?= [#] )
1468             |
1469             (?>(?&PerlOWS))
1470             (?>
1471             \{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
1472             |
1473             \[ (?>(?&PPR_X_balanced_squares)) (?= \] )
1474             |
1475             \( (?>(?&PPR_X_balanced_parens)) (?= \) )
1476             |
1477             < (?>(?&PPR_X_balanced_angles)) (?= > )
1478             |
1479             \\
1480             [^\\\n]*+
1481             (
1482             (?&PPR_X_newline_and_heredoc)
1483             [^\\\n]*+
1484             )*+
1485             (?= \\ )
1486             |
1487             /
1488             [^\\/\n]*+
1489             (?:
1490             (?: \\. | (?&PPR_X_newline_and_heredoc) )
1491             [^\\/\n]*+
1492             )*+
1493             (?= / )
1494             |
1495             (? \S )
1496             (?:
1497             \\.
1498             |
1499             (?&PPR_X_newline_and_heredoc)
1500             |
1501             (?! \g{PPR_X_qldel} ) .
1502             )*+
1503             (?= \g{PPR_X_qldel} )
1504             )
1505             )
1506             )
1507              
1508             (?
1509             (?>(?&PPR_X_quotelike_body_interpolated_unclosed))
1510             \S # (Note: Don't have to test that this matches; the preceding subrule already did that)
1511             )
1512              
1513             (?
1514             [^)(\\\n\$\@]*+
1515             (?:
1516             (?>
1517             \\.
1518             |
1519             \( (?>(?&PPR_X_balanced_parens_interpolated)) \)
1520             |
1521             (?&PPR_X_newline_and_heredoc)
1522             |
1523             (?= \$ (?! [\s\)] ) ) (?&PerlScalarAccessNoSpace)
1524             |
1525             (?= \@ (?! [\s\)] ) ) (?&PerlArrayAccessNoSpace)
1526             |
1527             [\$\@]
1528             )
1529             [^)(\\\n\$\@]*+
1530             )*+
1531             )
1532              
1533             (?
1534             [^\}\{\\\n\$\@]*+
1535             (?:
1536             (?>
1537             \\.
1538             |
1539             \{ (?>(?&PPR_X_balanced_curlies_interpolated)) \}
1540             |
1541             (?&PPR_X_newline_and_heredoc)
1542             |
1543             (?= \$ (?! [\s\}] ) ) (?&PerlScalarAccessNoSpace)
1544             |
1545             (?= \@ (?! [\s\}] ) ) (?&PerlArrayAccessNoSpace)
1546             |
1547             [\$\@]
1548             )
1549             [^\}\{\\\n\$\@]*+
1550             )*+
1551             )
1552              
1553             (?
1554             [^][\\\n\$\@]*+
1555             (?:
1556             (?>
1557             \\.
1558             |
1559             \[ (?>(?&PPR_X_balanced_squares_interpolated)) \]
1560             |
1561             (?&PPR_X_newline_and_heredoc)
1562             |
1563             (?= \$ (?! [\s\]] ) ) (?&PerlScalarAccessNoSpace)
1564             |
1565             (?= \@ (?! [\s\]] ) ) (?&PerlArrayAccessNoSpace)
1566             |
1567             [\$\@]
1568             )
1569             [^][\\\n\$\@]*+
1570             )*+
1571             )
1572              
1573             (?
1574             [^><\\\n\$\@]*+
1575             (?:
1576             (?>
1577             \\.
1578             |
1579             < (?>(?&PPR_X_balanced_angles_interpolated)) >
1580             |
1581             (?&PPR_X_newline_and_heredoc)
1582             |
1583             (?= \$ (?! [\s>] ) ) (?&PerlScalarAccessNoSpace)
1584             |
1585             (?= \@ (?! [\s>] ) ) (?&PerlArrayAccessNoSpace)
1586             |
1587             [\$\@]
1588             )
1589             [^><\\\n\$\@]*+
1590             )*+
1591             )
1592              
1593             (?
1594             # Start by working out where it actually ends (ignoring interpolations)...
1595             (?=
1596             (?>
1597             [#]
1598             [^#\\\n\$\@]*+
1599             (?:
1600             (?>
1601             \\.
1602             |
1603             (?&PPR_X_newline_and_heredoc)
1604             |
1605             (?= \$ (?! [\s#] ) ) (?&PerlScalarAccessNoSpace)
1606             |
1607             (?= \@ (?! [\s#] ) ) (?&PerlArrayAccessNoSpace)
1608             |
1609             [\$\@]
1610             )
1611             [^#\\\n\$\@]*+
1612             )*+
1613             (?= [#] )
1614             |
1615             (?>(?&PerlOWS))
1616             (?>
1617             \{ (?>(?&PPR_X_balanced_curlies_interpolated)) (?= \} )
1618             |
1619             \[ (?>(?&PPR_X_balanced_squares_interpolated)) (?= \] )
1620             |
1621             \( (?>(?&PPR_X_balanced_parens_interpolated)) (?= \) )
1622             |
1623             < (?>(?&PPR_X_balanced_angles_interpolated)) (?= > )
1624             |
1625             \\
1626             [^\\\n\$\@]*+
1627             (?:
1628             (?>
1629             (?&PPR_X_newline_and_heredoc)
1630             |
1631             (?= \$ (?! [\s\\] ) ) (?&PerlScalarAccessNoSpace)
1632             |
1633             (?= \@ (?! [\s\\] ) ) (?&PerlArrayAccessNoSpace)
1634             |
1635             [\$\@]
1636             )
1637             [^\\\n\$\@]*+
1638             )*+
1639             (?= \\ )
1640             |
1641             /
1642             [^\\/\n\$\@]*+
1643             (?:
1644             (?>
1645             \\.
1646             |
1647             (?&PPR_X_newline_and_heredoc)
1648             |
1649             (?= \$ (?! [\s/] ) ) (?&PerlScalarAccessNoSpace)
1650             |
1651             (?= \@ (?! [\s/] ) ) (?&PerlArrayAccessNoSpace)
1652             |
1653             [\$\@]
1654             )
1655             [^\\/\n\$\@]*+
1656             )*+
1657             (?= / )
1658             |
1659             -
1660             (?:
1661             \\.
1662             |
1663             (?&PPR_X_newline_and_heredoc)
1664             |
1665             (?:
1666             (?= \$ (?! [\s-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
1667             |
1668             (?= \@ (?! [\s-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
1669             |
1670             [^-]
1671             )
1672             )*+
1673             (?= - )
1674             |
1675             (? \S )
1676             (?:
1677             \\.
1678             |
1679             (?&PPR_X_newline_and_heredoc)
1680             |
1681             (?! \g{PPR_X_qldel} )
1682             (?:
1683             (?= \$ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlScalarAccessNoSpace)
1684             |
1685             (?= \@ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlArrayAccessNoSpace)
1686             |
1687             .
1688             )
1689             )*+
1690             (?= \g{PPR_X_qldel} )
1691             )
1692             )
1693             )
1694              
1695             (?&PPR_X_quotelike_body_unclosed)
1696             )
1697              
1698             (?
1699             (??{ local $PPR::X::_quotelike_s_end = -1; '' })
1700             (?:
1701             (?=
1702             (?&PPR_X_quotelike_body_interpolated)
1703             (??{ $PPR::X::_quotelike_s_end = +pos(); '' })
1704             [msixpodualgcrn]*+ e [msixpodualgcern]*+
1705             )
1706             (?=
1707             (?(?{ $PPR::X::_quotelike_s_end >= 0 })
1708             (?>
1709             (??{ +pos() && +pos() < $PPR::X::_quotelike_s_end ? '' : '(?!)' })
1710             (?>
1711             (?&PerlVariable)
1712             |
1713             (?&PerlQuotelike)
1714             |
1715             \\?+ .
1716             )
1717             )*+
1718             )
1719             )
1720             )?+
1721             )
1722              
1723             (? [ABCMORSTWXbcdefgkloprstuwxz] )
1724              
1725             (? \d++ (?: _?+ \d++ )*+ )
1726             (? [\da-fA-F]++ (?: _?+ [\da-fA-F]++ )*+ )
1727             (? [0-7]++ (?: _?+ [0-7]++ )*+ )
1728             (? [0-1]++ (?: _?+ [0-1]++ )*+ )
1729              
1730             (?
1731             \n (??{ ($PPR::X::_heredoc_origin // q{}) eq ($_//q{}) ? ($PPR::X::_heredoc_skip{+pos()} // q{}) : q{} })
1732             )
1733             )
1734             }xms;
1735              
1736             1; # Magic true value required at end of module
1737              
1738             __END__