Salut,
Typiquement, la traduction d'un type somme en C++ donne un variant donc :
boost::variant<Variable, LogicAnd, LogicOr, ForAll, ...>
Par contre, et il n'y a pas beaucoup de solution, c'est assez lourd de s'en servir car tu dois passer par un mécanisme de visiteur, donc en gros créer une classe pour chaque traitement que tu veux faire sur ta structure. Tu peux notamment regarder ce projet qui implémente un mini-langage (calculatrice + booléen + if) avec un arbre de syntaxe représenté via des variantes (voir fichier ast.hpp).
D'un autre côté, à moins que tu ais besoin de performances et que ça soit critique dans ton projet (bien sur tout programme à besoin de performance, mais généralement moins que ce qu'on obtient avec C++), je te conseille d'utiliser un langage fonctionnel qui sera très adapté pour ça, comme OCaml ou Haskell. Si tu es libre de ton choix tu peux même utiliser le nouveau langage de Mozilla, Rust, qui est, je trouve, très bien fait. Si tu as besoin d'une large librairie standard, tu peux utiliser Scala, par contre ça aura à peu près les mêmes avantages (large librairie, portabilité, ...) / désavantage (performance, ...) que Java vu que ce langage est basé sur la JVM.
@oodini : Boost.Proto permet de définir des EDSL, donc d'avoir un mini-langage dans C++ et ainsi que l'arbre syntaxique soit déjà défini à la compilation, ce qui ne convient pas ici car je crois que l'OP veut quelque chose de plus dynamique.
Partager