Parser Lexx/Yacc bonne ou mauvaise idée

Parser Lexx/Yacc bonne ou mauvaise idée - C - Programmation

Marsh Posté le 30-09-2010 à 20:16:30    

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.

Reply

Marsh Posté le 30-09-2010 à 20:16:30   

Reply

Marsh Posté le 01-10-2010 à 19:07:32    

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 ?

Reply

Marsh Posté le 01-10-2010 à 19:13:15    

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


---------------
Relax. Take a deep breath !
Reply

Marsh Posté le 01-10-2010 à 20:04:57    

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. }

Reply

Marsh Posté le 01-10-2010 à 21:02:51    

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.

Reply

Marsh Posté le 01-10-2010 à 22:25:43    

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.

Reply

Marsh Posté le 02-10-2010 à 13:27:00    

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.

Reply

Marsh Posté le 02-10-2010 à 15:04:43    

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)
Reply

Marsh Posté le 02-10-2010 à 19:44:46    

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...

Reply

Marsh Posté le 02-10-2010 à 19:55:30    

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.

Reply

Marsh Posté le 02-10-2010 à 19:55:30   

Reply

Marsh Posté le 04-10-2010 à 20:53:56    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed