Hi Andras,

please stay with your e-mails on the mailing-list.
Therefore we have it.

Andras Karacsony schrieb:
Hello Karl,

I ran the code you sent me and I got:

$ perl reserved_word.pl
    Parse::RecDescent: Treating "<autotree>" as an autotree marker
    Parse::RecDescent: Treating "RESERVED :" as a rule declaration
    Parse::RecDescent: Treating "AND" as a literal terminal
    Parse::RecDescent: Treating "|" as a new production
    Parse::RecDescent: Treating "OR" as a literal terminal
    Parse::RecDescent: Treating "IDENTIFIER :" as a rule declaration
    Parse::RecDescent: Treating "...!" as a negative lookahead
    Parse::RecDescent: Treating "RESERVED" as a subrule match
    Parse::RecDescent: Treating "m/[a-z0-9]+/i" as an m/../ pattern terminal
printing code (11155) to RD_TRACE
ANDY
^Z
 1|IDENTIFIER|Trying rule: [IDENTIFIER]             |
 1|IDENTIFIER|                                      |"ANDY\n"
 1|IDENTIFIER|Trying production: [RESERVED /[a-z0-  |
  |          |9]+/i]                                |
 1|IDENTIFIER|Trying subrule: [RESERVED]            |
 2| RESERVED |Trying rule: [RESERVED]               |
 2| RESERVED |Trying production: ['AND']            |
 2| RESERVED |Trying terminal: ['AND']              |
 2| RESERVED |>>Matched terminal<< (return value:   |
  |          |[AND])                                |
 2| RESERVED |                                      |"Y\n"
 2| RESERVED |Trying action                         |
 2| RESERVED |>>Matched action<< (return value: [0])|
 2| RESERVED |>>Matched production: ['AND']<<       |
 2| RESERVED |>>Matched rule<< (return value: [0])  |
 2| RESERVED |(consumed: [AND])                     |
 1|IDENTIFIER|<<Didn't match subrule: [RESERVED]>>  |
 1|IDENTIFIER|                                      |"ANDY\n"
 1|IDENTIFIER|<<Didn't match rule>>                 |
$VAR1 = undef;


I won't pretend that I understand all this, but does not seem to be working.

hmmm, I've overseen that the global skip pattern is qr/\s*/, therefore ANDY is matched as a reserved word too, since the token prefix can be just nothing.

To change the token prefix in the RESERVED rule
to \s+ (<-- see the + instead of *) should help:

<<<<<<<<<<<<<<<<<<<<<<<<< snip >>>>>>>>>>>>>>>>>>>>>>>
#!/usr/local/bin/perl

use strict;
use warnings;
use Parse::RecDescent;
$::RD_TRACE = 1;
use Data::Dumper;

my $grammar = <<'EOG';
<autotree>
RESERVED : <skip: qr/\s+/> ('AND' | 'OR')
IDENTIFIER : ...!RESERVED m/[a-z0-9]+/i
EOG

my $parser = Parse::RecDescent->new($grammar)
    or die "can't create parser,";

my $text = join '', <>;
print Dumper($parser->IDENTIFIER($text));
<<<<<<<<<<<<<<<<<<<<<<<<< snip >>>>>>>>>>>>>>>>>>>>>>>

Best Regards
        Charly

--
Karl Gaissmaier       KIZ/Infrastructure, University of Ulm, Germany
Email:[EMAIL PROTECTED]           Service Group Network



Reply via email to