Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1288 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Parser Lexx/Yacc bonne ou mauvaise idée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Parser Lexx/Yacc bonne ou mauvaise idée

n°2026379
phdenis
Posté le 30-09-2010 à 20:16:30  profilanswer
 

Bonjour,
 
Je me pose des questions concernant quelle est la façon la plus élégante d'analyser des fichiers résultats.
J'ai des fichiers résultats qui sont formé sous forme de matrice dans un fichier out.csv dont voici un extrait:

Code :
  1. Output
  2. {{2, 4, 6} {10, 12, 14} { 30, 35, 40}}


 
Ma sortie Output contenu dans le fichier csv est de type Struct_Coord défini dans un fichier Data.h dont voici un extrait:
 

Code :
  1. typedef struct
  2. {
  3.     unsigned int Data1;
  4.     unsigned int Data2;
  5.     unsigned int Data3;
  6. } Struct_Data;
  7. typedef struct
  8. {
  9.     Struct_Data Coord1;
  10.     Struct_Data Coord2;
  11.     Struct_Data Coord3;
  12. } Struct_Coord;
  13. Struct_Coord Output;


 
Ce que je cherche à faire est d'utiliser en entrée le fichier out.csv et le fichier Data.h pour obtenir le résultat suivant:
 

Code :
  1. Output.Coord1.Data1 = 2
  2. Output.Coord1.Data2 = 4
  3. Output.Coord1.Data3 = 6
  4. Output.Coord2.Data1 = 10
  5. Output.Coord2.Data2 = 12
  6. Output.Coord2.Data3 = 14
  7. Output.Coord3.Data1 = 30
  8. Output.Coord3.Data2 = 35
  9. Output.Coord3.Data3 = 40


 
J'ai tout d'abord pensé à faire un script en Perl et puis je me suis dit qu'avec du lexx ou du yacc, cela serait plus correct.
Qu'en pensez-vous ? Pouvez-vous m'aider à débuter vu que je ne connais pas le lexx/yacc.
 
Merci de votre aide.

mood
Publicité
Posté le 30-09-2010 à 20:16:30  profilanswer
 

n°2026380
phdenis
Posté le 01-10-2010 à 19:07:32  profilanswer
 

Bon apparemment, personne n'a de réponse à ma question.
Je vais essayer d'en poser une autre:
Pouvez-vous me donner des exemples d'utilisation de lexx/yacc ou bison ?

n°2026381
o'gure
Multi grognon de B_L
Posté le 01-10-2010 à 19:13:15  profilanswer
 

Ce sujet a été déplacé de la catégorie OS Alternatifs vers la categorie Programmation par O'gure


---------------
Relax. Take a deep breath !
n°2026387
tpierron
Posté le 01-10-2010 à 20:04:57  profilanswer
 

Hmm, lex&yacc pour un truc aussi trivial, c'est franchement overkill. Un fscanf fait largement l'affaire :
 

Code :
  1. #include <stdio.h>
  2.  
  3. int main(int nb, char * argv[])
  4. {
  5.     int    vec[3], ch;
  6.     FILE * in = fopen("mat.txt", "r" );
  7.  
  8.     if (in)
  9.     {
  10.         while ((ch = fgetc(in)) != '{' && ch != EOF);
  11.         while (fscanf(in, " {%d,%d,%d}", vec, vec+1, vec+2) == 3)
  12.         {
  13.             fprintf(stderr, "%d %d %d\n", vec[0], vec[1], vec[2]);
  14.         }
  15.         fclose(in);
  16.     }
  17.     else perror("mat.txt" );
  18.  
  19.     return 0;
  20. }

n°2026390
phdenis
Posté le 01-10-2010 à 21:02:51  profilanswer
 

Merci tpierron pour ta réponse.
 
Effectivement dans mon exemple, un simple programme en C peut faire l'affaire.
 
Mais cet exemple est assez simple et de plus, je souhaite afficher le nom de chaque élément de ma structure. (Output.Coord1.Data1 = 2)
 
Les fichiers résultats que j'ai, contienne une vingtaine de fois ce genre de structure avec une profondeur de structure de 3 ou 4 niveaux.
 
Voila le pourquoi, je voulais voir comment faire avec du lexx et yacc.
 
Si tu as un exemple de comment faire ça avec du lexx ou du yacc, je suis preneur.
 
En tout cas, je te remercie pour ton aide.

n°2026397
tpierron
Posté le 01-10-2010 à 22:25:43  profilanswer
 

Oué, donc si j'ai bien compris, tu veux parser un fichier de données (out.csv), dont les valeurs décrivent plus ou moins l'initialisation d'un certain type de données déclaré dans un fichier .h
 
Tu veux donc parser ces deux trucs pour générer une suite d'affectation. J'ai un peu beaucoup de mal à voir l'intérêt de la chose, parce que si c'est vraiment ce que tu veux, il y avoir pas mal de boulot et donc vaut mieux que ça en vaille la peine.
 
D'autant que si ton but c'est d'initialiser des structures, tu peux quasiment utiliser ton fichier out.csv :
 

Code :
  1. Struct_Coord Output = {{2, 4, 6}, {10, 12, 14}, { 30, 35, 40}};


 
Et tu auras exactement le même résultat que ta suite d'affectation. Cela dit, il manque des virgules dans ton fichier de données, donc il faudra de toute manière faire un traitement dessus.

n°2026446
phdenis
Posté le 02-10-2010 à 13:27:00  profilanswer
 

En fait, je vais être plus précis. Je fais tourner un logiciel de simulation qui me donne des fichiers de sorties sous la forme de fichier CSV.
 
Donc j'obtiens des dumps de sortie qui sont formatés sous forme matricielle séparé et pour faire l'analyse, je cherche une solution élégante. (donc j'ai opté pour du lexx/yacc)
 
Car ma problématique se situe dans le fait que j'ai environ 2500 fichiers de sortie qui sont formatés au format csv.
 
Dis-moi si je suis clair ? Et si cela t'aide à comprendre mon problème ?
 
En tout cas merci pour ton aide.

n°2026456
Un Program​meur
Posté le 02-10-2010 à 15:04:43  profilanswer
 

phdenis a écrit :

En fait, je vais être plus précis. Je fais tourner un logiciel de simulation qui me donne des fichiers de sorties sous la forme de fichier CSV.

 

Ce que tu montres n'est pas un fichier cvs

 
Citation :

Donc j'obtiens des dumps de sortie qui sont formatés sous forme matricielle séparé et pour faire l'analyse, je cherche une solution élégante. (donc j'ai opté pour du lexx/yacc)

 

Utiliser lex et yacc pour un fichier CSV, c'est un peu utiliser une presse offset pour sortir un bulletin paroissial.  Ca peut être sensé si tu es familier avec ça, mais sinon.

 

Si ce n'est pas un format CSV, il faudrait peut-être en avoir une spécification pour savoir comment le lire.

 


Message édité par Un Programmeur le 02-10-2010 à 15:05:02

---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2026495
Taz
bisounours-codeur
Posté le 02-10-2010 à 19:44:46  profilanswer
 

Tu peux aussi t'amuser à parser avec libpcre (simple regex).
 
D'un autre côté, vu que t'as pas l'air de connaître le concept de tableau...

n°2026499
tpierron
Posté le 02-10-2010 à 19:55:30  profilanswer
 

Effectivement une spécification du format serait pas mal. Genre est-ce que les matrices décrites par tes fichiers "csv" sont de tailles variables ? (J'imagine que oui). Est-ce le cas aussi pour les dimensions (genre matrice 3x3x3) ?
 
Je reste néanmoins convaincu que lex&yacc, c'est overkill comme solution. Le premier programme peut-être adapté sans trop d'effort pour lire des matrices n x m. Pour des dimensions arbitraires, va y avoir un peu plus de code, mais rien d'insurmontable.

mood
Publicité
Posté le 02-10-2010 à 19:55:30  profilanswer
 

n°2026887
phdenis
Posté le 04-10-2010 à 20:53:56  profilanswer
 

Merci à tous, je vais me débrouiller tout seul.
@+


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Parser Lexx/Yacc bonne ou mauvaise idée

 

Sujets relatifs
Wanted : Parser XML avec bonnes propriétésQuel parser d'expressions mathématiques en java ?
Recherche une idée sur la programation d'un site php simple (help) urgquel parser html pour delphi ?
[OpenGl] Choisir la bonne méthode d'affichage (Vertex Array ?)[PHP] Parser XML et &
POST et GET : est ce la bonne méthode ?[Résolu] Récupérer une information avec un parser
parser une ligne de commande : problème avec noms génériques de ficsParser une chaine de caractere de longueur variable
Plus de sujets relatifs à : Parser Lexx/Yacc bonne ou mauvaise idée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR