+ Répondre à la discussion
Affichage des résultats 1 à 11 sur 11
  1. #1
    Invité régulier
    Profil pro
    Inscrit en
    juillet 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : juillet 2009
    Messages : 21
    Points : 6
    Points
    6

    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

  2. #2
    Expert Confirmé

    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 422
    Points : 3 370
    Points
    3 370
    Billets dans le blog
    1

    Par défaut

    Vu la tête du fichier, je ne vois pas trop d'autre solution que d'écrire soi-même le parser.
    Mes articles sur La programmation fonctionnelle en Perl publiés sur ce site:

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  3. #3
    Invité régulier
    Profil pro
    Inscrit en
    juillet 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : juillet 2009
    Messages : 21
    Points : 6
    Points
    6

    Par défaut

    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

  4. #4
    Invité régulier
    Profil pro
    Inscrit en
    juillet 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : juillet 2009
    Messages : 21
    Points : 6
    Points
    6

    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.

  5. #5
    Expert Confirmé

    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 422
    Points : 3 370
    Points
    3 370
    Billets dans le blog
    1

    Par défaut

    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.
    Mes articles sur La programmation fonctionnelle en Perl publiés sur ce site:

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  6. #6
    Invité régulier
    Profil pro
    Inscrit en
    juillet 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : juillet 2009
    Messages : 21
    Points : 6
    Points
    6

    Par défaut

    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.

  7. #7
    Invité régulier
    Profil pro
    Inscrit en
    juillet 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : juillet 2009
    Messages : 21
    Points : 6
    Points
    6

    Par défaut

    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.

  8. #8
    Expert Confirmé

    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 422
    Points : 3 370
    Points
    3 370
    Billets dans le blog
    1

    Par défaut

    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.
    Mes articles sur La programmation fonctionnelle en Perl publiés sur ce site:

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  9. #9
    Invité régulier
    Profil pro
    Inscrit en
    juillet 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : juillet 2009
    Messages : 21
    Points : 6
    Points
    6

    Par défaut

    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

  10. #10
    Invité régulier
    Profil pro
    Inscrit en
    juillet 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : juillet 2009
    Messages : 21
    Points : 6
    Points
    6

    Par défaut

    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

  11. #11
    Expert Confirmé

    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 422
    Points : 3 370
    Points
    3 370
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par dca_marshall Voir le message

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

    Mes articles sur La programmation fonctionnelle en Perl publiés sur ce site:

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •