use strict; use warnings; use Marpa::R2; my $dsl = <<'END_OF_DSL'; lexeme default = latm => 1 Dice_Expression ::= Simple_Dice action => ::first Simple_Dice ::= Rolls ('d') Sides action => do_simple_roll Rolls ~ digits Sides ~ digits digits ~ [\d]+ :discard ~ whiteSpace whiteSpace ~ [\s]+ END_OF_DSL package Actions; sub do_simple_roll { my (undef, $rolls, $sides) = @_; my @res = map {1 + int(rand($sides))} 1 .. $rolls; return \@res; } package main; my $grammar = Marpa::R2::Scanless::G->new({ source => \$dsl}); my $input = '2d6'; my $rolls = $grammar->parse(\$input, 'Actions'); print "Result: @$$rolls\n"; #### Dice_Expression ::= Simple_Dice action => ::first