Boost::Spirit

Boost::Spirit - C++ - Programmation

Marsh Posté le 20-12-2006 à 01:03:00    

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
Reply

Marsh Posté le 20-12-2006 à 01:03:00   

Reply

Marsh Posté le 20-12-2006 à 17:08:32    

Reply

Marsh Posté le 28-12-2006 à 16:10:09    


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

Reply

Marsh Posté le 28-12-2006 à 20:46:57    

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

Reply

Sujets relatifs:

Leave a Replay

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