Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Modules
Modules Toutes vos questions sur l'utilisation, l'installation, la création de modules Perl sous Windows/Linux/Unix/MacOS. Avant de poster, veuillez consulter les FAQs perl, les cours Perl et les sources Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 05/09/2012, 13h41   #1
dca_marshall
Invité régulier
 
Inscription : juillet 2009
Messages : 12
Détails du profil
Informations personnelles :
Âge : 51
Localisation : France

Informations forums :
Inscription : juillet 2009
Messages : 12
Points : 5
Points : 5
Par défaut Recherche un Parser Générique

Bonjour,

Je recherche un Parser Générique.
J'ai besoin d'analyser une dizaine de type de fichiers différents.
Ce sont des fichiers de Control permettant le chargement d'objets divers dans des Progiciels. Ils font en général plusieurs dizaines de Mo.

Il me semble que dans CPAN j'avais vu quelque chose d'approchant, mais impossible de le retrouver.

Le style des fichiers est plutôt comme ceci :
Code :
1
2
3
4
5
6
7
8
 
objniveau1 objtype(name) param2('valeur')
param3 param4(valeur)
param5 etc...
objniveau2 
objtype(name) param2 param8(valeur) param9('valeur')
param3 param4 param7
objniveau1 etc...
Il n'y a pas d'ordre dans les paramètres, quelques fois la valeur n'est pas présente et peut être entre simple cote dans les parenthèse.
Pour d'autre fichier la valeur suit le paramètre sans pour autant que cette valeur soit obligatoire (donc on se retrouve sur un mot clé).
Pas d'indentation, pas de balise de début et/ou de fin.
La définition d'un objet et de ses objets fils peut être sur plusieurs lignes.

J'ai essayé en traficotant des parser JSON ou YAML sans grande réussite
J'ai aussi développé un module qui me rend quelques services, mais il est trop compliqué, torturé, pas assez générique et me fait monter la tension quand je le modifie.

Par avance merci de votre aide.

DCA
dca_marshall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2012, 10h42   #2
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 567
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 567
Points : 1 117
Points : 1 117
Vu la tête du fichier, je ne vois pas trop d'autre solution que d'écrire soi-même le parser.
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2012, 11h17   #3
dca_marshall
Invité régulier
 
Inscription : juillet 2009
Messages : 12
Détails du profil
Informations personnelles :
Âge : 51
Localisation : France

Informations forums :
Inscription : juillet 2009
Messages : 12
Points : 5
Points : 5
Citation:
Envoyé par dca_marshall Voir le message
J'ai aussi développé un module qui me rend quelques services, mais il est trop compliqué, torturé, pas assez générique et me fait monter la tension quand je le modifie.
Bonjour,

Merci pour ta réponse, mais c'est déjà fait (ci-dessus).

Toutefois je relance le sujet sur le parser générique.

Je suis sûr d'avoir vu quelque chose de ce type sur CAPN, mais impossible de retrouver comment je suis tombé dessus à l"époque (c'était il y a qq mois).

Merci encore de votre contribution.
DCA
dca_marshall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 11h29   #4
dca_marshall
Invité régulier
 
Inscription : juillet 2009
Messages : 12
Détails du profil
Informations personnelles :
Âge : 51
Localisation : France

Informations forums :
Inscription : juillet 2009
Messages : 12
Points : 5
Points : 5
Par défaut Parse::RecDescent

Bonjour,

Je reviens à la charge avec mon Parser.
Je n'est rien trouvé de mieux que Parse::RecDescent (c'était peut-être bien ce que je cherchai et que j'ai nommé générique...).

Toutefois j'ai un peu de mal avec. Je n'arrive pas à tout détecter

Quelqu'un saurait-il m'aider sur ce Parser ou y aurait-il un Tuto (spécial neuneu) en Français quelque part

Par avance merci de votre aide.
dca_marshall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 13h25   #5
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 567
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 567
Points : 1 117
Points : 1 117
J'ai vu un tuto pas mal fait dans le livre "Data Munging with Perl" sur ce super module de Damian Conway, mais c'est en anglais.

A voir si ce livre a été traduit en français, mais je n'en ai pas l'impression.
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 13h53   #6
dca_marshall
Invité régulier
 
Inscription : juillet 2009
Messages : 12
Détails du profil
Informations personnelles :
Âge : 51
Localisation : France

Informations forums :
Inscription : juillet 2009
Messages : 12
Points : 5
Points : 5
Je confirme, ce bouquin n'est pas traduit en Français...
Mais effectivement il parait contenir des choses intéressantes.
Aller je le prend.
Merci pour cette info Lolo78

Je reste toujours en recherche d'aide sur RecDescent, merci d'avance.
dca_marshall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 16h16   #7
dca_marshall
Invité régulier
 
Inscription : juillet 2009
Messages : 12
Détails du profil
Informations personnelles :
Âge : 51
Localisation : France

Informations forums :
Inscription : juillet 2009
Messages : 12
Points : 5
Points : 5
Mon problème est le suivant...

Les lignes du fichier :
Code :
1
2
3
4
5
6
CONTROL1 PARAM1(AA)
  PARAM2(BB) PARAM3(CC)
  PARAM4(DD)
  PARAM5('EE ii oo $truc')
  CONTROL2 PARAM6(FF) PARAM7(GG)
Grammaire:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
 
value         : /\(/ /[A-Z0-9]+/i /\)/ { return $main::VALUE=$item[2]; }
 
descr         : /\(\'/ /[A-Z0-9 ,:;$£@]+/i /\'\)/ { return $main::VALUE=$item[2]; }
 
parameter     : /[A-Z0-9]+/i
 
getParameter  : parameter  { $main::PARAM=$item[1]; }
 
paramAndValue : getParameter value { return main::print_parameterStatement(@item) }
              | getParameter descr { return main::print_parameterStatement(@item) }
 
control       : /CONTROL1/i
              | /CONTROL2/i
 
getControl    : control { $main::CONTROL=$item[1]; }
 
line          : getControl(s?) paramAndValue(s?)
              | paramAndValue(s)
 
startrule     : line
Je récupère bien CONTROL1, PARAM1 avec "AA", PARAM2 avec "BB", PAPRAM4 avec "DD", PARAM5 avec "EE ii oo $truc", CONTROL2, PARAM6 avec "FF",
mais je ne récupère pas PARAM3 avec "CC", ainsi que PARAM7 avec "GG".
Je ne reçois qu'une référence à un ARRAY dans lequel je trouve (avec DataDumper) :

Une idée ??? Une remarque ???

Merci d'avance.
dca_marshall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 18h56   #8
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 567
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 567
Points : 1 117
Points : 1 117
Manifestement, tu ne récupères pas les params quand il y en a plus d'un param sur la même ligne.

Je pense que tu as peut-être un problème dans ta définition de ligne dans ta grammaire:

Code :
1
2
line          : getControl(s?) paramAndValue(s?)
              | paramAndValue(s)
Je ne connais pas la syntaxe, mais il faut sans doute spécifier que la ligne peut contenir un contrôle suivi d'une ou plusieurs paramValues.
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 12h47   #9
dca_marshall
Invité régulier
 
Inscription : juillet 2009
Messages : 12
Détails du profil
Informations personnelles :
Âge : 51
Localisation : France

Informations forums :
Inscription : juillet 2009
Messages : 12
Points : 5
Points : 5
Merci Lolo78, tu suis. J'apprécie

Toutefois c'est le but du (s?) dans :
Code :
line          : getControl(s?) paramAndValue(s?)
Le truc c'est que j'ai essayé aussi ça :
Code :
line          : getControl(s?) paramAndValue paramAndValue
mais sans succès
dca_marshall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2012, 10h28   #10
dca_marshall
Invité régulier
 
Inscription : juillet 2009
Messages : 12
Détails du profil
Informations personnelles :
Âge : 51
Localisation : France

Informations forums :
Inscription : juillet 2009
Messages : 12
Points : 5
Points : 5
Bonjour les gens,

Je viens de résoudre mon problème

Il ne faut pas mettre return dans :
Code :
{ return main::print_parameterStatement(@item) }
mais :
Code :
{ main::print_parameterStatement(@item) }
En effet, avec return le premier Token (ou expression) trouvé est consommé et le parsing ne passe pas à la suite sur une même ligne.

C'était pas super clair dans la doc, mais voilà pour ceux que cela intéresse.

Bonne année à tous et plus particulièrement à Lolo78
dca_marshall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2013, 19h13   #11
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 567
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 567
Points : 1 117
Points : 1 117
Citation:
Envoyé par dca_marshall Voir le message

Bonne année à tous et plus particulièrement à Lolo78
Bonne année à toi aussi.

__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h29.


 
 
 
 
Partenaires

Hébergement Web