#!/usr/bin/env perl6 use Test; our %sigils = ( bang => '!', at => '@', hash => '#', dollar => '$', percent => '%', caret => '^', and => '&', star => '*', ); our grammar DynGrammar { regex TOP { ^ (\w+) \s+ (.*?) \n? $ } } our class DynActions { method TOP($/) { if $1.match( rx/ ^ "{%sigils{$0}}" (.*?) "{%sigils{$0}}" $ / ) -> $match { make $match[0]; } } } sub dyn(Str $str) { DynGrammar.parse($str, :actions(DynActions)).made } is dyn('bang !one!' ), 'one', 'parse bang!one ok'; isnt dyn('bang @one@' ), 'one', 'isnt bang@one ok'; nok DynGrammar.parse('bang @one@', :actions(DynActions)), 'nok';