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 :

Ulex, ocamllex, ocamlyacc et les copains


Sujet :

Caml

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 147
    Points : 102
    Points
    102
    Par défaut Ulex, ocamllex, ocamlyacc et les copains
    Salut à tous.

    J'ai posté il y a quelques temps car ocamllex ne fonctionnait pas avec les accents.
    InOcamlWeTrust m'a certifié que si et effectivement, j'ai pu le lire sur le site mais ce n'est pas très accessible.
    http://www.developpez.net/forums/sho...d.php?t=465538


    Bref pour ceux qui cherchent à faire fonctionner les accents en 8859-1 (ou -15), il faut les coder en hexa ou decimal en mettant '\xHH' pour l'hexa et '\ddd' pour les décimals. http://www.table-ascii.com/ vous renseignera sur les codes.

    Voilà mais ceci ne résout pas tellement mon problème. Le fichier à parser est généré en utf-8 et j'aimerais qu'il en reste ainsi plutôt que de le convertir.

    J'en suis au stade où j'essaie de compiler mon code avec ulex et ocamlyacc mais en dépouillant les expressions rationnelles (j'y reviendrai plus tard).

    J'ai lu que plusieurs personnes avaient eu le même souci que moi.

    Voici le message d'erreur à la compilation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    This expression has type Ulexing.lexbuf -> Parser.token
    but is here used with type Lexing.lexbuf -> Parser.token
    Selon Alain Frisch (créateur d'Ulex), c'est possible de combiner ulex et ocamlyacc:
    http://caml.inria.fr/pub/ml-archives...60bf59.en.html
    Mais mon fichier yacc a l'air de correspondre.

    Est-ce que vous pourriez me dire où se situe mon erreur ?
    Dans le fichier main.ml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      (* Ouverture du fichier source en lecture *)
      let f = open_in !ifile in
     
      (* Création d'un tampon d'analyse lexicale *)
      let buf = Ulexing.from_utf8_channel f in
      let l_files = Parser.main Lexer.nexttoken buf in
    Fichier parser.mly :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    /* Point d'entrée de la grammaire */
    %start main
     
    /* Type des valeurs retournées par l'analyseur syntaxique */
    %type <Ast.fichiers> main
     
    %%
     
      main:
    | EOF	{ [] }
    | fichiers EOF {List.rev $1}
      ;
     
    ...
    J'avoue que je suis complètement largué là et un coup de main serait le bienvenu

    Merci d'avance.

    Dest.

  2. #2
    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
    Plusieurs choses.

    1- Pourquoi veux-tu garder les accents ?
    2- Fais-nous voir le lexer, sinon, on ne pourra rien dire.
    3- A quel fichier s'applique le message d'erreur fourni ?
    4- Essaye déjà en ISO 8859-1 pour voir si ça marche, avec ocamllex.

    Le premier point se rapporte à une remarque toute bête : en général, les parsers/lexers sont utilisés pour parser des fichiers du type informatique (langages de programmation et autres), donc dans lesquels il n'y a absolument pas besoin d'utiliser des accents (chose qui n'est d'ailleurs jamais portable). Si ton application a effectivement besoin d'un parser/lexer, alors demande-toi bien si tu as réellement besoin d'accents dans ton langage à analyser.

    Autre chose, la mauvaise compatibilité de ton analyseur peut venir de la façon dont tu l'as écrit, et c'est pourquoi il serait bon de montrer le lexer.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  3. #3
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par InOCamlWeTrust Voir le message
    Le premier point se rapporte à une remarque toute bête : en général, les parsers/lexers sont utilisés pour parser des fichiers du type informatique (langages de programmation et autres), donc dans lesquels il n'y a absolument pas besoin d'utiliser des accents (chose qui n'est d'ailleurs jamais portable). Si ton application a effectivement besoin d'un parser/lexer, alors demande-toi bien si tu as réellement besoin d'accents dans ton langage à analyser.
    Ce que tu dis a été vrai pendant très longtemps, mais aujourd'hui, Unicode (et en particulier UTF-8) est de plus en plus répandu, il est de plus aisé de convertir en direction d'Unicode n'importe quel fichier (le sens inverse n'est pas toujours possible), le bon sens recommande donc de supporter Unicode dès maintenant.
    Par ailleurs, les concepteurs de langages commencent à se demander s'ils ne pourraient pas utiliser les symboles Unicodes (par exemple en fonctionnel, -> et lambda sont des candidats intéressants) de façon à rendre les programmes plus lisibles et plus proches de la notation mathématique.
    Egalement tu as certains langages qui autorisent à utiliser des noms de variables en Unicode (ce que les japonais ou les russes apprécient même si ça me file des boutons...).

    En bref, sauf s'il s'agit vraiment d'un truc vite fait dans son coin (ou au domaine très spécifique, ou qui n'a pratiquement pas d'IO...), un logiciel conçu aujourd'hui devrait au maximum s'aligner sur Unicode s'il veut perdurer.

    --
    Jedaï

  4. #4
    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
    Le problème n'est pas la qustion philosophique...

    To Unicode or not to Unicode ?

    Moi je parlais juste des accents : rien à voir avec Unicode. D'ailleurs, entre l'UTF 8, 16, 587790 et meilleurs, plus personnes n'y retrouve ses chatons dans l'histoire !
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  5. #5
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Utf-8 est quand même très populaire et de plus en plus utilisé (beaucoup plus qu'utf-16). Je comprends tout à fait le besoin qu'on peut avoir d'utiliser des caractères accentués et autres (mais désolé, dest, je n'ai jamais utilisé ULex).

    Par ailleurs, les concepteurs de langages commencent à se demander s'ils ne pourraient pas utiliser les symboles Unicodes (par exemple en fonctionnel, -> et lambda sont des candidats intéressants) de façon à rendre les programmes plus lisibles et plus proches de la notation mathématique.
    C'est d'ailleurs ce que fait F#. Les symboles unicodes sont autorisés (sans jamais être obligatoires). Par exemple, dans le livre Expert F#, l'opérateur unaire ± est défini et ça embellit considérablement le code de l'exemple. De même, les guillemets « » sont parfois utilisés.

    Pour -> et lambda, ça peut aussi être géré par l'éditeur. Il existe d'ailleurs en mode Caml pour Emacs qui remplace fun par le symbole lambda (de même pour ->, ||, &&, etc.) et 'a par alpha.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 147
    Points : 102
    Points
    102
    Par défaut
    Salut.

    Merci à tous pour vos réponses.

    InOcamlWeTrust, pour te répondre, je ne peux pas savoir à l'avance la chaîne de caractère que je vais lire.

    Mon programme fait un appel système et retourne certains fichiers ouverts. De ce fait, je retourne dans un fichier plusieurs lignes du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sftp-serv  3992       dest    5r      REG        9,2   81421725   30752771 /home/dest/private/Videos/Vidéo de vacances - 01.avi
    Dans ce cas, on peut voir que par SFTP, j'ai ouvert le fichier "Vidéo de vacances - 01.avi" et les accents sont permis donc mon programme doit les accepter.

    Avec le lexer/parser, je récupère les infos que je veux sur cette ligne qui rentre dans une liste et après j'exploite la liste.

    En parlant de lexer, le voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    let alpha = ['a'-'z' 'A'-'Z'] | '\xE9'
     
    (*
    specialchars =
      ! guillemet #$%&'()*+,-.
      :;<=>?@
      [\]^_`{|}~
    *)
     
    let specialchars = ['!'-'.' ':'-'@' '['-'`' '{'-'~' ' '] (* Tout sauf le / *)
    let chiffre = ['0'-'9']
    let entier = chiffre+
    let sep = [' ' '\t']+
    let prog = (alpha | ['-' '.'])+
    let path = ['/'](alpha | chiffre | specialchars | '/')+['/']
    let filename = (alpha | chiffre | specialchars)+"\n"
     
    rule nexttoken = parse
      | "5r"          { CINQR }
      | "9,2 "        { NEUF }
      | "REG"         { REG }
      | prog          { PROG (lexeme lexbuf)}
      | entier        { ENTIER (of_string (lexeme lexbuf)) }
      | eof           { EOF }
      | path          { nexttoken lexbuf }
      | filename      { FILENAME (String.sub (lexeme lexbuf) 0 (String.length (lexeme lexbuf) -1)) }
      | sep           { nexttoken lexbuf }
      | '\n' { newline lexbuf; nexttoken lexbuf }
      | _     { raise (Lexing_error (lexeme lexbuf)) }
    Ce lexer fonctionne comme il faut avec ocamllex et un fichier encodé en 8859-1. J'ai testé en rajoutant la prise en charge de l'accent aigüe avec '\xE9'.

    La commande système retourne un fichier en utf-8. Je pourrais le convertir en 8859-1 et l'exploiter sous cette forme mais j'aimerais bien réussir à exploiter ulex.
    Je n'ai pas mis le lexer modifié pour Ulex car ça n'avait pas tellement d'intérêt puisque j'ai tout enlevé pour que ca passe déjà à la compile.
    En gros, j'ai laissé ceci pour le moment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    let nexttoken =
    lexer "5r" -> CINQR
      | "9,2 " -> NEUF
      | "REG" -> REG
    Comme dit précédemment, mon programme est un programme développé dans mon coin. Mais j'aimerais bien faire les choses proprement et exploiter l'utf-8.

    Le message d'erreur s'applique au fichier main.ml et plus particulièrement pour la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    let l_files = Parser.main Lexer.nexttoken buf in
    Merci de vos réponses.

  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
    Une solution serait de coder le lexer (et non le parser) à la main. Ca peut suffir dans ton cas.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 147
    Points : 102
    Points
    102
    Par défaut
    Citation Envoyé par InOCamlWeTrust Voir le message
    Une solution serait de coder le lexer (et non le parser) à la main. Ca peut suffir dans ton cas.
    Oui effectivement, en restant uniquement dans Ulex, ca pourrait le faire et je pourrais créer ma liste comme ça.

    Mais c'est quand même dommage de ne pas pouvoir profiter d'utf-8 et d'un parser.

Discussions similaires

  1. Je cherche des idées de farce pour piéger les copains de mon groupe de formation
    Par chjpset dans le forum La taverne du Club : Humour et divers
    Réponses: 32
    Dernier message: 02/05/2019, 16h36
  2. [nge21] Salut les copains :)
    Par nge21 dans le forum Présentations
    Réponses: 2
    Dernier message: 06/11/2014, 16h53
  3. Réponses: 1
    Dernier message: 02/01/2011, 17h33
  4. Réponses: 3
    Dernier message: 09/09/2010, 12h06
  5. Ocamllex et les accents
    Par dest dans le forum Caml
    Réponses: 7
    Dernier message: 03/01/2008, 01h17

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