Skip to content

Instantly share code, notes, and snippets.

@rns
Created January 16, 2014 14:55
Show Gist options
  • Select an option

  • Save rns/8456260 to your computer and use it in GitHub Desktop.

Select an option

Save rns/8456260 to your computer and use it in GitHub Desktop.
use 5.010;
use strict;
use warnings;
use Data::Dumper;
use Marpa::R2;
my $g = Marpa::R2::Scanless::G->new( {
bless_package => 'main',
source => \(<<'END_OF_SOURCE'),
:default ::= action => [values] bless => ::lhs
lexeme default = action => [value] bless => ::name
seq ::= item+ separator => [,]
item ~ 'item'
:discard ~ whitespace
whitespace ~ [\s]+
END_OF_SOURCE
} );
for my $input ('item, item'){
my $r = Marpa::R2::Scanless::R->new( { grammar => $g } );
$r->read(\$input);
use Marpa::R2::ASF;
my $asf = Marpa::R2::ASF->new( { slr => $r } );
say $asf->traverse( { 'grammar' => $g }, \&generic_traverser );
}
sub generic_traverser{
# convert the glade into string
my ($glade, $scratch) = @_;
my $rule_id = $glade->rule_id();
my $symbol_id = $glade->symbol_id();
say $scratch->{grammar};
my $symbol_name = $scratch->{grammar}->symbol_name($symbol_id);
# token is a single choice, and we know enough to return it
if ( not defined $rule_id ) {
my $literal = $glade->literal();
return "$literal";
}
my $length = $glade->rh_length();
my @return_value = map { $glade->rh_value($_) } 0 .. $length - 1;
# Special case for the start rule
return (join q{ }, @return_value) . "\n" if $symbol_name eq '[:start]' ;
return "<$symbol_name: " . ( join q{ }, @return_value ) . ">";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment