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

  FORUM HardWare.fr
  Programmation
  C++

  Boost::Spirit

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Boost::Spirit

n°1493849
gee
Bon ben hon
Posté le 20-12-2006 à 01:03:00  profilanswer
 

Salut,

 

je suis en train de me mettre à Spirit là, mais je n'arrive pas encore à faire ce que je veux.

 

Le but est de pouvoir reconnaitre des expressions du type :

 

F(a), F(G(a,b),c); F(a).b, etc ...

 

je pense avoir bien défini ma grammaire pour cela mais je n'arrive pas à en faire ce que je veux.

 

Voila ma grammaire :

 
Code :
  1. expression                =        (function
  2.                                           |        term)
  3.                                                         >>    *(ch_p('.') >>
  4.                                                                             (function
  5.                                                                         |    term));
  6.                 function                  =        (term >> no_node_d[ch_p('(')] >> function_param >>     no_node_d[ch_p(')')])/*[&printTest]*/;
  7.                 term                      =        leaf_node_d[lexeme_d[(+
  8.                                                                         (
  9.                                                                             alnum_p
  10.                                                                         |    ch_p('_')
  11.                                                                         )
  12.                                                                     )]]/*[&printTest]*/;
 


J'ai tenté de passer par un parse tree, mais j'ai l'impression qu'évaluer le parse tree me complique encore plus les choses que de rajouter des appels de fonction dans ma grammaire. L'AST m'est impossible car il m'enlève des noeuds intéressants. Pour un parse tree mon soucis c'est que pour la règle function je n'obtiens pas de
variable, il me donnera F pour la règle term plutot, ce qui complique
pas mal les choses ... J'aurais bien aimé qu'il me reconnaisse F
comme fonction et le reste comme intérieur de la fonction, mais je
n'arrive pas à comprendre comment y arriver. Il y a bien root_node_d qui y ressemble je pense mais en fait non.

 

Si je tente un appel de fonctions dans ma grammaire :

 
Code :
  1. function = (term[&maFonction] >> no_node_d[ch_p('(')] >> function_param
  2. >> no_node_d[ch_p(')')])/*[&printTest]*/;

Pour F(a), cela appelera 2 fois maFonction, une fois pour F et une pour a donc ca n'est pas bon non plus  :(

 

J'ai possiblement pas compris le principe du parser j'imagine, mais ca fait pres d'une semaine que j'essaie de voir comment travailler avec Spirit tout de même...

 


Merci


Message édité par gee le 20-12-2006 à 17:08:25
mood
Publicité
Posté le 20-12-2006 à 01:03:00  profilanswer
 

n°1494399
gee
Bon ben hon
Posté le 20-12-2006 à 17:08:32  profilanswer
 
n°1496687
GrosBocdel
Posté le 28-12-2006 à 16:10:09  profilanswer
 


Salut,
Je ne sais pas si tu es encore sur l'affaire, mais les sources datatrans*.* du logiciel fityk pourraient te faire avancer un peu.
Comme je débute là dessus aussi, je ne peux pas dire grand chose de ta grammaire pour le moment...

n°1496817
gee
Bon ben hon
Posté le 28-12-2006 à 20:46:57  profilanswer
 

Salut,
 
merci de venir sur mon topic :hello:
 
Sinon non, là je ne suis plus dessus car en vacances :)
 
Mais je me suis débrouillé avec ma grammaire, traduit en parse tree par spirit, que je traduis en mon propre parse tree après, ce n'est pas très propre mais ca marche au moins ... A la rentrée j'aurais juste une fonctionnalité à rajouter donc je regarderai comment le faire plus propre.
 
Merci


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

  Boost::Spirit

 

Sujets relatifs
boost::bind, pourquoi this ne marche pas?[BOOST] utilisation de shared_array
apprentissage de BOOSTboost::serialization [resolu]
Pour ceux qui peuvent pas se payer boost ...boost::thread... corrigez moi.
boost::filesystem classe dérivée de path() pour se simplifier la vieCompilation de boost
Boost::thread[C++] boost & semaphore [ solution boost::condition ]
Plus de sujets relatifs à : Boost::Spirit


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