Programmation Fonctionnelle, TP8

Version & licenses
Creative Commons License

Interface du module Parse

Guyslain Naves
  1. (** type des scanners de liste d'['input] calculant une valeur de type ['result] *)
  2. type ('input, 'result) t = 'input list -> ('result * 'input list) list

  3. (** [read scanner input] applique un scanner sur une liste de donnée,
  4. * et construit une valeur de type ['result]. Plusieurs constructions
  5. * peuvent être possible : le résultat est donc une liste de construction
  6. * possibles. Chacun de ces éléments contient la valeur construite, et
  7. * la liste des entrées non-utilisées.
  8. * Si aucune construction n'est possible, retourne la liste vide.
  9. *)
  10. val read : ('input, 'result) t -> 'input list -> ('result * 'input list) list

  11. (** Le scanner qui échoue systématiquement *)
  12. val failure : ('input, 'fail) t

  13. (** [don't_read result] est un scanner qui retourne toujours [result] sans rien lire. *)
  14. val don't_read : 'result -> ('input,'result) t

  15. (** Lit le premier élément de l'entrée, et le retourne s'il vérifie le prédicat *)
  16. val read_this : ('input -> bool) -> ('input,'input) t

  17. (** [choose scanner1 scanner2] applique les deux scanners, et retourne
  18. * tous les résultats possibles
  19. *)
  20. val choose : ('input, 'res) t -> ('input, 'res) t -> ('input, 'res) t

  21. (** [apply f scanner input] lit [input] avec [scanner] et
  22. * applique [f] à chaque résultat obtenu
  23. *)
  24. val apply : ('read -> 'result) -> ('input, 'read) t -> ('input, 'result) t

  25. (** [combine scanner1 scanner2] lit l'entrée avec [scanner1], obtenant une fonction [f],
  26. * puis lit la suite de l'entrée avec [scanner2], et applique [f] au résultat.
  27. *)
  28. val combine : ('input,'tmp -> 'res) t -> ('input, 'tmp) t -> ('input, 'res) t

  29. (** [reject scanner1 scanner2] échoue si [scanner1] arrive à lire l'entrée.
  30. * Si [scanner1] échoue, alors le résultat de [scanner2] est retourné.
  31. *)
  32. val reject : ('input,'fail) t -> ('input,'success) t -> ('input,'success) t

  33. (** [filter predicat scanner] applique [scanner] à l'entrée,
  34. * et garde les résultats qui satisfont le prédicat
  35. *)
  36. val filter : ('result -> bool) -> ('input,'result) t -> ('input,'result) t

  37. val keep_highest_score : ('result -> 'input list -> int) -> ('input,'result) t -> ('input,'result) t

  38. (** [read_sequence scanner] lit l'entrée avec [scanner] itérativement,
  39. * jusqu'à ce que la lecture échoue. Retourne la liste des
  40. * valeurs construites, possiblement aucune, et l'entrée non-lue.
  41. *)
  42. val read_sequence : ('input,'result) t -> ('input, 'result list) t

  43. (** [read_strict_sequence scanner] agit comme [read_sequence]
  44. * mais lit au moins une valeur.
  45. *)
  46. val read_strict_sequence : ('input,'result) t -> ('input, 'result list) t





  47. (** le module [Infix] propose des opérateurs infixes pour certaines
  48. * des valeurs qui précèdent.
  49. *)
  50. module Infix : sig
  51. (** [combine] *)
  52. val (-->) : ('input,'tmp -> 'res) t -> ('input, 'tmp) t -> ('input, 'res) t

  53. (** [choose] *)
  54. val (<|>) : ('input, 'res) t -> ('input, 'res) t -> ('input, 'res) t

  55. (** [apply] *)
  56. val ( *>> ) : ('read -> 'result) -> ('input, 'read) t -> ('input, 'result) t

  57. (** [reject] *)
  58. val (-!-) : ('input,'fail) t -> ('input,'success) t -> ('input,'success) t
  59. end