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 :

[Ocamlyacc] Définir le type à produire


Sujet :

Caml

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [Ocamlyacc] Définir le type à produire
    Bonsoir,

    Je suis actuellement en train de me frotter au lexing/parsing en Ocaml à l'aide de Ocamllex et Ocamlyacc. Mon but est de faire l'analyse syntaxique d'une expression et de produire un arbre binaire.

    Voici le type définit dans le programme principal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    type  arbre =
      Feuille of string
    | Branche of  arbre * string * arbre;;
    Et voici un morceau de la définition de mon parseur :
    [...]

    %start main /* the entry point */
    %type <arbre> main
    %%

    main:
    expr EOL { $1 }
    ;

    expr:
    STR { Feuille $1 }
    | LPAREN expr RPAREN { $2 }
    | expr IMPLI expr { Branche $1 "IMPLI" $3 }
    | expr ET expr { Branche $1 "ET" $3 }

    [...]

    Mon but est donc de construire un arbre représentant l'expression, au fur-et-à-mesure que celle-ci est parsée. Quand je compile, j'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    File "parser.mli", line 13, characters 48-53:
    Error: Unbound type constructor arbre
    Il semble chercher un constructeur de mon type 'arbre' pour initialiser l'arbre produit par le parseur. Je ne sais pas comment définit un tel constructeur, et ne sait même pas si ce que j'essaye de faire est possible ou non.

    Si quelqu'un est en mesure de m'aider, qu'il n'hésite surtout pas

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    C'est une erreur assez classique. Le problème vient du fait que ton type arbre est défini en dehors du lexer, dans un fichier par exemple "truc.ml". Il faut que tu indiques que c'est le type arbre _du module Truc_ :

    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
    [...]
     
    %start main /* the entry point */
    %type <Truc.arbre> main
    %%
     
    main:
    expr EOL { $1 }
    ;
     
    expr:
    STR { Truc.Feuille $1 }
    | LPAREN expr RPAREN { $2 }
    | expr IMPLI expr { Truc.Branche ($1, "IMPLI", $3) }
    | expr ET expr { Truc.Branche ($1, "ET", $3) }
     
    [...]

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci pour l'astuce, mais ce ne marche toujours pas

    J'ai un fichier calc.ml qui contient la définition de mon type arbre. J'ai donc modifié mon parser.mly :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     %start main             /* the entry point */
            %type <Calc.arbre> main
            %%
    
      	main:
    		expr EOL		{ $1 }
            ;
    
            expr:
    		STR				{ Calc.Feuille $1 }
    	|	LPAREN expr RPAREN		{ $2 }
    	|	expr IMPLI expr			{ Calc.Branche $1 "IMPLI" $3 }
    J'obtiens la même erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error: Unbound type constructor Calc.arbre

    EDIT: Je n'ai pas oublié l'ajout suivant en en-tête de parser.mly:
    EDIT: J'avais par contre oublié de modifier mon makefile... problème résolu

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/06/2006, 13h43
  2. Définir un type Bit
    Par Spacy_green dans le forum C
    Réponses: 10
    Dernier message: 09/04/2006, 20h53
  3. définir un type extern
    Par petdelascar dans le forum MFC
    Réponses: 4
    Dernier message: 02/12/2005, 18h15
  4. [JTable] définir le type des colonnes
    Par zozolh2 dans le forum Composants
    Réponses: 3
    Dernier message: 17/08/2005, 08h53
  5. Comment définir le type matrice ?
    Par charly dans le forum Langage
    Réponses: 7
    Dernier message: 15/06/2002, 21h01

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