Partage
  • Partager sur Facebook
  • Partager sur Twitter

parser : expression mathématique

Sujet résolu
    7 février 2010 à 12:09:39

    bonjour,
    je me suis lancer dans la création d'un parser d'expression mathématique pour améliorer un programme de ma création qui trace des courbe z=f(x,y)
    malheureusement, je ne vois pas du tout par quoi commencer pour analyser l'expression, est-ce que quelqu'un pourrait m'aider ( je ne demande de code, plutôt des indications)
    PS : j'ai lu le tuto qui est sur le site mais il ne m'a pas beaucoup aidé
    • Partager sur Facebook
    • Partager sur Twitter
      7 février 2010 à 12:36:39

      Une des methodes pour faire ca est la notation polonaise notation polonaise inverse. C'est peut-etre la plus simple a comprendre
      • Partager sur Facebook
      • Partager sur Twitter
        7 février 2010 à 13:45:09

        Chichon : je voudrais entrer les expressions de manière conventionnelle donc pour la notations polonaise inverse ça va pas être possible
        Pouet_forever : effectivement y a des truc intéressants, mais c'est comme dans le tuto y a des code ocaml qui utilise genlex et j'y comprends pas grand chose
        • Partager sur Facebook
        • Partager sur Twitter
          7 février 2010 à 19:49:32

          Il suffit de transformer la notation infixe en notation post-fixe pour pouvoir aborder la notation polonaise inversée...
          • Partager sur Facebook
          • Partager sur Twitter
            7 février 2010 à 22:02:04

            C'est une méthode classique mais peu intuitive pour parser une expression. Personnellement, lors de l'exercice de Nanoc à propos des parseurs je m'étais demandé comment nous mêmes faisions nous pour traiter une expression mathématique de manière systématique.

            Au fond ça n'a rien de compliqué, tu commences par définir la priorité des opérateurs (exemple : * est prioritaire par rapport à + tandis que les parenthèses sont prioritaires par rapport à *). Ensuite tu crées une fonction t'indiquant la portion la plus prioritaire composée d'uniquement deux opérandes et un opérateur, tu la calcules et ainsi de suite.. Une exemple concret fera pas de mal :

            (5-2)*((4+1)*(4/(7-5))) l'opération la plus prioritaire est "7-5". Grâce à ta fonction, tu isoles cette chaîne structurée de même manière pour toute opération opérande|opérateur|opérande. Cette chaîne est donc simple à traiter puis à calculer via une fonction où tu définiras les opérateurs connus (+,-,*,/,^). Tu effectues donc le calcul 7-5 = 2 puis tu remplaces dans l'expression :

            (5-2)*((4+1)*(4/2))
            La chaîne prioritaire est alors 4+1 et ainsi de suite. De manière récursive on simplifie l'expression jusqu'à un unique réel qui sera le résultat. Cela marche de même manière avec des variables, lors de son calcul tu remplaces tous les x par la valeur souhaitée.

            Bien sûr ce système est très lourd lors du traçage d'une fonction puisque la reconnaissance et le traitement de l'expression est effectué à chaque nouveau point. Pour remédier à ce problème il faut alors traiter l'expression une seule fois de manière à créer un arbre où chaque nœud est un opérateur et plus la chaîne (càd opérande|opérateur|opérande) est prioritaire plus elle est éloignée de la racine. Cette arbre partira donc d'une feuille et non de sa racine. Une fois cette arbre créé il suffi de le parcourir en changeant à chaque fois les variables par les valeurs désirées pour obtenir des temps de calculs tout à fait acceptable.

            Voila une des multiples manières possibles de créer un parseur. J'espère que ça t'aidera un peu et que j'ai réussi à être à peu près clair, il doit exister mieux évidemment mais c'est ce qui m'a paru le plus proche de notre traitement d'une expression.
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              7 février 2010 à 23:17:16

              Salut, je te conseille ce lien :
              ftp://ftp-developpez.com/general/cours [...] ion-wirth.pdf
              C'est bien expliqué.

              a+
              • Partager sur Facebook
              • Partager sur Twitter

              parser : expression mathématique

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown