# for thekestrel #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Parse::RecDescent; my $grammar =<<'GRAMMAR'; IDENTIFIER : /\w+/ { [@item] } LITERAL : /\d+/ { [@item] } SEP : /;/ { [@item] } parse : statement(s) statement : call | SEP call : IDENTIFIER '(' LITERAL ')' { [ @item[0, 1, 3] ] } GRAMMAR my $parser = Parse::RecDescent->new($grammar); my $text = <<'DATA'; func(4);foo(1); DATA my $lang = Language::C->new(); my $result = $parser->parse($text); for my $item ( @$result ) { print "Trying item : $item->[0]\n"; my $method = $item->[0]; $lang->$method(@$item); } package Language::C; use vars '$AUTOLOAD'; sub new {bless {}, shift; } sub AUTOLOAD { print "$AUTOLOAD Bugger!\n" . Data::Dumper::Dumper(\@_); } sub SEP { return } #sub DESTROY { return } sub call { print "Doing a call\n", Data::Dumper::Dumper(\@_); }