Created
January 21, 2019 04:29
-
-
Save mackee/a6d29a530e303820679db7cf35da6e32 to your computer and use it in GitHub Desktop.
A visualization of PPR.pm for help us understand
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl | |
use 5.28.0; | |
use warnings; | |
use utf8; | |
use Path::Tiny; | |
use PPR; | |
use PPIx::Regexp::Dumper; | |
my $file = path("PPR/lib/PPR.pm"); | |
my $stmt_regexp = qr{ | |
our (?&PerlOWS) \$GRAMMAR (?&PerlOWS) = (?&PerlOWS) ((?&PerlRegex)) | |
$PPR::GRAMMAR | |
}x; | |
my ($regexp) = grep { defined } $file->slurp =~ /$stmt_regexp/gcx; | |
my $tree = PPIx::Regexp->new($regexp); | |
my $bucket = {}; | |
traverse($tree, $bucket); | |
my %decls = map { $_ => [sort { $a cmp $b } keys $bucket->{$_}->%*] } keys %$bucket; | |
#use DDP; p %decls; | |
print_tree(\%decls); | |
sub traverse { | |
my ($tree, $bucket, $name) = @_; | |
my $literal = ""; | |
for my $child ($tree->children) { | |
if (ref $child eq "PPIx::Regexp::Token::Literal") { | |
$literal .= $child->content; | |
} | |
elsif (ref $child eq "PPIx::Regexp::Token::Whitespace") { | |
# skip | |
} | |
else { | |
if (length($literal) > 1 && $literal ne '\n') { | |
$bucket->{$name}->{'"' . $literal . '"'} = 1; | |
} | |
$literal = ""; | |
} | |
if (ref $child eq "PPIx::Regexp::Token::Recursion") { | |
next if $child->name eq "PerlOWS"; | |
$bucket->{$name}->{$child->content} = 1; | |
} | |
if ($child->can("children")) { | |
my $next_name = $name; | |
if (ref $child eq "PPIx::Regexp::Structure::NamedCapture") { | |
next if $child->name =~ /^PPR_/; | |
$next_name = $name ? $name . " > (?&" . $child->name . ")" : "(?&" . $child->name . ")"; | |
#PPIx::Regexp::Dumper->new($child)->print; | |
} | |
traverse($child, $bucket, $next_name); | |
} | |
} | |
} | |
sub print_tree { | |
my $decls = shift; | |
for my $key (sort { $a cmp $b } keys %$decls) { | |
my $children = $decls->{$key}; | |
say $key; | |
for my $i (0..scalar(@$children) - 1) { | |
print $i == (scalar(@$children) - 1) ? "`-- " : "|-- "; | |
say $children->[$i]; | |
} | |
say ""; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(?&PerlAnonymousArray) | |
|-- "\[" | |
`-- (?&PerlExpression) | |
(?&PerlAnonymousHash) | |
|-- "\{" | |
`-- (?&PerlExpression) | |
(?&PerlAnonymousSubroutine) | |
|-- "\(" | |
|-- "\)" | |
|-- "sub" | |
|-- (?&PerlAttributes) | |
|-- (?&PerlBlock) | |
`-- (?&PerlParenthesesList) | |
(?&PerlArrayAccess) | |
|-- "->" | |
|-- "\$\*" | |
|-- "\*" | |
|-- (?&PerlArrayIndexer) | |
|-- (?&PerlHashIndexer) | |
|-- (?&PerlParenthesesList) | |
`-- (?&PerlVariableArray) | |
(?&PerlArrayAccessNoSpace) | |
|-- "->" | |
|-- "\$\*" | |
|-- "\*" | |
|-- (?&PerlArrayIndexer) | |
|-- (?&PerlHashIndexer) | |
|-- (?&PerlParenthesesList) | |
`-- (?&PerlVariableArrayNoSpace) | |
(?&PerlArrayAccessNoSpaceNoArrow) | |
|-- (?&PerlArrayIndexer) | |
|-- (?&PerlHashIndexer) | |
|-- (?&PerlParenthesesList) | |
`-- (?&PerlVariableArray) | |
(?&PerlArrayIndexer) | |
|-- "\[" | |
`-- (?&PerlExpression) | |
(?&PerlAssignment) | |
|-- (?&PerlAssignmentOperator) | |
`-- (?&PerlConditionalExpression) | |
(?&PerlAttributes) | |
|-- (?&PPR_quotelike_body) | |
|-- (?&PerlIdentifier) | |
`-- (?&PerlNWS) | |
(?&PerlBareword) | |
|-- "::" | |
|-- "END" | |
|-- "__" | |
|-- "for" | |
|-- "given" | |
|-- "if" | |
|-- "no" | |
|-- "sub" | |
|-- "unless" | |
|-- "until" | |
|-- "use" | |
|-- "when" | |
|-- "while" | |
|-- (?&PPR_named_op) | |
`-- (?&PerlEndOfLine) | |
(?&PerlBinaryExpression) | |
|-- (?&PerlInfixBinaryOperator) | |
`-- (?&PerlPrefixPostfixTerm) | |
(?&PerlBlock) | |
|-- "\{" | |
`-- (?&PerlStatementSequence) | |
(?&PerlBuiltinFunction) | |
|-- "ach" | |
|-- "ack" | |
|-- "ad" | |
|-- "addr" | |
|-- "al" | |
|-- "aller" | |
|-- "alues" | |
|-- "ate" | |
|-- "ay" | |
|-- "bm" | |
|-- "by" | |
|-- "byn" | |
|-- "cala" | |
|-- "call" | |
|-- "ccept" | |
|-- "ce" | |
|-- "cket" | |
|-- "close" | |
|-- "cntl" | |
|-- "ct" | |
|-- "ctl" | |
|-- "cv" | |
|-- "def" | |
|-- "dex" | |
|-- "dir" | |
|-- "do" | |
|-- "ec" | |
|-- "ed" | |
|-- "eername" | |
|-- "ek" | |
|-- "ell" | |
|-- "en" | |
|-- "ent" | |
|-- "erv" | |
|-- "erven" | |
|-- "et" | |
|-- "eys" | |
|-- "fined" | |
|-- "get" | |
|-- "gid" | |
|-- "gr" | |
|-- "grp" | |
|-- "hex" | |
|-- "hos" | |
|-- "host" | |
|-- "ie" | |
|-- "ileno" | |
|-- "in" | |
|-- "index" | |
|-- "intf" | |
|-- "iority" | |
|-- "ipe" | |
|-- "it" | |
|-- "join" | |
|-- "kdir" | |
|-- "larm" | |
|-- "lect" | |
|-- "leep" | |
|-- "less" | |
|-- "li" | |
|-- "lin" | |
|-- "line" | |
|-- "lob" | |
|-- "login" | |
|-- "lose" | |
|-- "mask" | |
|-- "mdir" | |
|-- "mes" | |
|-- "mode" | |
|-- "mport" | |
|-- "mtime" | |
|-- "nam" | |
|-- "name" | |
|-- "nd" | |
|-- "net" | |
|-- "next" | |
|-- "ntarray" | |
|-- "ock" | |
|-- "open" | |
|-- "or" | |
|-- "oto" | |
|-- "ototype" | |
|-- "pen" | |
|-- "pipe" | |
|-- "qrt" | |
|-- "quir" | |
|-- "quotemeta" | |
|-- "rand" | |
|-- "rcv" | |
|-- "read" | |
|-- "roto" | |
|-- "seek" | |
|-- "serv" | |
|-- "set" | |
|-- "sg" | |
|-- "shift" | |
|-- "sta" | |
|-- "sten" | |
|-- "sts" | |
|-- "tan2" | |
|-- "tinue" | |
|-- "turn" | |
|-- "umber" | |
|-- "ump" | |
|-- "utdown" | |
|-- "val" | |
|-- "vers" | |
|-- "went" | |
|-- "winddir" | |
`-- "write" | |
(?&PerlCall) | |
|-- "\(" | |
|-- "\)" | |
|-- (?&PPR_filetest_name) | |
|-- (?&PPR_indirect_obj) | |
|-- (?&PPR_non_reserved_identifier) | |
|-- (?&PerlBlock) | |
|-- (?&PerlBuiltinFunction) | |
|-- (?&PerlCall) | |
|-- (?&PerlComma) | |
|-- (?&PerlCommaList) | |
|-- (?&PerlExpression) | |
|-- (?&PerlNWS) | |
|-- (?&PerlPrefixPostfixTerm) | |
|-- (?&PerlQualifiedIdentifier) | |
`-- (?&PerlVariableScalar) | |
(?&PerlCommaList) | |
|-- (?&PerlAssignment) | |
`-- (?&PerlComma) | |
(?&PerlContextualQuotelikeM) > (?&PerlContextualMatch) | |
|-- "=>" | |
|-- "for" | |
|-- "if" | |
|-- "unless" | |
|-- "until" | |
|-- "while" | |
|-- (?&PerlInfixBinaryOperator) | |
`-- (?&PerlLowPrecedenceInfixOperator) | |
(?&PerlContextualQuotelikeM) > (?&PerlContextualMatch) > (?&PerlQuotelikeM) > (?&PerlMatch) | |
|-- "\/" | |
|-- "\/\/" | |
`-- (?&PPR_quotelike_body_interpolated) | |
(?&PerlContextualRegex) | |
|-- (?&PerlContextualMatch) | |
`-- (?&PerlQuotelikeQR) | |
(?&PerlControlBlock) | |
|-- "BEGIN" | |
|-- "CHECK" | |
|-- "END" | |
|-- "INIT" | |
|-- "\\" | |
|-- "continue" | |
|-- "default" | |
|-- "else" | |
|-- "elsif" | |
|-- "for" | |
|-- "given" | |
|-- "if" | |
|-- "my" | |
|-- "our" | |
|-- "while" | |
|-- (?&PPR_three_part_list) | |
|-- (?&PerlBlock) | |
|-- (?&PerlParenthesesList) | |
|-- (?&PerlPodSequence) | |
|-- (?&PerlQuotelikeQW) | |
|-- (?&PerlVariableArray) | |
|-- (?&PerlVariableHash) | |
`-- (?&PerlVariableScalar) | |
(?&PerlDiamondOperator) | |
|-- "<<>>" | |
|-- "=>" | |
|-- "for" | |
|-- "if" | |
|-- "unless" | |
|-- "until" | |
|-- "while" | |
|-- (?&PPR_balanced_angles) | |
|-- (?&PerlInfixBinaryOperator) | |
`-- (?&PerlLowPrecedenceInfixOperator) | |
(?&PerlDoBlock) | |
|-- "do" | |
`-- (?&PerlBlock) | |
(?&PerlDocument) | |
|-- "\x{FEFF}" | |
`-- (?&PerlStatementSequence) | |
(?&PerlEvalBlock) | |
|-- "eval" | |
`-- (?&PerlBlock) | |
(?&PerlExpression) | |
|-- (?&PerlLowPrecedenceInfixOperator) | |
`-- (?&PerlLowPrecedenceNotExpression) | |
(?&PerlFormat) | |
|-- "\$" | |
|-- "\." | |
|-- "\@" | |
|-- "format" | |
|-- (?&PPR_newline_and_heredoc) | |
|-- (?&PerlArrayAccessNoSpace) | |
|-- (?&PerlEndOfLine) | |
|-- (?&PerlNWS) | |
|-- (?&PerlQualifiedIdentifier) | |
`-- (?&PerlScalarAccessNoSpace) | |
(?&PerlHashAccess) | |
|-- "->" | |
|-- "\$\*" | |
|-- "\*" | |
|-- (?&PerlArrayIndexer) | |
|-- (?&PerlHashIndexer) | |
|-- (?&PerlParenthesesList) | |
`-- (?&PerlVariableHash) | |
(?&PerlHashIndexer) | |
|-- "\{" | |
|-- (?&PerlExpression) | |
`-- (?&PerlIdentifier) | |
(?&PerlHeredoc) | |
|-- "<<" | |
|-- "\$" | |
|-- "\@" | |
|-- "\\" | |
|-- (?&PerlArrayAccessNoSpace) | |
`-- (?&PerlScalarAccessNoSpace) | |
(?&PerlHeredoc) > (?&_heredoc_terminator) | |
|-- "\\" | |
`-- (?&PerlIdentifier) | |
(?&PerlInfixBinaryOperator) | |
|-- "<=>" | |
|-- ">=" | |
|-- "\^" | |
|-- "cmp" | |
|-- "eq" | |
`-- "ne" | |
(?&PerlLabel) | |
`-- (?&PerlIdentifier) | |
(?&PerlList) | |
|-- (?&PerlCommaList) | |
`-- (?&PerlParenthesesList) | |
(?&PerlLiteral) | |
|-- (?&PerlBareword) | |
|-- (?&PerlNumber) | |
|-- (?&PerlQuotelikeQR) | |
|-- (?&PerlQuotelikeQW) | |
`-- (?&PerlString) | |
(?&PerlLowPrecedenceInfixOperator) | |
|-- "and" | |
`-- "or" | |
(?&PerlLowPrecedenceNotExpression) | |
|-- "not" | |
`-- (?&PerlCommaList) | |
(?&PerlLvalue) | |
|-- "\(" | |
|-- "\\" | |
|-- (?&PerlComma) | |
`-- (?&PerlIdentifier) | |
(?&PerlNWS) | |
|-- "END" | |
|-- "__" | |
`-- (?&PPR_newline_and_heredoc) | |
(?&PerlNullaryBuiltinFunction) | |
|-- "end" | |
|-- "ent" | |
|-- "fork" | |
|-- "get" | |
|-- "hos" | |
|-- "ntarray" | |
|-- "roto" | |
|-- "serv" | |
|-- "times" | |
`-- "wa" | |
(?&PerlNumber) | |
|-- "\." | |
|-- (?&PPR_b_digit_seq) | |
|-- (?&PPR_digit_seq) | |
|-- (?&PPR_o_digit_seq) | |
`-- (?&PPR_x_digit_seq) | |
(?&PerlOWS) | |
|-- "END" | |
|-- "__" | |
`-- (?&PPR_newline_and_heredoc) | |
(?&PerlOldQualifiedIdentifier) | |
`-- "::" | |
(?&PerlPackageDeclaration) | |
|-- "\}" | |
|-- "package" | |
|-- (?&PerlBlock) | |
|-- (?&PerlNWS) | |
|-- (?&PerlQualifiedIdentifier) | |
`-- (?&PerlVersionNumber) | |
(?&PerlParenthesesList) | |
|-- "\(" | |
`-- (?&PerlExpression) | |
(?&PerlPod) | |
`-- "=cut" | |
(?&PerlPodSequence) | |
`-- (?&PerlPod) | |
(?&PerlPostfixUnaryOperator) | |
`-- "\+\+" | |
(?&PerlPrefixPostfixTerm) | |
|-- "->" | |
|-- "\*" | |
|-- (?&PerlArrayIndexer) | |
|-- (?&PerlHashIndexer) | |
|-- (?&PerlParenthesesList) | |
|-- (?&PerlPostfixUnaryOperator) | |
|-- (?&PerlPrefixUnaryOperator) | |
|-- (?&PerlQualifiedIdentifier) | |
|-- (?&PerlTerm) | |
`-- (?&PerlVariableScalar) | |
(?&PerlPrefixUnaryOperator) | |
|-- "--" | |
|-- "\+\+" | |
`-- (?&PPR_filetest_name) | |
(?&PerlQualifiedIdentifier) | |
`-- "::" | |
(?&PerlQuotelike) | |
|-- (?&PerlContextualMatch) | |
|-- (?&PerlQuotelikeQR) | |
|-- (?&PerlQuotelikeQW) | |
|-- (?&PerlQuotelikeQX) | |
|-- (?&PerlQuotelikeS) | |
|-- (?&PerlQuotelikeTR) | |
`-- (?&PerlString) | |
(?&PerlQuotelikeQ) | |
|-- "\\" | |
`-- (?&PPR_quotelike_body) | |
(?&PerlQuotelikeQQ) | |
|-- "\\" | |
|-- "qq" | |
`-- (?&PPR_quotelike_body_interpolated) | |
(?&PerlQuotelikeQR) | |
|-- "qr" | |
`-- (?&PPR_quotelike_body_interpolated) | |
(?&PerlQuotelikeQW) | |
|-- "qw" | |
`-- (?&PPR_quotelike_body) | |
(?&PerlQuotelikeQX) | |
|-- "\\" | |
|-- "qx" | |
|-- (?&PPR_quotelike_body) | |
`-- (?&PPR_quotelike_body_interpolated) | |
(?&PerlQuotelikeS) > (?&PerlSubstitution) | |
|-- (?&PPR_quotelike_body_interpolated) | |
|-- (?&PPR_quotelike_body_interpolated_unclosed) | |
`-- (?&PPR_quotelike_s_e_check) | |
(?&PerlQuotelikeTR) > (?&PerlTransliteration) | |
|-- "tr" | |
|-- (?&PPR_quotelike_body_interpolated) | |
`-- (?&PPR_quotelike_body_interpolated_unclosed) | |
(?&PerlRegex) | |
|-- (?&PerlMatch) | |
`-- (?&PerlQuotelikeQR) | |
(?&PerlReturnExpression) | |
|-- "return" | |
`-- (?&PerlExpression) | |
(?&PerlReturnStatement) | |
|-- "\}" | |
|-- "return" | |
`-- (?&PerlExpression) | |
(?&PerlScalarAccess) | |
|-- "->" | |
|-- "\$\*" | |
|-- "\*" | |
|-- (?&PerlArrayIndexer) | |
|-- (?&PerlHashIndexer) | |
|-- (?&PerlParenthesesList) | |
`-- (?&PerlVariableScalar) | |
(?&PerlScalarAccessNoSpace) | |
|-- "->" | |
|-- "\$\*" | |
|-- "\*" | |
|-- (?&PerlArrayIndexer) | |
|-- (?&PerlHashIndexer) | |
|-- (?&PerlParenthesesList) | |
`-- (?&PerlVariableScalarNoSpace) | |
(?&PerlScalarAccessNoSpaceNoArrow) | |
|-- (?&PerlArrayIndexer) | |
|-- (?&PerlHashIndexer) | |
|-- (?&PerlParenthesesList) | |
`-- (?&PerlVariableScalarNoSpace) | |
(?&PerlScalarExpr) > (?&PerlConditionalExpression) | |
|-- "\?" | |
|-- (?&PerlAssignment) | |
|-- (?&PerlBinaryExpression) | |
`-- (?&PerlConditionalExpression) | |
(?&PerlStatement) | |
|-- "AUTOLOAD" | |
|-- "DESTROY" | |
|-- "\(" | |
|-- "\)" | |
|-- "\.\.\." | |
|-- "\}" | |
|-- "package" | |
|-- "sub" | |
|-- "use" | |
|-- (?&PerlAttributes) | |
|-- (?&PerlBlock) | |
|-- (?&PerlComma) | |
|-- (?&PerlControlBlock) | |
|-- (?&PerlExpression) | |
|-- (?&PerlFormat) | |
|-- (?&PerlInfixBinaryOperator) | |
|-- (?&PerlKeyword) | |
|-- (?&PerlLabel) | |
|-- (?&PerlNWS) | |
|-- (?&PerlOldQualifiedIdentifier) | |
|-- (?&PerlParenthesesList) | |
|-- (?&PerlPodSequence) | |
|-- (?&PerlQualifiedIdentifier) | |
|-- (?&PerlStatementModifier) | |
`-- (?&PerlVersionNumber) | |
(?&PerlStatementModifier) | |
|-- "for" | |
|-- "if" | |
|-- "unless" | |
|-- "until" | |
|-- "while" | |
`-- (?&PerlExpression) | |
(?&PerlStatementSequence) | |
|-- (?&PerlPodSequence) | |
`-- (?&PerlStatement) | |
(?&PerlString) | |
|-- "\\" | |
|-- "qq" | |
|-- (?&PPR_quotelike_body) | |
|-- (?&PPR_quotelike_body_interpolated) | |
|-- (?&PerlHeredoc) | |
`-- (?&PerlVString) | |
(?&PerlSubroutineDeclaration) | |
|-- "AUTOLOAD" | |
|-- "DESTROY" | |
|-- "\(" | |
|-- "\)" | |
|-- "sub" | |
|-- (?&PerlAttributes) | |
|-- (?&PerlBlock) | |
|-- (?&PerlOldQualifiedIdentifier) | |
`-- (?&PerlParenthesesList) | |
(?&PerlTerm) | |
|-- "do" | |
|-- "my" | |
|-- "return" | |
|-- "state" | |
|-- (?&PerlAnonymousArray) | |
|-- (?&PerlAnonymousHash) | |
|-- (?&PerlAnonymousSubroutine) | |
|-- (?&PerlArrayIndexer) | |
|-- (?&PerlAttributes) | |
|-- (?&PerlBlock) | |
|-- (?&PerlCall) | |
|-- (?&PerlContextualMatch) | |
|-- (?&PerlDiamondOperator) | |
|-- (?&PerlExpression) | |
|-- (?&PerlHashIndexer) | |
|-- (?&PerlLiteral) | |
|-- (?&PerlLvalue) | |
|-- (?&PerlNullaryBuiltinFunction) | |
|-- (?&PerlParenthesesList) | |
|-- (?&PerlQualifiedIdentifier) | |
|-- (?&PerlQuotelikeQX) | |
|-- (?&PerlQuotelikeS) | |
|-- (?&PerlQuotelikeTR) | |
|-- (?&PerlTypeglob) | |
`-- (?&PerlVariable) | |
(?&PerlTermPostfixDereference) | |
|-- "->" | |
|-- "\*" | |
|-- (?&PerlArrayIndexer) | |
|-- (?&PerlHashIndexer) | |
|-- (?&PerlParenthesesList) | |
|-- (?&PerlQualifiedIdentifier) | |
`-- (?&PerlVariableScalar) | |
(?&PerlTypeglob) | |
|-- "->" | |
|-- "\$\*" | |
|-- "\*" | |
|-- "\^" | |
|-- "\{\^" | |
|-- "\}" | |
|-- "][" | |
|-- (?&PerlArrayIndexer) | |
|-- (?&PerlBlock) | |
|-- (?&PerlHashIndexer) | |
|-- (?&PerlOldQualifiedIdentifier) | |
|-- (?&PerlParenthesesList) | |
`-- (?&PerlVariableScalar) | |
(?&PerlUseStatement) | |
|-- "\}" | |
|-- "use" | |
|-- (?&PerlComma) | |
|-- (?&PerlExpression) | |
|-- (?&PerlInfixBinaryOperator) | |
|-- (?&PerlNWS) | |
|-- (?&PerlPodSequence) | |
|-- (?&PerlQualifiedIdentifier) | |
`-- (?&PerlVersionNumber) | |
(?&PerlVString) | |
|-- "\." | |
`-- (?&PPR_digit_seq) | |
(?&PerlVariable) | |
|-- (?&PerlArrayAccess) | |
|-- (?&PerlHashAccess) | |
`-- (?&PerlScalarAccess) | |
(?&PerlVariableArray) | |
|-- "::" | |
|-- "\$" | |
|-- "\@" | |
|-- "\^" | |
|-- "\{\^" | |
|-- "\}" | |
|-- "][" | |
|-- (?&PerlBlock) | |
`-- (?&PerlOldQualifiedIdentifier) | |
(?&PerlVariableArrayNoSpace) | |
|-- "::" | |
|-- "\@" | |
|-- "\^" | |
|-- "\{\^" | |
|-- "\}" | |
|-- "][" | |
|-- (?&PerlBlock) | |
`-- (?&PerlOldQualifiedIdentifier) | |
(?&PerlVariableDeclaration) | |
|-- "my" | |
|-- "state" | |
|-- (?&PerlAttributes) | |
|-- (?&PerlLvalue) | |
`-- (?&PerlQualifiedIdentifier) | |
(?&PerlVariableHash) | |
|-- "::" | |
|-- "\$" | |
|-- "\^" | |
|-- "\{\^" | |
|-- "\}" | |
|-- "][" | |
|-- (?&PerlBlock) | |
`-- (?&PerlOldQualifiedIdentifier) | |
(?&PerlVariableScalar) | |
|-- "::" | |
|-- "\$" | |
|-- "\$\$" | |
|-- "\$\{" | |
|-- "\$^" | |
|-- "\^" | |
|-- "\{" | |
|-- "\{\^" | |
|-- "\}" | |
|-- "][" | |
|-- (?&PerlBlock) | |
`-- (?&PerlOldQualifiedIdentifier) | |
(?&PerlVariableScalarNoSpace) | |
|-- "::" | |
|-- "\$" | |
|-- "\$\$" | |
|-- "\$\{" | |
|-- "\$^" | |
|-- "\^" | |
|-- "\{" | |
|-- "\{\^" | |
|-- "\}" | |
|-- "][" | |
|-- (?&PerlBlock) | |
`-- (?&PerlOldQualifiedIdentifier) | |
(?&PerlVersionNumber) | |
|-- "\." | |
|-- (?&PPR_digit_seq) | |
`-- (?&PerlVString) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment