use strict; use Parse::RecDescent; use Data::Dumper; my $grammar = q` startrule: expression /^\Z/ { $item[1]; } # you can also put comments into the grammar # such as to explain that /^\Z/ means 'match the end of the string' expression: operand operator expression { [@item[1..3]] } | operand { $item[1] } number: /\d+/ { $item[1] } paren_expression: '(' expression ')' { $item[2] } operand: paren_expression { $item[1] }| number { $item[1] } operator: '%' { [@item] } | /[*\/]/ { [@item] } | /[+-]/ { [@item] } | '=' { [@item] } `; my $parser = new Parse::RecDescent( $grammar ) or die "Compile error\n"; my $st = '3%2*4'; print Dumper($parser->startrule($st)); ##### Printout $VAR1 = [ '3', [ 'operator', '%' ], [ '2', [ 'operator', '*' ], '4' ] ];