[LEX && YACC]Peut on les avoir sur Windows?

Peut on les avoir sur Windows? [LEX && YACC] - C - Programmation

Marsh Posté le 12-10-2005 à 21:52:31    

Lut,
 
 
Sur une plateforme Unix Sun Solaris, j'ai des programmes qui utilisent des programmes C obtenus grace aux librairie LEX et YACC, je dois porter ces programmes sur une plateforme windows. Je voulais savoir s'il existait un moyen d'installer YACC et LEX sur Windows pour que je recompile mes programmes C.
 
Sous unix, la commande c'est :    
 

Code :
  1. lex mon fichier_description.lex


j'obtiens donc un programme C appelé lex.yy.c
 

Code :
  1. yacc -v -t fichier_description.yacc


et j'obtiens un programme C appelé y.tab.c
 
Apres je peux utiliser ces 2 programmes pour en compiler d'autre.
 
A+

Reply

Marsh Posté le 12-10-2005 à 21:52:31   

Reply

Marsh Posté le 12-10-2005 à 22:04:48    

cervantes a écrit :

Sur une plateforme Unix Sun Solaris, j'ai des programmes qui utilisent des programmes C obtenus grace aux librairie LEX et YACC, je dois porter ces programmes sur une plateforme windows. Je voulais savoir s'il existait un moyen d'installer YACC et LEX sur Windows pour que je recompile mes programmes C.


Ben oui, essaye plutôt les clones GNU flex et bison... [:google] est ton ami.


Message édité par Emmanuel Delahaye le 12-10-2005 à 22:05:16

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 12-10-2005 à 22:25:35    

Tu vas peut etre pouvoir eclairer ma lanterne.  
 
Quel est le lien flex/lex et bison/yacc?  est ce que flex ne serait pas l'equivalent de lex sur Windows et Bison l'equivalent de yacc?

Reply

Marsh Posté le 12-10-2005 à 22:43:05    

cervantes a écrit :

Tu vas peut etre pouvoir eclairer ma lanterne.  
 
Quel est le lien flex/lex et bison/yacc?  est ce que flex ne serait pas l'equivalent de lex sur Windows et Bison l'equivalent de yacc?


Ca parait un peu évident, non ? Sinon, tu lis la doc.
Yack :  
http://alain.debord.club.fr/bestiaire/yack.jpg
Bison:
http://www.fnal.gov/pub/about/campus/ecology/images/bison.jpg


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-10-2005 à 23:14:58    

Reply

Marsh Posté le 02-12-2008 à 18:02:13    

Bonjour,
 
Je cherche à réaliser une petite calculatrice simple fonctionnant sous windows. Par exemple l'utilisateur rentre une chaine de caractères comme "5-(4.2*3) + sin(PI/3)" puis l'application retourne le résultat après appui sur la touche 'Enter' ou après un clic sur le bouton 'OK'
 
J'ai pensé utiliser des générateurs d'analyseurs syntaxique et lexical comme flex et bison. Je ai donc téléchargé flex et bison sous windows, mais le problème est que j'ai l'impression que ça ne marche que dans une fenêtres DOS, or moi je veux que ça fonctionne dans une appli win32.
 
Ce que j'aimerais c'est que l'entrée ne soit pas STDIN ou un fichier mais une chaine de caractères !
 
Savez-vous comment procéder ?


Message édité par jcop le 02-12-2008 à 18:10:34
Reply

Marsh Posté le 02-12-2008 à 20:35:53    

Citation :

mais le problème est que j'ai l'impression que ça ne marche que dans une fenêtres DOS

Quest-ce qui ne marche que dans une fenetre dos??
flex et bison? Normal, puisque ca n'a pour but que de generer des fichiers a incorporer dans son propre programme.
Le code généré? non, on peut tres bien intégrer ca a un programme dévellopé pour windows.
A+,


Message édité par gilou le 02-12-2008 à 20:36:14

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-12-2008 à 01:15:24    

Je parle bien évidemment du code généré.
 
Le problème est que je ne vois pas comment l'intégrer à un programme windows.
Ce que je voudrais c'est que la fonction yyparse() analyse une chaîne de caractères et non l'entrée STDIN

Reply

Marsh Posté le 03-12-2008 à 13:36:23    

Si vous lisiez la documentation de bison/flex, ca pourrait être utile.
 

Citation :

Three routines are available for setting up input buffers for scanning in-memory strings instead of files. All of them create a new input buffer for scanning the string, and return a corresponding YY_BUFFER_STATE handle (which you should delete with yy_delete_buffer() when done with it). They also switch to the new buffer using yy_switch_to_buffer(), so the next call to yylex() will start scanning the string.
 
 
    * yy_scan_string(const char *str)
    * ...scans a NUL-terminated string.
    * yy_scan_bytes(const char *bytes, int len)
    * ...scans len bytes (including possibly NUL's) starting at location bytes.
 
 
 
Note that both of these functions create and scan a copy of the string or bytes. (This may be desirable, since yylex() modifies the contents of the buffer it is scanning.) You can avoid the copy by using:
 
 
    * yy_scan_buffer(char *base, yy_size_t size)
    * ...which scans in place the buffer starting at base, consisting of
      size bytes, the last two bytes of which must be YY_END_OF_BUFFER_CHAR (ASCII NUL). These last two bytes are not scanned; thus, scanning consists of base[0] through base[size-2], inclusive.
    * If you fail to set up base in this manner (i.e., forget the final two YY_END_OF_BUFFER_CHAR bytes), then yy_scan_buffer() returns a nil pointer instead of creating a new input buffer.
    * The type yy_size_t is an integral type to which you can cast an integer expression reflecting the size of the buffer.


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-12-2008 à 23:44:30    

OK merci je vais regarder ça !

Reply

Marsh Posté le 03-12-2008 à 23:44:30   

Reply

Marsh Posté le 18-12-2008 à 20:31:03    

Bon à la compilation j'ai le message d'erreur suivant :
[Linker Error] undefined reference to 'yy_scan_string'
[Linker Error] undefined reference to 'yy_delete_buffer'
 
J'essaie de trouver la solution de mon côté, mais si quelqu'un connaît la réponse, ce serait sympa qu'il se manifeste !

Reply

Marsh Posté le 20-12-2008 à 13:24:16    

Bon pour être plus précis les fonctions sont dans le main du fichier bison :
 

Citation :


int main (void)
{
 char* chaine = "1+2+3+4+5*3";
 int my_string_buffer = yy_scan_string (chaine);
 yyparse ();
 yy_delete_buffer (my_string_buffer);
}


 
Quelqu'un a t'il une idée ?

Reply

Marsh Posté le 20-12-2008 à 16:15:03    

:sarcastic:
C'est dans le .l ?  
Et tu fais quoi comme include?
Et tu linkes comment?
 
De plus, la chaine doit être terminée correctement par un \0:
 char* chaine = "1+2+3+4+5*3\0";  
A+,

Message cité 1 fois
Message édité par gilou le 20-12-2008 à 16:25:44

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-12-2008 à 18:25:38    

gilou a écrit :


De plus, la chaine doit être terminée correctement par un \0:
 char* chaine = "1+2+3+4+5*3\0";  


c'est pas fait automatiquement ?
 [:pingouino]  

Reply

Marsh Posté le 20-12-2008 à 18:50:57    

En y repensant, oui, ca doit être la cas, c'est quand on passe un buffer qu'il faut faire gaffe.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 22-12-2008 à 19:20:44    

Bon après plusieurs recherches sur Internet et tâtonnements j'ai fini par trouver !!!
La doc officielle de flex n'aide pas vraiment et il n'y a quasiment rien à ce sujet sur le web !
C'est une page web qui m'a aiguillé vers la solution, la voici : http://www.geocities.com/dbeurive/commun/bison.htm
 
Donc dans le lex (fichier d'extension .l) il fallait rajouter ça :

Citation :


/* ----------------------------------------------------- */
/* The following code is used to parse in-memory data    */
/*   -> init_lexical_parser: must be called before the   */
/*      grammatical analyzer.                            */
/*   -> close_lexical_parser: must be called after the   */
/*      end of the grammatical analyzer.                 */
/* ----------------------------------------------------- */
 
static YY_BUFFER_STATE buf_state;
void init_lexical_parser(char *src) { buf_state = yy_scan_string(src); }
void close_lexical_parser() { yy_delete_buffer(buf_state); }


 
et dans le fichier contenant le main (qui peut être le fichier yacc) :

Citation :

/* ----------------------------------------------------- */
/* The following code is used to interface with the in-  */
/* -memory lexical parser.                               */
/* ----------------------------------------------------- */
extern void init_lexical_parser(char *src);
extern void close_lexical_parser();
 
int main(...) {
  ...
  init_lexical_parser(chaine_a_parser);
  yyparse();
  close_lexical_parser();
  ...
}


 
Voilà, je vais pouvoir avancer dans mon appli !
 
 


Message édité par jcop le 22-12-2008 à 19:25:18
Reply

Sujets relatifs:

Leave a Replay

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