use v6; grammar Calc { token TOP { } rule expression { ( )* } token numeric { \d+[\.\d*]? } token op { '-' | '+' | '*' | '/' | 'x' } } my %actions = '*' => { $^a * $^b }, 'x' => { $^a * $^b }, '/' => { $^a / $^b }, '+' => { $^a + $^b }, '-' => { $^a - $^b }; class Calc::Actions { method TOP($/) { make $.ast } method expression($/) { my $value = $.ast; for $0.list -> $m { $value = $m.ast.($value, $m.ast); } make $value; } method numeric($/) { make +$/ } method op($/) { make %actions{$/} } } my $m = Calc.parse( "8.8 x 5.0 - 2", :actions( Calc::Actions)); die "dying no match" unless $m; say "$m = $m.ast()"; # vim: ft=perl6