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

Caml Discussion :

Récupération d'une erreur par le parser ou le lexer ocaml


Sujet :

Caml

  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut Récupération d'une erreur par le parser ou le lexer ocaml
    Salut,

    je suis en train de créer un parser pour un petit logiciel et je me demandais une simple question : comment puis je récupérer une erreur du parser pour envoyer un message à l'utilisateur par exemple ?

    Je n'ai pas réussi à trouver de la doc très explicite là-dessus.
    Il y a la doc d'ocaml qui parle du ocamllex et ocamlyacc, et la section 12.4.4 dit qu'il faut redéfinir la fonction parse_error et de voir la documentation de yacc pour plus d'information. Pas d'exemple, rien.
    http://caml.inria.fr/pub/docs/manual...manual026.html

    Est-ce que qqun l'a déjà fait ?

  2. #2
    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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    Est-ce que qqun l'a déjà fait ?


    jamais fait... perso, les messages d'erreur standard m'ont toujours suffit
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    jamais fait... perso, les messages d'erreur standard m'ont toujours suffit

    En fait le problème c'est qu'en cas d'erreur je veux récupérer l'erreur et l'utiliser pour diagnostiquer un problème.

    Hors là, dis moi si je me trompe, mais on a juste une indication de l'erreur et on ne peut rien en faire... est ce exact ?

  4. #4
    Membre habitué

    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 58
    Points : 166
    Points
    166
    Par défaut
    J'ai déjà fait ça... je vais essayé de voir si je le retrouve...

    Bon, j'espère que j'ai récupéré tous les morceaux. L'idée principale est de récupérer les coordonnées de l'erreur dans le fichier analysé. Il faut donc compter la position où on en est dans le lexeur : on se défini une petite fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    let newline lexbuf =
          let pos = lexbuf.Lexing.lex_curr_p in
          lexbuf.Lexing.lex_curr_p <-
            { pos with Lexing.pos_lnum = pos.Lexing.pos_lnum + 1;
                       Lexing.pos_bol = pos.Lexing.pos_cnum }
    et on l'appelle à droite des règles. Comme il s'agit ici de compter les lignes,
    il suffit de l'appeler quand on analyse un \n.

    Si on veut, on peut aussi initialiser le nom du fichier analysé avant de lancer l'analyse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      let init_pos = lexbuf.Lexing.lex_curr_p in
      lexbuf.Lexing.lex_curr_p <- { init_pos with Lexing.pos_fname = filename };
    Voilà pour le lexeur...
    J'ai ensuite défini une petite fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    let yacc_error pos msg =
       Format.fprintf fmt "ERROR : File %s, line %d : %s"
        lexpos.Lexing.pos_fname lexpos.Lexing.pos_lnum msg;
      raise Error
    Que l'utilise dans ma grammaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    truc : truc1 | truc2 | error { yacc_error "Bad truc" };
    Sinon, je vois dans mon code que j'utilisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     let pos = mk_pos (symbol_start_pos()) (symbol_end_pos()) in ...
    pour mémoriser la position de certains éléments dans la grammaire...

    Désolée, je n'ai pas le temps de tester pour voir si ce que j'ai copié/collé est correct, mais ça peut peut-être te donner des pistes.

  5. #5
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Oui, c'est en général comme ça qu'il faut faire.

    Ce que je fais, mais ça demande un peu plus de travail, c'est de conserver dans l'arbre de syntaxe les informations relatives à la position dans le fichier (voir le module Lexbuf et Parsing de la librairie standard, si mes souvenirs sont justes). Il faut se créer un type, et tout le tralala... c'est un poil long, mais une fois qu'on l'a fait, il n'y a pas de problèmes. Si mes souvenrs sont toujours exacts, c'est aussi comme ça qu'est fait ocamlc/ocamlopt.

    A la règle racine, j'ajoute la règle racine -> error { signaler_l_erreur_avec_ses_propres_fonctions } au cas où il y aurait une erreur. La doc de ocamllex/ocamlyacc est très mal faite sur ce point-là... ceci dit, si on regarde celle de yacc, c'est pas beaucoup mieux.

    Seul bison permet de complètement automatiser tout ce boulot : une vrair réussite de ce côté-là, mais ce n'est malheureusement pas un comportement standard (c'est-à-dire POSIXly correct !).
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    @Anne
    Merci pour ces détails ^_^

    @IOCWT
    Je vais essayer ce que tu dis si ça ne me suffit pas: c'est modifier ma syntaxe pour mieux gérer l'erreur.

    Encore merci beaucoup à tous les deux.

  7. #7
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    J'essayerai de poster un bout de code avec une grammaire conséquente reconnaissant les erreurs. Il y a un petit peu de boulot, mais une fois qu'on l'a fait pour une grammaire, il s'agit de code complètement réutilisable pour d'autres grammaires. Je parle ici d'une reconnaissance des erreurs, en l'occurence un arrêt du programme dès la première erreur trouvée : pour continuer à analyser, il faudrait détecter dans la grammaire les endroits où l'on estime pouvoir récupérer l'erreur, y introduire le symbole spécial error, et traiter l'erreur... Ca fait en général grossir le schmilblik d'un bon facteur.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

Discussions similaires

  1. 2.4.2 envoyer une erreur par mail
    Par Benoit_Durand dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 07/01/2009, 11h00
  2. Récupération d'une valeur par regex
    Par loman02 dans le forum Langage
    Réponses: 5
    Dernier message: 27/10/2008, 13h59
  3. [DOM] récupération d'une balise par la valeur de son attribut
    Par slyfer dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 10/11/2007, 13h50
  4. CloseHandle considéré comme une erreur par Memproof !
    Par benj63 dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/02/2006, 11h27
  5. Réponses: 4
    Dernier message: 11/10/2005, 21h08

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