IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Evaluation d'une expression numérique


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut Evaluation d'une expression numérique
    Bonjour à tous,

    Je possède une expression numérique sous forme de chaîne de caractères, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (3*[x] / 2) + (2*[y] /4)
    Mon programme va lire cette expression pour remplacer [x] et [y] donnés à l'exécution et renvoyer le résultat.

    Seulement l'expression peut devenir complexe au fil du temps et j'aimerai passer par une bibliothèque qui à coup sûr seras plus complexe et performante que ce que je ne peux faire moi même.

    Y a-t-il un outils permettant de faire ça en C++ ?

    Je vous remercie par avance,

    A bientôt

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Boost::spirit fait ca à merveille !
    Pour une réponse plu détaillé, regarde sur le forum avec des termes comme "parsing" ou évaluation d'expression. Le forum regorge de topic similaires.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre émérite
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Par défaut
    Bonsoir,

    Ou encore Qt avec son interpréteur ECMAScript (sous ensemble javascript)

    Tu arriveras à interpréter ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (3*x / 2) + (2*y /4)
    Et tu bénéficieras de Math.cos(x) etc...

    Voir description détaillée :
    http://qt.developpez.com/doc/latest/qscriptengine.html

    Avec Qt, tu as au passage un débugger et de la possibilité d'exposer tes propres objets sans trop de mal.

    ps :
    - on trouve moult autres interpréteurs ECMAScript dont le V8 de Google Chrome
    - boost::spirit est une solution de plus bas niveau pour écrire son propre langage en somme. A mon humble avis, permettre de scripter dans un langage existant rend plus de service.

  4. #4
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Citation Envoyé par bretus Voir le message
    - boost::spirit est une solution de plus bas niveau pour écrire son propre langage en somme. A mon humble avis, permettre de scripter dans un langage existant rend plus de service.
    Non ... spirit est du C++ ... donc c'est equivalent au truc de QT tout en etant moins lourd en terme de dependances et plus efficace ...

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par bretus Voir le message
    A mon humble avis, permettre de scripter dans un langage existant rend plus de service.
    Pas tout à fait d'accord : ça rajoute des dépendances pas forcément faciles à gérer et peut apporter une lourdeur d'exécution pas utile. De plus, linker un autre langage avec C++ (avec Boost.Python par exemple) se fait bien mais c'est assez fastidieux tout de même !

    Citation Envoyé par Joel F Voir le message
    Non ... spirit est du C++ ... donc c'est equivalent au truc de QT tout en etant moins lourd en terme de dependances et plus efficace ...
    Oui, et plus la syntaxe est personnalisable à souhait !

  6. #6
    Membre émérite
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Par défaut
    Bonjour,

    Citation Envoyé par jblecanard Voir le message
    Oui, et plus la syntaxe est personnalisable à souhait !
    Je comprend vos points de vue sur les dépendances, mais en même temps, il faut savoir les accepter. A défaut, on ré-invente un langage de script, on écrit une grammaire et au final, on ne rend pas plus de service avec son interpréteur et sa syntaxe qu'en utilisant un langage et un moteur existant.

    En terme de maintenance, je me demande ce qui est le pire : Apprendre à utiliser boost::spirit (où on t'explique en 150 lignes comment on compte "hello" ) ou apprendre à gérer la dépendance à Qt.


    Je n'ai pas vu d'interpréteur prédéfini dans boost::spirit et je doute qu'un outil pour écrire des parseurs soit équivalent à un moteur de script. La syntaxe est-elle tellement personnalisable qu'il faut écrire l'intégralité de la grammaire et des mécanismes d'interprétations?


    En ce qui concerne le point "fastidieux" de QtScript vis à vis de Boost.Python (ou des interfaces d'accès aux moteurs de script):
    - Toutes les méthodes déclarées comme des slots sur les classes dérivées de QObject sont accessibles depuis l'ECMAScript
    - Il suffit d'une méthode statique de fabrique déclarée pour "new" pour exposer une classe C++ dérivée dans l'ECMAScript.


    Après, voilà, vous êtes libres et le choix dépend comme toujours du contexte de développement.

    Pour l'avoir subit, pensez peut-être à la charge de documentation qui suit la mise en place d'une syntaxe et de primitives perso, et surtout à l'engouement des utilisateurs pour l'apprentissage d'un langage mono-usage tel celui de cmake... Ou imaginez un cmake reposant sur un moteur ECMAScript...

    Cdlt

Discussions similaires

  1. evaluation d'une expression arithmetique
    Par yasmine77 dans le forum C++
    Réponses: 4
    Dernier message: 04/04/2006, 09h11
  2. [Oracle 9i] Evaluation d'une expression
    Par Process Linux dans le forum Oracle
    Réponses: 2
    Dernier message: 21/03/2006, 12h55
  3. Evaluation d'une expression arithmétique
    Par MysticKhal_0 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 10/03/2006, 18h25
  4. Probleme d'evaluation sur une liste numérique
    Par cryptorchild dans le forum Langage
    Réponses: 2
    Dernier message: 16/01/2006, 19h39
  5. [EXP] Evaluation dans une expression régulière
    Par SergentHeinz dans le forum Langage
    Réponses: 7
    Dernier message: 10/11/2005, 18h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo