Parse::RecDescent

Le
C++
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'; }

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";

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

print Dumper( $valeurs ) . "";

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

Merci.

Jean-Michel
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Paul Gaborit
Le #21663821
À (at) Fri, 30 Apr 2010 06:00:44 -0700 (PDT),
"C++"
J'ai une question concernant Parse::Rescent. Je veux construire un
tableau les associations mot, valeur d'une ligne. Voici mon
programme :


[... exemple...]

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 - Perl en français -
Publicité
Poster une réponse
Anonyme