On Tue, 30 Oct 2007 13:41:22 -0400 [EMAIL PROTECTED] wrote: 

txb> But given all that, and the toy grammar below, which matches "sir george", 
txb> how could we modify it to match "io;ajwer;i324 sir george"

Here's my solution:

1) treat the whole input as a line made of items
2) each item can be a word or a name (we try to match a 'name' first)
3) a word is any number of non-space characters

The key is to walk through the input, looking for names.  I tried a few
other inputs and they seemed to work the way you want.



use warnings;
use strict;

use Data::Dumper;
use Parse::RecDescent;


    q { [EMAIL PROTECTED] } ; 

my $G = << 'EOGRAMMAR' ;

line: item(s)
item: name | word
name: name_types eofile { $return = $item[1] }
eofile: /^\Z/

word: /\S+/

name_types: royal 

royal: title firstname of(?)

title: 'sir' | 'his holiness'

firstname: 'george' | 'john'

of: 'of' place

place: 'kent'


my $p = Parse::RecDescent->new($G) ;

my @strings = ("hello there sir george",
               "io;ajwer;i324 sir george",
               "welcome his holiness john of kent");

my $parser = 'line' ;

foreach my $string (@strings)
 my $r =  $p -> $parser ( $string ) ;
 warn Dumper $r;

Reply via email to