Discussion:
Parse::RecDescent
(trop ancien pour répondre)
C++
2010-04-30 13:00:44 UTC
Permalink
Bonjour à tous,

J'ai une question concernant Parse::Rescent. Je veux construire un
tableau les associations mot, valeur d'une ligne. Voici mon
programme :

#! /usr/bin/perl

use strict;
use warnings;

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

$::RD_TRACE = 1;
$::RD_HINT = 1;

our $ligne;

my $grammaire = <<'EOT';

startrule: <rulevar: local @Valeurs>

startrule: infos
{ { valeurs => [ @Valeurs ] } }


infos: info 'et' infos | info
{ print 'Infos\n'; }

info: mot',' nombre
{ push @Valeurs, { mot => $item{ mot }, nombre =>
$item{ nombre } }; }

mot: /\w+/

nombre: /\d+/

EOT

my $parseur = new Parse::RecDescent( $grammaire ) or die "Erreur\n";

my $valeurs = $parseur->startrule( "mot1, 10 et mot2, 11 et mot3,
13" ) or die "Erreur\n";

print Dumper( $valeurs ) . "\n";

La dernière association est dupliquée dans mon tableau. Pourquoi ?

Merci.

Jean-Michel
Paul Gaborit
2010-04-30 22:35:18 UTC
Permalink
À (at) Fri, 30 Apr 2010 06:00:44 -0700 (PDT),
Post by C++
J'ai une question concernant Parse::Rescent. Je veux construire un
tableau les associations mot, valeur d'une ligne. Voici mon
[... exemple...]
Post by C++
La dernière association est dupliquée dans mon tableau. Pourquoi ?
Parc qu'il n'y a pas de backtrack sur le résultat des actions
sémantiques. Donc lorsque 'info' est reconnu la dernière fois, c'est
pour tester s'il est suivi de 'et' et comme il ne l'est pas, il est
parsé une deuxième fois (mais seul cette fois). Mais on est quand même
passé deux fois dans 'info' donc l'information est dupliquée.

Je n'utilise pas Parse::RecDescent mais plutôt Parse::Yapp que je trouve
plus simple et puissant. Mais je pense que la solution est la même. Il
faut utiliser une récursivité à gauche :

infos : infos 'et' info | info;
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Loading...