Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Parse::RecDescent

1 réponse
Avatar
C++
Bonjour =E0 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 =3D 1;
$::RD_HINT =3D 1;

our $ligne;

my $grammaire =3D <<'EOT';

startrule: <rulevar: local @Valeurs>

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


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

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

mot: /\w+/

nombre: /\d+/

EOT

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

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

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

La derni=E8re association est dupliqu=E9e dans mon tableau. Pourquoi ?

Merci.

Jean-Michel

1 réponse

Avatar
Paul Gaborit
À (at) Fri, 30 Apr 2010 06:00:44 -0700 (PDT),
"C++" écrivait (wrote):

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 - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>