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

Haskell Discussion :

Parser une expression préfixe


Sujet :

Haskell

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de golden boy
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 120
    Par défaut Parser une expression préfixe
    Bonjour,

    je suis dans l'idée d'implémenter un petit calculateur d'expression préfixe.

    J'ai, pour l'instant, fait un type récursif pour représenter mes expressions, ainsi que la fonction pour l'évaluer et donner le résultat (ces deux ne posent pas de problèmes) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    data Expr  = Num Int
               | Add Expr Expr
    	| Mul Expr Expr
    	| Div Expr Expr
     
    eval (Num x)               = x
    eval (Add (Num a) (Num b)) = a+b
    eval (Mul (Num a) (Num b)) = a*b
    eval (Div (Num a) (Num b)) = a `div`b
    eval (Add a b) = (eval a) + (eval b)	
    eval (Mul a b) = (eval a) * (eval b)	
    eval (Div a b) = (eval a) `div` (eval b)
    L'idée est donc de parser un type [Char] (par exemple "+ 9 * 3 1") et de le transformer en type Expr qui pourra être évalué par la fonction 'eval" (pour donner (Add (Num 9) (Mul (Num 3) (Num 1)) ).

    J'avais commencé à écrire une telle fonction, mais je suis bloqué, de plus je pense ne pas utiliser la bonne voie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    parse :: [Char] -> Expr
    parse (x:xs:ys)
    	| x == '+' = (Add) (parse xs) (parse ys)
    	| x == '*' = (Mul) (parse xs) (parse ys)
    Donc voilà, j'aimerais avoir vos conseils, j'aurais aimé faire la parsing moi-même, mais pensez-vous qu'utiliser un module comme Text.Parsec pourrait être mieux ?

    Merci d'avance !

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 16
    Par défaut
    Analyser une expression arithmétique est loin d'être évident. Il faut en effet tenir compte de la priorité des opérations, de leur associativité, du "moins" à la fois binaire et unaire etc. Les parsers monadiques sont parfaits pour résoudre ces problèmes. On peut bien sûr utiliser Parsec mais il me semble plus intéressant de créer son propre parser. Le chapitre 8 de l'excellent "programming in Haskell" de Graham Hutton est une très bonne introduction ainsi que la video http://channel9.msdn.com/Shows/Going...hapter-8-of-13 qui lui est consacré.

  3. #3
    Membre expérimenté Avatar de golden boy
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 120
    Par défaut
    Merci pour la vidéo, pour tout te dire, bien que je comprenne assez bien l'Anglais écrit, je comprends très mal l'Anglais oral, mais j'essayerai de comprendre quelque chose... (je sais que c'est mal de pas connaître l'Anglais en informatique)

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Par défaut
    Citation Envoyé par sharpdev Voir le message
    Analyser une expression arithmétique est loin d'être évident. Il faut en effet tenir compte de la priorité des opérations, de leur associativité, du "moins" à la fois binaire et unaire etc. Les parsers monadiques sont parfaits pour résoudre ces problèmes.
    Euh, non... Il veut parser des expressions préfix ! Donc c'est trivial... Il faut pas dégainer les solutions de combats pour ça.

  5. #5
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Citation Envoyé par TropMDR Voir le message
    Euh, non... Il veut parser des expressions préfix ! Donc c'est trivial... Il faut pas dégainer les solutions de combats pour ça.
    certes, mais ça n'empêche pas les combinateurs de parseurs d'être intéressants aussi sur cet exemple... surtout s'il veut réellement créer une structure pour ces expressions et pas seulement les évaluer
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Août 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2009
    Messages : 38
    Par défaut
    Citation Envoyé par TropMDR Voir le message
    Euh, non... Il veut parser des expressions préfix ! Donc c'est trivial... Il faut pas dégainer les solutions de combats pour ça.
    Ce n'est pas « sortir l'artillerie lourde » (c'est ce que tu veux dire je suppose) que de fournir une solution élégante et simple. Car les combinateurs de parseurs donne une telle solution. C'est vrai que ça demande de comprendre le principe des monades. Mais si on ne veut pas se plonger dans les monades, on ne fait pas d'Haskell me semble.

    Écrire entièrement « à la main » un parser ad-hoc, même pour une grammaire n'utilisant que des opérateurs préfixés n'est pas une bonne idée. Ce n'est pas si trivial que ça... pour preuve : il n'y arrive pas. L'évidence n'est là que pour ceux qui sont déjà aguerris.

    Citation Envoyé par gorgonite Voir le message
    certes, mais ça n'empêche pas les combinateurs de parseurs d'être intéressants aussi sur cet exemple... surtout s'il veut réellement créer une structure pour ces expressions et pas seulement les évaluer
    Tout à fait mon cher Dr. démon.

  7. #7
    Membre expérimenté Avatar de golden boy
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 120
    Par défaut
    Salut,

    alors en fait, je ne connais pas du tout les monades (et je suis encore loin du chapitre). On peut le faire sans monade je suppose ?

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Août 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2009
    Messages : 38
    Par défaut
    Citation Envoyé par golden boy Voir le message
    [...]
    J'avais commencé à écrire une telle fonction, mais je suis bloqué, de plus je pense ne pas utiliser la bonne voie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    parse :: [Char] -> Expr
    parse (x:xs:ys)
    	| x == '+' = (Add) (parse xs) (parse ys)
    	| x == '*' = (Mul) (parse xs) (parse ys)
    Donc voilà, j'aimerais avoir vos conseils, j'aurais aimé faire la parsing moi-même, mais pensez-vous qu'utiliser un module comme Text.Parsec pourrait être mieux ?

    Merci d'avance !
    Tu es bloqué parce que ton typage n'est pas bon.
    Un parser prend en entrée une chaîne de caractère (pourquoi n'as-tu pas écrit String? ça ne change rien de toute façon) et fournit en sortie ce que tu veux produire (expression pour toi) ET le reste de la chaîne de caractères qui n'a pas été traité.

    Le bon type (naïf) est donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    type Parser a = String -> (a,String)
    Si tu as l'oeil tu y reconnais une monade. Mais même si ce n'est pas le cas tu peux voir où ça te mène : tu peux ainsi créer des parsers qui analysent des « morceaux » et les assembler pour faire ton système.

    Le livre de Graham Hutton est effectivement pertinent sur le sujet. C'est ce monsieur qui a produit l'idée de l'analyse syntaxe monadique (Monadic Parsing) : eprints.nottingham.ac.uk/archive/00000223/01/pearl.pdf

Discussions similaires

  1. Parser une ligne suivant une expression réguliere
    Par houba91 dans le forum Général Java
    Réponses: 11
    Dernier message: 28/03/2014, 15h41
  2. Parser une expression en C
    Par scls19fr dans le forum Générateurs de compilateur
    Réponses: 0
    Dernier message: 22/04/2009, 09h25
  3. Parser une expression
    Par maa dans le forum Générateurs de compilateur
    Réponses: 3
    Dernier message: 23/06/2008, 14h29
  4. [langage] surement une expression régulière...
    Par armada dans le forum Langage
    Réponses: 5
    Dernier message: 30/05/2003, 17h06
  5. [langage] Continuer a parser une ligne
    Par D[r]eadLock dans le forum Langage
    Réponses: 5
    Dernier message: 30/09/2002, 18h49

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