Boost Spirit

Bizarreries.. ?

a marqué ce sujet comme résolu.

Bonsoir,

En ce moment je bidouille un petit compilateur en utilisant Boost Spirit. J’ai créé un mini langage et j’essaye de coder un compilateur vers le C, en utilisant Qi pour parser vers un AST que je convertis vers un autre AST, que j’utilise avec Karma pour générer le C.

Donc j’ai lu tous les tutos Qi et Karma sur le site de Boost, et au fur et à mesure que je bidouille mon compilateur, je me rends compte de certaines choses un peu bizarres. Certaines choses me donnent l’impression de n’être pas super bien conçues, ou en tous cas pas super ergonomiques, mais Boost est une librairie réputée donc j’aimerais m’assurer que je n’ai pas mal compris certaines choses, et j’aimerais comprendre pourquoi certaines choses ont été faites de cette manière ; donc si certains ont déjà touché à cette lib je me tourne vers vous. :)

Les quelques bizarreries dont je parle :

  • le tutoriel parle de BOOST_FUSION_ADAPT_STRUCT_ADT pour Karma mais ça ne marche pas, il faut utiliser BOOST_FUSION_ADAPT_STRUCT comme pour Qi

  • quand une structure contient un champ de type variant, il faut ajouter du code assez obscur (pour moi) dans le namespace global pour faire marcher la chose (chose qui n’est pas indiquée dans les exemples du tuto) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
template <typename T>
struct get_element {
    template <typename T1>
    struct result { typedef T const& type; };
    T const& operator()(gen::ast_expression const& v) const {
        return boost::get<T>(v);
    }
};

boost::phoenix::function<get_element<gen::ast_addition> > _gen_ast_addition;
boost::phoenix::function<get_element<gen::ast_product> > _gen_ast_product;

`
  • d’ailleurs en parlant des variant, on ne peut pas les mettre directement dans une structure qu’on adapte ensuite pour fusion, il faut d’abord en faire un typedef et utiliser ce typedef (ça c’est vraiment étrange !)

  • quand on assigne à une règle une expression qui correspond à un vecteur, par exemple pour une structure identifier contenant une string, il faut pour faire marcher avec l’adaptation fusion de la structure précéder la règle d’eps : eps « *char_ (j’ai l’impression que sans un « dans la règle, karma considère que ça ne correspond pas à un fusion et refuse donc la structure qu’on associe à la règle)

  • et surtout, je viens de me rendre compte que pour générer avec Karma un vector de structures custom, écrire une règle *machin ne suffit pas, il faut implémenter dans la structure l’opérateur « où l’on indique ce qui doit être généré, mais pour moi ça fait doublon avec la définition de la règle correspondant à cette structure…

Bref, ça donne finalement un code assez désarticulé je trouve. J’ai un peu l’impression que les créateurs de Spirit ont été limités par le langage C++ et ont été obligés de laisser à faire à l’utilisateur certaines choses dans son code un peu de l’ordre du fix… Après, je ne sais pas si ça aurait pu être fait autrement ou mieux, mais les petites bizarreries s’accumulent et je me demande donc si il n’y a pas certaines choses que je fais mal.

A votre avis ? :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte