use v5.10; use warnings; my $calculator = do{ use Regexp::Grammars; qr{ <Answer> <rule: Answer> <X=Mult> <Op=([+-])> <Y=Answer> | <MATCH=Mult> <rule: Mult> <X=Pow> <Op=([*/%])> <Y=Mult> | <MATCH=Pow> <rule: Pow> <X=Term> <Op=(\^)> <Y=Pow> | <MATCH=Term> <rule: Term> <MATCH=Literal> | <Sign=([-+])> \( <Answer> \) | \( <MATCH=Answer> \) <token: Literal> <MATCH=( [+-]? \d++ (?: \. \d++ )?+ )> }xms }; while (my $input = <>) { if ($input =~ $calculator) { use Data::Dumper 'Dumper'; warn Dumper \%/; } }