Discussion: Arbre de calcul

  1. #1
    Nouveau Membre du Club
    Inscrit en
    avril 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 75
    Points : 28
    Points
    28

    Par défaut Arbre de calcul

    Bonjour, je voudrais créer une fonction qui parse une expression mathématique (un problème classique pour lequel je n'ai pas trouvé de solution en python). Le but serait quelque chose du genre :

    analyse('2*x+(3+x)') renverrai une liste : ['+','2*x','3+x']

    J'arrive à parser l'expression en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    import ast
    st = ast.parse("2*x+(3+x)").body[0]
    print st.value
    print st.value.left
    print st.value.right
    Le problème est que je n'ai pas trouvé l'instruction pour recréer le membre de gauche et de droite. Avez-vous une solution ?

    Merci d'avance,
    Vincent

    P.S : Je ne veux pas utiliser sympy car il effectue des simplifications au moment de la conversion.

  2. #2
    Expert Confirmé Sénior
    Avatar de tyrtamos
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    2 612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 2 612
    Points : 4 874
    Points
    4 874
    Billets dans le blog
    6

    Par défaut

    Bonjour,

    Peut-être voir du côté de pyparsing: http://pyparsing.wikispaces.com/

    Je ne le connais pas, mais il y a un exemple ici: http://pyparsing.wikispaces.com/file/view/fourFn.py

    Avec lui, on peut obtenir par exemple:

    '(2+3)/5^2' => ['2', '3', '+', '5', '2', '^', '/']

    C'est de la polonaise inverse, mais on peut peut-être obtenir l'arbre que tu cherches en modifiant sa configuration?


    [Edit] Sinon, avec ast:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    y = ast.parse('2*x+(3+x)', "", "eval")
     
    print ast.dump(y)
    #Expression(body=BinOp(left=BinOp(left=Num(n=2), op=Mult(), right=Name(id='x', ctx=Load())), op=Add(), right=BinOp(left=Num(n=3), op=Add(), right=Name(id='x', ctx=Load()))))
    print "=>", y.body.left, isinstance(y.body.left, ast.BinOp)
    #=> <_ast.BinOp object at 0x021A83D0> True
    print "=>", y.body.op, isinstance(y.body.op, ast.Add)
    #=> <_ast.Add object at 0x021A3350> True
    print "=>", y.body.right, isinstance(y.body.left, ast.BinOp)
    #=> <_ast.BinOp object at 0x021A8430> True
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Nouveau Membre du Club
    Inscrit en
    avril 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 75
    Points : 28
    Points
    28

    Par défaut

    Bonjour,

    J'ai finalement recréé l'expression à la main via une petite fonction récursive, je pensais qu'elle existait déjà.

    Merci pour la réponse,
    Vincent

+ Répondre à la discussion
Cette discussion est résolue.

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