C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

[Parser en C++]

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Loïc Joly
Guest





PostPosted: Thu Jul 29, 2004 9:55 am    Post subject: Re: [Parser en C++] Reply with quote



hackervalley wrote:

Quote:
Je souhaite parser le fichier suivant :
Point(1) = {0, 0, 0, 0.1};
Point(2) = {1, 0, 0, 0.1};
Point(3) = {1, 1, 0, 0.1};
Point(4) = {0, 1, 0, 0.1};
Line (1) = {2, 3};
Line (2) = {3, 4};

Avez - vous quelques indiquations pour réaliser cela de façon attrayantes ?

Peut-être boost::regexp ou boost::spirit ?

--
Loïc

Back to top
Jean-Marc Bourguet
Guest





PostPosted: Thu Jul 29, 2004 12:39 pm    Post subject: Re: [Parser en C++] Reply with quote



hackervalley <hackervalley (AT) free (DOT) fr> writes:

Quote:
Je souhaite parser le fichier suivant :
Point(1) = {0, 0, 0, 0.1};
Point(2) = {1, 0, 0, 0.1};
Point(3) = {1, 1, 0, 0.1};
Point(4) = {0, 1, 0, 0.1};
Line (1) = {2, 3};
Line (2) = {3, 4};

Avez - vous quelques indiquations pour réaliser cela de façon
attrayantes ?

Puisque tu poses la question, je suppose que tu ne connais pas les
outils permettant de generer les analyseurs. On apprend generalement
leur existence et leurs principes dans les formations en informatique.

La premiere question est donc: est-ce que ca vaut la peine d'apprendre
a les utiliser? Leur domaine de predilection est les langages de
complexite moyenne concus pour pouvoir etre parse par le code genere.
Pour les langages fort simple, c'est plus simple de le faire a la
main, les langages trop complexes leur posent des problemes, de meme
que certaines constructions de langages n'ayant pas ete penses avec
leurs limitations. Si la spec du langage bouge beaucoup, c'est un
avantage pour les generateurs. Un autre avantage est qu'ils te
forcent a considerer les cas limites, ce qui evite des problemes quand
le langage evolue. S'il faut des messages d'erreurs evolues sur la
syntaxe ou meme une bonne recuperation apres une erreur, c'est un de
leur problemes (enfin, j'ai vu des papiers avec des techniques
semblant donner de bons resultats, j'ai pas vu d'implementation
repandues de ces techniques).

On separe generalement la partie d'analyse lexicale (ou on regroupe
les caracteres en symboles, par exemple "Point", "2", "0.1", on en
profite pour ignorer les espaces non significatifs et les
commentaires) de la partie gramaticale (ou on regroupe les symboles en
structure hierarchique de plus haut niveau: expression,
statement,...). Il y a des generateurs pour les deux, et d'autres qui
essayent de faire les deux.

L'analyse lexicale se fait facilement sans generateur parce qu'il est
relativement facile de faire plus performant qu'eux et tout aussi
maintenable (et c'est pas ca qui bouge beaucoup). On peut aussi se
debrouiller avec des bibliotheques gerant les expressions regulieres
(c'est d'ailleurs ce qui est aussi utilise par les generateurs).

La sortie de l'analyse lexicale est generalement une paire compose
d'une valeur enumeree indiquant la classe du symbole (identificateur,
nombre, parenthese_ouvrante,...) et de son lexeme ou sa valeur
("Point", 0.1).

Pour l'analyse gramaticale, les generateurs construisent generalement
des automates a pile ou la fonction d'etat depend de l'etat au sommet
de la pile et du symbole non encore accepte. Je passe les details.

A la main, la technique la plus facile est la "descente recursive" ou
on ecrit des fonctions parsant les differentes unites gramaticales.
Par exemple la fonction parsant les sommes peut ressembler a ceci:

void parse_somme() {
parse_produit();
while (symbole_courant == OPERATEUR_ADDITIF) {
symbole_suivant();
parse_produit();
}
}

ou symbole_suivant est l'analyseur lexical. Un moyen simple de faire
de la gestion d'erreur est de passer aux fonctions la liste des
symboles valides apres eux. On a alors:

void parse_somme(symboles_valides) {
parse_produit(symboles_valides + OPERATEUR_ADDITIF);
while (symbole_courant == OPERATEUR_ADDITIF) {
symbole_suivant();
parse_produit(symboles_valides + OPERATEUR_ADDITIF);
}
}

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Back to top
hackervalley
Guest





PostPosted: Thu Jul 29, 2004 12:57 pm    Post subject: [Parser en C++] Reply with quote



Je souhaite parser le fichier suivant :
Point(1) = {0, 0, 0, 0.1};
Point(2) = {1, 0, 0, 0.1};
Point(3) = {1, 1, 0, 0.1};
Point(4) = {0, 1, 0, 0.1};
Line (1) = {2, 3};
Line (2) = {3, 4};

Avez - vous quelques indiquations pour réaliser cela de façon attrayantes ?


A++

Back to top
Pierre
Guest





PostPosted: Thu Jul 29, 2004 5:45 pm    Post subject: Re: [Parser en C++] Reply with quote

hackervalley <hackervalley (AT) free (DOT) fr> wrote

Quote:
Je souhaite parser le fichier suivant :
Point(1) = {0, 0, 0, 0.1};
Point(2) = {1, 0, 0, 0.1};
Point(3) = {1, 1, 0, 0.1};
Point(4) = {0, 1, 0, 0.1};
Line (1) = {2, 3};
Line (2) = {3, 4};

Avez - vous quelques indiquations pour réaliser cela de façon attrayantes ?


Regarde les logiciels Flex et Bison. Ca genere du C, mais ca s'integre
tres bien dans un prog C++.

Pierre

Back to top
Fabien LE LEZ
Guest





PostPosted: Thu Jul 29, 2004 5:49 pm    Post subject: Re: [Parser en C++] Reply with quote

On 29 Jul 2004 10:45:10 -0700, [email]plindenbaum (AT) yahoo (DOT) fr[/email] (Pierre):

Quote:
Regarde les logiciels Flex et Bison. Ca genere du C

Ou du C++, il me semble.
Mais c'est un peu un lance-missile pour tuer une mouche...


--
;-)

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Fri Jul 30, 2004 3:29 pm    Post subject: Re: [Parser en C++] Reply with quote

Fabien LE LEZ <gramster (AT) gramster (DOT) com> wrote

Quote:
On 29 Jul 2004 10:45:10 -0700, [email]plindenbaum (AT) yahoo (DOT) fr[/email] (Pierre):

Regarde les logiciels Flex et Bison. Ca genere du C

Ou du C++, il me semble.

Quelque chose qui se laisse compiler par un compilateur
C++ et qui se sert des iostream, en tout cas. Et encore,
il faut faire gaffe des versions -- la derniere fois que
je me suis servi de Flex, il generait <istream.h>,
utilisait les fonctions des anciens flux, et ne se
laissait pas compiler avec la bibliotheque standard de
g++ 3.x. Il n'y avait rien qu'un petit coup de sed ne
pouvait pas regler, mais ca c'etait le cas deja avec
le lex standard, il y a 15 ans.

Quote:
Mais c'est un peu un lance-missile pour tuer une mouche...

Ca depend de ce qui est permis, et ce qui ne l'est pas.
Il a donne un exemple simple. Mais les ';' a la fin des
lignes suggerent fort qu'il s'agit d'une syntaxe libre.
Dans ce cas-la, lance-missile ou non, c'est peut-etre
la solution la plus simple a mettre en oeuvre.

--
James Kanze

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.