Another option would be to use meta programming, e.g. starting with
grammar g {
rule TOP { <bang> | <at> }
rule bang { 'bang' '!' [<-[!]>*] '!' }
}
g.^add_method('at', rx { 'at' [\s*] '@' [<-[@]>*] '@' } );
# ... then do the above for each of the sigils
g.^compose;
say g.parse('bang !some text!');
say g.parse('at @some text@');