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 :

parsing arbres -> listes


Sujet :

Caml

  1. #1
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut parsing arbres -> listes
    Bonjour,

    voila je souhaiterais effectuer un parser.
    Soit la grammaire suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    parametres = nom:valeur; parametres
    moi j'ai fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    params : Parametre of string*string
     | Parametres of string*string*params
    et dans le parser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    paramsexpr = NAME PTS VALUES{Parametre($1, $3}
       | NAME PTS VALUES CONCAT paramsexpr{Parametres($1, $3, $5)}
    ceci est donc un arbre et moi je souhaiterais faire une LISTE de paramètres.

    comment puis-je faire ?

    merci

    hiko-seijuro

  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
    Conserve dans ton arbre de syntaxe uniquement le constructeur Parametre et retourne dans ta partie action une liste là où tu appliques récursivement la règle de production... ça devrait marcher.

    D'ailleurs, c'est un deux-points ':' et non un signe égal '=' pour les règles de production. Je te conseille de bien indenter et de mettre une barre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    regle :
      | regles DE production  { action }
      | ...
    ;

  3. #3
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    Conserve dans ton arbre de syntaxe uniquement le constructeur Parametre et retourne dans ta partie action une liste là où tu appliques récursivement la règle de production... ça devrait marcher.
    c'est ca que je vois pas comment faire :s

    D'ailleurs, c'est un deux-points ':' et non un signe égal '=' pour les règles de production. Je te conseille de bien indenter et de mettre une barre.
    oui pardon je l'ai fait daans le source dsl :s

  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
    Bon, il y a des gens qui vont gueuler ici parce que je donne une solution, mais je n'en ai rien à branler... donc allons-y !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    type parametre =
      | Parametre of string * string
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    parametre :
      | NAME PTS VALUES  { Parametre ($1, $3) }
    ;
     
    parametres :
      | parametre CONCAT parametres  { $1 :: $3 }
      | parametre  { $1 :: [] }
    ;
    Une syntaxe, c'est pas difficile : son écriture devrait toujours être mécanique, systématique... et si elle ne l'est pas ou ne peut pas l'être, ça veut dire qu'il y a un problème d'homogénéité qui peut mener à de futurs bugs durant la maintenance de l'analyseur.

    C'est mon credo concernant les grammaires et j'y tiens.

    Autre chose, tu es bien conscient de la différence entre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    type ('a, 'b) t =
      | Constructor of 'a * 'b
    et...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    type ('a, 'b) t =
      | Constructor of ('a * 'b)
    ? notament dans les filtrages ?

    C'est juste une question, car je trouve que l'on utilise trop souvent les constructeurs à plusieurs arguments là où des constructeurs à un seul argument font aussi bien l'affaire... surtout pour les grammaires.

  5. #5
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    merci

    pour la syntaxe j'ai encore un peu de mal car ca fait que 5h que je fais du caml et donc avec les listes je me mélanges les pinceaux.

    Pour la différence, intuitivement je vois mais à expliquer j'en serai incapable, ..... :s

    pour le fait d'avoir donner la solution, je ne voulais pas t'emmener à ca je suis dsl. Je m'excuse pour ceux qui en seraient fâchés mais je pense que comme le pb etait précis, il etait difficile de me montrer autrement

  6. #6
    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
    Citation Envoyé par hiko-seijuro
    pour le fait d'avoir donner la solution, je ne voulais pas t'emmener à ca je suis dsl. Je m'excuse pour ceux qui en seraient fâchés mais je pense que comme le pb etait précis, il etait difficile de me montrer autrement
    C'est surtout une occasion pour montrer un peu ce que l'on peut faire avec ocamlyacc.

    Pour ce qui est de la différence, on a en deuxième lieu un constructeur avec un seul argument, donc le filtrage suivant marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    match valeur with
      | Constructor _ -> quelquechose
    mais ne fonctionne pas dans le premier cas, bien que l'on écrive les valeurs du type de la même façon dans les deux cas, à savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Constructor (a, b)
    La syntaxe révisée supprime cette ambiguïté sémantique/syntaxique, car elle currifie les constructeurs. C'est un bon exemple de comment une syntaxe ne permet pas d'écrire des choses fausses ou qui peuvent être interprètées différemment.

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

Discussions similaires

  1. Arbre de liste d'arbre [C]
    Par Kalhaa dans le forum C
    Réponses: 2
    Dernier message: 02/06/2011, 15h25
  2. B-Arbre vers liste
    Par rodbeck dans le forum C#
    Réponses: 5
    Dernier message: 20/04/2011, 22h00
  3. Initialisation d'un arbre avec liste
    Par Naruto_kun dans le forum C
    Réponses: 15
    Dernier message: 02/01/2006, 22h43
  4. Réponses: 7
    Dernier message: 27/03/2005, 10h34

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