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.

Ted

#!/usr/bin/perl

use warnings;
use strict;

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

{
    #last;
    #$::RD_WARN++;
    #$::RD_HINT++;
    $::RD_TRACE++;
}

$::RD_AUTOACTION = 
    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'


EOGRAMMAR

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