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 :

Erreur de syntaxe avec Genlex


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 Erreur de syntaxe avec Genlex
    Bonjour,

    pour parser une chaîne, j'avais sorti l'artillerie lourde ocamllex/ocamlyacc. À présent, je pense que ce serait une meilleure idée d'utiliser Genlex qui serait plus léger.

    Voici le genre de chaînes que je souhaite parser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "/C=FR/ST=Idf/L=Paris/O=Organisation/OU=OrgaUnit/CN=Your name/emailAddress=admin@mail.com"
    Ce sont en fait des champs de certificats. Ici, ce qui m'intéresse, c'est de récupérer la valeur du champ Common Name.

    Mais le fonctionnement de Genlex m'échappe. Sur la page de genlex, il y a un code d'exemple pour une calculatrice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    let lexer = make_lexer ["+";"-";"*";"/";"let";"="; "("; ")"]  
     
    let parse_expr = parser
                      [< 'Int n >] -> n
                    | [< 'Kwd "("; n = parse_expr; 'Kwd ")" >] -> n
                    | [< n1 = parse_expr; n2 = parse_remainder n1 >] -> n2
               and parse_remainder n1 = parser
                      [< 'Kwd "+"; n2 = parse_expr >] -> n1+n2
                    | ...
    Or, que ce soit ce code ou d'autres trouvés sur code search, je ne parviens pas à compiler ce code, j'ai toujours une erreur de syntaxe ici [< 'Int n >] -> n

    Que faut-il faire pour résoudre cette erreur ?

  2. #2
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonjour,

    La notation [< >] pour les flots (streams) ne fait pas partie intégrante d'OCaml. Il faut passer par camlp4 (par exemple -pp camlp4of lors de la compilation). Une remarque en passant : vu la chaîne que tu nous montres, il ets peut-être possible de faire plus simple, en passant par les expressions régulières. Une piste :


    • découper la chaîne en morceaux grâce au séparateur /
    • découper les sous-chaînes en couples (x, y) correspondant à "x=y"
    • chercher x = CN

    Je te donne une partie de la solution à laquelle je pense :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    let get_common_name =
      let pat = Str.regexp "/" in
      fun f str ->
        let rec loop = function
          | [] -> None
          | ("CN", y) :: _ -> Some y
          | _ :: t -> loop t
        in loop (List.map f (Str.split pat str))
    Il manque la fonction f passée à List.map. Évidemment la signature finale de la fonction get_common_name est :

    val get_common_name : string -> string option

    Cordialement,
    Cacophrène

  3. #3
    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
    Héhé, j'ai eu le temps de voir que tu t'étais planté lors de l'envoi de ton message

    Ok pour Camlp4, c'est encore un peu obscure pour moi ça. Je vais y jeter un oeil.
    Sinon oui, je reconnais que tu n'as pas tort, ça serait plus facile. Je vais étudier ta piste et tant pis pour Genlex.

  4. #4
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Héhé, j'ai eu le temps de voir que tu t'étais planté lors de l'envoi de ton message


    Cordialement,
    Cacophrène

  5. #5
    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
    En m'inspirant de ce que tu m'as proposé, voici ce que j'obtiens.

    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
     
    open Str;;
     
    let myget s =                                                                                                                                                
            let pat = Str.regexp "/" in     
            let cn = Str.regexp "CN=" in
     
            let rec get = function
                    | [] -> None
                    | h :: q ->
                            if string_match cn h 0 then
                                    begin
                                            let lastpos = match_end() in
                                            Some (String.sub h lastpos ((String.length h)-lastpos))
                                    end 
                            else
                                    get q
            in  
            get (Str.split pat s)
    ;;
    Est-ce une solution suffisamment élégante ?

  6. #6
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Je ne vois pas l'utilité du begin end, tu n'as qu'une seule instruction à l'intérieur, il me semble.
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  7. #7
    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 ManusDei Voir le message
    Je ne vois pas l'utilité du begin end, tu n'as qu'une seule instruction à l'intérieur, il me semble.
    C'est pas faux.

  8. #8
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Je vois pas non plus l'utilité du let in, d'ailleurs (je regarderais mieux la prochaine fois).
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  9. #9
    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 ManusDei Voir le message
    Je vois pas non plus l'utilité du let in, d'ailleurs (je regarderais mieux la prochaine fois).
    Ca fait un calcul au lieu de 2. Et à part ça, ça fait que la ligne était moins longue et moins chiante à taper.

  10. #10
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Ah oui, j'avais pas vu le deuxième (enfin le premier).

    mea Culpa
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  11. #11
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Re,

    Voilà, c'est l'idée. Bien joué. De mon côté je pensais à quelque chose comme ça (ça revient au même) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let f =
      let pat = Str.regexp "\\([^=]*\\)=\\(.*\\)" in
      fun str -> 
        if Str.string_match pat str 0 then 
          (Str.matched_group 1 str, Str.matched_group 2 str)
        else invalid_arg "f"
    On peut trouver des solutions plus directes, plus rapides, etc. en fonction de la syntaxe exacte de la chaîne à analyser, du caractère plus ou moins critique de ce bout de code, ainsi de suite. Par ailleurs, cette manière de procéder peut-être adaptée pour récupérer d'autres champs.

    Cordialement,
    Cacophrène

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 4] Erreur de syntaxe avec Implode
    Par jmtrivia dans le forum Langage
    Réponses: 2
    Dernier message: 13/05/2009, 18h43
  2. Gestionnaire d'interruptions : erreur de syntaxe avec l'opcode call
    Par Link/DD dans le forum Programmation d'OS
    Réponses: 7
    Dernier message: 23/01/2008, 17h00
  3. [POO] Erreur de syntaxe avec une classe
    Par sirbaldur dans le forum Langage
    Réponses: 5
    Dernier message: 10/01/2007, 13h30
  4. [Conception] Erreur de syntaxe avec un champ de tableau
    Par lodan dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 21/09/2006, 11h45
  5. Erreur de syntaxe avec UPDATE
    Par tyarak dans le forum Requêtes
    Réponses: 3
    Dernier message: 01/02/2006, 01h18

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