#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Parse::Earley; my $parser = Parse::Earley->new(); my $grammar = <<'__GRAMMAR__'; input: expr expr: expr '+' mul_term | expr '-' mul_term | mul_term mul_term: mul_term '*' exp | mul_term '/' exp | exp exp: term '^' exp | term term: '(' expr ')' | /\d+/ { $_ < 256 } __GRAMMAR__ my $str = '1 + 2 - 3'; $parser->grammar($grammar); $parser->start('input'); $parser->advance($str) for 1..6; my ($tree) = $parser->matches_all($str, 'input'); print Dumper($tree);