Forum Programmation.autre Parser du GCode avec Attoparsec (en Haskell)

Posté par . Licence CC by-sa
Tags :
1
7
oct.
2015

Je cherche à parser du GCode à l'aide de Attoparsec (en Haskell).
Voilà ce que je voudrais :

> parse "G01 X1 Y2 Z3"
Right [Just 1, Just 2, Just 3]

> parse "G01 X1 Z3"
Right [Just 1, Nothing, Just 3]

> parse "G01"
Left "Message d'erreur..."

Les 2 premiers exemples fonctionnent. C'est le dernier qui me bloque.Je voudrais faire échouer le parser si toutes les valeurs sont "Nothing". Il serait possible de faire sa propre fonction :

condition :: (a -> Bool) -> Parser a -> Parser a
condition f p  = do
    r <- p
    case f r of
        True -> return r
        False -> fonction_qui_fait_echouer

seulement voilà j'ai cherché dans la doc, et je ne trouve pas de "fonction qui fait échouer". Quelqu'un aurait une idée ?

  • # Pas vu de parseur qui échoue non plus…

    Posté par (page perso) . Évalué à 3. Dernière modification le 07/10/15 à 20:54.

    Je n'ai pas vu non plus de parseur qui échoue toujours dans attoparsec (dans parsec il y en a bien un). Ceci dit, si tu connais le type d'entrées qu'il peut y avoir, ça doit pas être trop dur d'en faire un quelconque qui ne matchera jamais en pratique dans ce cas du genre (string "linuxfr") (pas très propre, c'est sûr).

    Ceci dit, à moins que tu aies besoin de grosses performances, parsec est probablement une meilleure idée (plus de fonctions, et de meilleurs messages d'erreur il me semble).

    Edit : pas sûr que ça marche mon truc, d'ailleurs, car attoparsec backtraque.

    • [^] # Re: Pas vu de parseur qui échoue non plus…

      Posté par . Évalué à 1.

      merci, je viens de le recoder avec parsec, ce qui n'a pas été très difficile vu que les 2 se ressemblent. Effectivement il y a bien une fonction qui fait échouer.
      J'avais mis Parsec de côté au début en pensant que c'était une usine à gaz, j'ai eu tort.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.