Skip to content

Commit fcea756

Browse files
committed
Perlito - misc - tree grammar placeholder
1 parent a3e2348 commit fcea756

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed

misc/tree_grammar.pl

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package main {
2+
use Data::Dumper;
3+
use strict;
4+
5+
my $in = eval join( '', <> );
6+
print Dumper $in;
7+
8+
my $rule = [ Ref => 'Perlito5::AST::Apply' ];
9+
TreeGrammar::scan( $rule, $in );
10+
11+
$rule = [
12+
Lookup => 'name',
13+
[ Value => 'a' ]
14+
];
15+
TreeGrammar::scan( $rule, $in );
16+
}
17+
18+
package TreeGrammar {
19+
use Data::Dumper;
20+
use strict;
21+
22+
my %dispatch;
23+
INIT {
24+
%dispatch = (
25+
Ref => \&Ref, # Ref => 'Perlito5::AST::Apply'
26+
Lookup => \&Lookup, # Lookup => 'namespace'
27+
Index => \&Index, # Index => '0'
28+
Value => \&Value, # Value => '123'
29+
);
30+
}
31+
32+
sub render {
33+
my ( $rule, $node ) = @_;
34+
if ( ref($rule) ) {
35+
36+
# print "Rule ", Dumper $rule;
37+
# print Dumper \%dispatch;
38+
return $dispatch{ $rule->[0] }->( $rule, $node );
39+
}
40+
return;
41+
}
42+
43+
sub scan {
44+
my ( $rule, $node ) = @_;
45+
render( $rule, $node );
46+
if ( ref($node) eq 'ARRAY' ) {
47+
scan( $rule, $_ ) for @$node;
48+
}
49+
elsif ( ref($node) ) {
50+
scan( $rule, $_ ) for values %$node;
51+
}
52+
return;
53+
}
54+
55+
sub Ref {
56+
my ( $rule, $node ) = @_;
57+
if ( ref($node) eq $rule->[1] ) {
58+
print "match: Ref $node\n";
59+
return { pos => $node };
60+
}
61+
return;
62+
}
63+
64+
sub Lookup {
65+
my ( $rule, $node ) = @_;
66+
return if !ref($node) || ref($node) eq 'ARRAY';
67+
if ( exists( $node->{ $rule->[1] } ) ) {
68+
print "match: Lookup $node\n";
69+
return render( $rule->[2], $node->{ $rule->[1] } ) if $rule->[2];
70+
return { pos => $node };
71+
}
72+
return;
73+
}
74+
75+
sub Index {
76+
my ( $rule, $node ) = @_;
77+
return if !ref($node) || ref($node) ne 'ARRAY';
78+
if ( exists( $node->[ $rule->[1] ] ) ) {
79+
print "match: Index $node\n";
80+
return render( $rule->[2], $node->[ $rule->[1] ] ) if $rule->[2];
81+
return { pos => $node };
82+
}
83+
return;
84+
}
85+
86+
sub Value {
87+
my ( $rule, $node ) = @_;
88+
return if ref($node);
89+
if ( $node eq $rule->[1] ) {
90+
print "match: Value $node\n";
91+
return { pos => $node };
92+
}
93+
return;
94+
}
95+
96+
}

0 commit comments

Comments
 (0)