begin process at 2012 05 27 20:02:31
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > INI PARSER FLEX++ / BISON++

INI PARSER FLEX++ / BISON++


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Classé sous :flex, bison, parseur, parser, fichier INI Niveau :Initié Date de création :08/02/2009 Date de mise à jour :08/02/2009 09:53:54 Vu / téléchargé :4 919 / 231

Auteur : neria

Ecrire un message privé
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

 Description

Bonjour tout le monde !

Voilà les sources d'un parseur de fichier INI généré grâce à flex++ et bison++ . Il n'y a rien d'extraordinaire à faire un parseur avec flex, mais le challenge est tout autre quand on doit le faire avec flex++ et bison++ puis l'intégrer dans une application C++ (et pas seulement pour un but pédagogique). Je livre donc le travail de 4 jours de galère en espérant qu'il puisse servir à d'autres.

Source

  • ######################################################################################################################
  • parseurINI.l
  • ######################################################################################################################
  • %{
  • #define _SKIP_YYFLEXLEXER_
  • #include "Scanner.h"
  • #include "ParseurINI.h"
  • %}
  • %option noyywrap
  • %option c++
  • %option yyclass="Scanner"
  • %%
  • \n {yylineno++;}
  • [ \t]* {; /* spaces */}
  • ;[^\n]* {; /* comments */}
  • [^ \t\n\r;=\[\]]+ {return YY_ParseurINI_CLASS::CHAINE ;}
  • . {return yytext[0] ;}
  • %%
  • ######################################################################################################################
  • parseurINI.y
  • ######################################################################################################################
  • %name ParseurINI
  • %define LSP_NEEDED
  • %define CONSTRUCTOR_PARAM istream* pFile
  • %define CONSTRUCTOR_INIT : scanner(pFile)
  • %define CONSTRUCTOR_CODE {yyparse() ;}
  • %define LEX_BODY {return scanner.yylex();}
  • %define MEMBERS \
  • virtual ~ParseurINI() {} \
  • private: \
  • Scanner scanner ;\
  • map<string, map<string, string> > mapSections ; \
  • string sectionCourante ;\
  • public:\
  • const map<string, string> operator[] (string section) {return mapSections[section] ;}
  • %define ERROR_BODY {cerr << "error on line : " << scanner.lineno() << ", last token : '" << scanner.YYText() << "'" << endl;}
  • %header{
  • // Inspiré de :
  • // https://www.mirbsd.org/htman/i386/man1/lex.htm
  • // http://pwet.fr/man/linux/commandes/bison
  • // http://docs.linux.cz/programming/c++/www.icce.rug.nl/documents/cplusplus/cplusplus19.html#l362
  • // Et beaucoup de courage !
  • #include <map>
  • #include <string>
  • #include <iostream>
  • #include <fstream>
  • #include "Scanner.h"
  • #include <string.h>
  • using namespace std;
  • %}
  • %union { char chaine[500];}
  • %token <chaine> CHAINE
  • %type <chaine> chaine
  • %start fichier
  • %%
  • fichier:
  • | section fichier
  • | regle fichier
  • ;
  • section:
  • '[' chaine ']' {sectionCourante = $2;}
  • ;
  • regle:
  • chaine '=' chaine {(mapSections[sectionCourante])[$1] = $3;}
  • ;
  • chaine:
  • CHAINE {strcpy($$, scanner.YYText());}
  • ;
  • %%
  • ######################################################################################################################
  • Scanner.h
  • ######################################################################################################################
  • #ifndef _SCANNER_H_
  • #define _SCANNER_H_
  • #if ! defined(_SKIP_YYFLEXLEXER_)
  • #include <FlexLexer.h>
  • #endif
  • using namespace std ;
  • class Scanner: public yyFlexLexer
  • {
  • public:
  • Scanner (istream* pFile) : yyFlexLexer(pFile) {}
  • int yylex();
  • };
  • #endif
  • ######################################################################################################################
  • Main.cpp
  • ######################################################################################################################
  • #include <map>
  • #include <string>
  • #include <vector>
  • #include <iostream>
  • #include "ParseurINI.h"
  • using namespace std;
  • int main()
  • {
  • try
  • {
  • ifstream config ("config.ini") ;
  • // &cin for stdin
  • ParseurINI parseur(&config) ;
  • map<string, string> sectionMain = parseur["Main"] ;
  • cout << "Serveur MySQL : " << sectionMain["ServeurMySQL"] << endl ;
  • }
  • catch(string s)
  • {
  • cout << s << "\n" ;
  • return 1 ;
  • }
  • catch(...)
  • {
  • cout << "Erreur innatendue\n" ;
  • return 1 ;
  • }
  • return 0 ;
  • }
  • ######################################################################################################################
  • Makefile
  • ######################################################################################################################
  • COMPILE := -c
  • FLAGS := -Wall
  • CC := g++
  • EXEC := main.exe
  • all: ParseurINI.o lex.yy.o Main.o
  • ${CC} ${FLAGS} $^ -o ${EXEC}
  • %.o:%.cpp
  • ${CC} ${FLAGS} ${COMPILE} $^ -o $@
  • ParseurINI.o: parseurINI.l parseurINI.y Scanner.h
  • bison++ -o ParseurINI.cpp -h ParseurINI.h -d parseurINI.y
  • flex++ parseurINI.l
  • g++ ${COMPILE} lex.yy.cc
  • g++ ${COMPILE} ParseurINI.cpp
  • clean:
  • rm -f *~ *.o *.gch ParseurINI.h ParseurINI.cpp lex.yy.cc ${EXEC}
######################################################################################################################
parseurINI.l
######################################################################################################################
%{
#define _SKIP_YYFLEXLEXER_
#include "Scanner.h"
#include "ParseurINI.h"
%}

%option noyywrap
%option c++
%option yyclass="Scanner"

%%
\n			{yylineno++;}
[ \t]*			{; /* spaces */}
;[^\n]*			{; /* comments */}
[^ \t\n\r;=\[\]]+	{return YY_ParseurINI_CLASS::CHAINE ;}
.			{return yytext[0] ;}
%%


######################################################################################################################
parseurINI.y
######################################################################################################################
%name ParseurINI
%define LSP_NEEDED

%define CONSTRUCTOR_PARAM istream* pFile
%define CONSTRUCTOR_INIT : scanner(pFile)
%define CONSTRUCTOR_CODE {yyparse() ;}

%define LEX_BODY {return scanner.yylex();}

%define MEMBERS \
virtual ~ParseurINI() {} \
private: \
Scanner scanner ;\
map<string, map<string, string> > mapSections ; \
string sectionCourante ;\
public:\
const map<string, string> operator[] (string section) {return mapSections[section] ;}

%define ERROR_BODY {cerr << "error on line : " << scanner.lineno() << ", last token : '" << scanner.YYText() << "'" << endl;}

%header{
  // Inspiré de :
  // https://www.mirbsd.org/htman/i386/man1/lex.htm
  // http://pwet.fr/man/linux/commandes/bison
  // http://docs.linux.cz/programming/c++/www.icce.rug.nl/documents/cplusplus/cplusplus19.html#l362
  // Et beaucoup de courage !

#include <map>
#include <string>
#include <iostream>
#include <fstream>
#include "Scanner.h"
#include <string.h>

  using namespace std;
%}

%union { char chaine[500];}
%token <chaine> CHAINE
%type <chaine> chaine

%start fichier
%%

fichier:

	| section fichier
	| regle fichier
	;

section:
'[' chaine ']'		{sectionCourante = $2;}
	;

regle:
chaine '=' chaine	{(mapSections[sectionCourante])[$1] = $3;}
	;

chaine:
CHAINE			{strcpy($$, scanner.YYText());}
        ;
%%


######################################################################################################################
Scanner.h
######################################################################################################################
#ifndef _SCANNER_H_
#define _SCANNER_H_

#if ! defined(_SKIP_YYFLEXLEXER_)
#include <FlexLexer.h>
#endif

using namespace std ;

class Scanner: public yyFlexLexer
{
 public:
  Scanner (istream* pFile) : yyFlexLexer(pFile) {}
  int yylex();
};

#endif


######################################################################################################################
Main.cpp
######################################################################################################################
#include <map>
#include <string>
#include <vector>
#include <iostream>

#include "ParseurINI.h"

using namespace std;

int main()
{
  try
    {
      ifstream config ("config.ini") ;
      // &cin for stdin
      ParseurINI parseur(&config) ;

      map<string, string> sectionMain = parseur["Main"] ;
      cout << "Serveur MySQL : " << sectionMain["ServeurMySQL"] << endl ;

    }
  catch(string s)
    {
      cout << s << "\n" ;
      return 1 ;
    }
  catch(...)
    {
      cout << "Erreur innatendue\n" ;
      return 1 ;
    }

  return 0 ;
}


######################################################################################################################
Makefile
######################################################################################################################
COMPILE := -c
FLAGS := -Wall
CC := g++
EXEC := main.exe

all: ParseurINI.o lex.yy.o Main.o
	${CC} ${FLAGS} $^ -o ${EXEC}

%.o:%.cpp
	${CC} ${FLAGS} ${COMPILE} $^ -o $@

ParseurINI.o: parseurINI.l parseurINI.y Scanner.h
	bison++ -o ParseurINI.cpp -h ParseurINI.h -d parseurINI.y
	flex++ parseurINI.l
	g++ ${COMPILE} lex.yy.cc
	g++ ${COMPILE} ParseurINI.cpp

clean:
	rm -f *~ *.o *.gch ParseurINI.h ParseurINI.cpp lex.yy.cc ${EXEC}

 Conclusion

Les fichiers ont été crées sous Debian GNU/Linux donc attention à l'encodage.
g++ 4.3.2
flex++ 2.5.35
bison++ 1.21.9-1

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

08 février 2009 09:53:54 :
Premier envoi.

 Sources du même auteur

WXFREECHART PIEPLOT EXAMPLE
Source avec Zip Source avec une capture TI IMAGE V7

 Sources de la même categorie

Source avec Zip KISIEL CD INFO DRIVE par kisiel0147852
Source avec une capture SUPPRESSION DES REDONDANCES DE FICHIERS par cyberntique
Source avec Zip ÉDITEUR DE RECTANGLES EN CONSOLE par seoseo
CONVERSION DE FICHIER EN FICHIER BMP par seoseo
Source avec Zip DETECTEUR EJP par idpro

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture SCANNER FLEX par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip TRADUCTEUR SIMPLIFIÉ DU PASCAL VERS LE C - LEX ET YACC (FLEX... par Spawnrider
Source avec Zip Source avec une capture INTERPRÉTEUR PSEUDO SQL par karamimed
Source avec Zip MINXL (MINIMALIST XML LIBRARY) : GÉNÉRATEUR/ANALYSEUR/TRAITE... par xterminhate

Commentaires et avis

Commentaire de exar le 16/02/2009 15:26:48

Hello !
Il y a déjà pas mal de temps que je veux me mettre à flex++ / bison++, voilà l'occasion.  Je vais jeter un coup d'½il et me documenter un peu.  Si tu as des liens vers des tutos, je suis preneur !
Bonne continuation !

Commentaire de neria le 16/02/2009 15:51:01

J'ai pas mal cherché un peu partout, mais il n'y a qu'un seul exemple sur le web et il n'est pas très explicite. Mes ressources ont été principalement :

#  // Inspiré de :
# // https://www.mirbsd.org/htman/i386/man1/lex.htm
# // http://pwet.fr/man/linux/commandes/bison
# // http://docs.linux.cz/programming/c++/www.icce.rug.nl/documents/cplusplus/cplusplus19.html#l362

Commentaire de exar le 16/02/2009 20:14:06

Merci bien !  Je vais commencer à m'y intéresser...  Je vais certainement en avoir besoin pour un projet qui stagne dans mon esprit depuis quelques temps.
Bonne soirée !

Commentaire de boubakerabdallah le 17/02/2009 15:48:34 8/10

C'est vraiment très intéressant,car je suis maintenant à la recherche de tous sortes de code flex

Commentaire de le_duche le 17/02/2009 16:09:29

N'oubliez pas que Flex et Bisons ont des équivalents (utiles pour trouver des tuto): Lex et Yacc

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

FLEX BISON [ par reyman ] Je cherche des infos sur les compilateurs flex bison.Comment on écrit le code et comment on se sert de ses outils.merci Flex Bison [ par hobbes ] Bonjour,Je n arrive pas a faire accepter les caracteres accentues par le parseur que je suis en train de programmer. Qq peut il m aider ???Hobbes flex/bison et dev-c++ [ par darkblueorange ] Bonjour à tous,Je suis en train de porter une appli de Linux vers Windows XP (eh oui). J'ai opté pour l'IDE Dev-C++, avec donc minGW derrière. Le prob urgent flex et bison sous visual microsoft c++ [ par haissa9 ] bonjour, j'ai un projet a faire sous visual microsoft c++ et je&nbsp;dois faire des analyses syntaxique. es ce qu'il est possible d'utiliser flex et b flex et bison sous c++ builder 6 [ par nwe ] comment puis je faire pour utiliser les outils flex et bison sous c++ builder 6 ? Parseurs XML pour C++ [ par Direkt ] Bonjour tout le monde,Dans le cadre d'un developpement en C++, j'ai besoin d'un parseur XML qui fonctionne sous:- Linux (SLC3-SLC4. C'est le point le Flex Bison [ par PaPi20_1 ] Quelqu'un aurait-il une bonne doc sur flex et bison, ou un titre de livre ? merci. Utilisation de flex/bison dans application graphique Windows (API) [ par uaip ] Bonjour à tous Je résume tout depuis le début. J'ai découvert flex et bison sous Linux, j'ai commencé un projet de compilateur sous le terminal : j'é QT flex et bison [ par alxidali ] bonjour a tous , j'ai un petit probléme si quelqu'un pouvait m'aider , j'ai fait un analyseur syntaxique avec quelque actons sémantique en sortie , f FLEX /LEX BISON/YACC [ par alxidali ] JE CHERCHE A COMMENC2 AVEC CES DEUX LOGICIEL FLEX ET BISON POUR GENERER DEUX ANALYSEUR , L'OUTIL FLEX APPARAIT EN PROMPTEUR DOS MAIS JE NE SAIS PAS QU


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales