Forum Programmation.autre caml, lex et yacc

Posté par  (site web personnel) .
Étiquettes : aucune
0
10
jan.
2005

Bonjour,

simple : ocamlc m'envoie ch*** alors que ocamlyacc lui a genere sans broncher :

/* File parser.mly */

%{

type equa =
£spaces£    £/spaces£|Val of float
£spaces£    £/spaces£|Var of string
£spaces£    £/spaces£|Fun of string*(equa)*string
£spaces£    £/spaces£|UOp of string*(equa)
£spaces£    £/spaces£|Op of string*(equa)*(equa)
;;

%}

%token  REAL INT
%token  VAR
%token PLUS MINUS
%token TIMES DIV POW
%token LPAREN RPAREN
%token LOG TAN SIN COS
%token EOL
%token PI E
%token Leol
%left PLUS MINUS
%left TIMES DIV
%left POW
%right LPAREN COS SIN TAN LOG
%nonassoc UMINUS
%start debut
%type  debut

%%

debut:
£spaces£        £/spaces£expr Leol       {$1}
;

expr:
£spaces£        £/spaces£VAR                             { Var($1)               }
£spaces£        £/spaces£|PI                             { Val(3.1415926535898)  }
£spaces£        £/spaces£|E                              { Val(2.718281828459)   }
£spaces£        £/spaces£|REAL                           { Val($1)               }
£spaces£        £/spaces£|INT                            { Val($1)               }
£spaces£        £/spaces£|LPAREN expr RPAREN             { Fun("(",$2,")")       }
£spaces£        £/spaces£|COS expr RPAREN                { Fun("cos(",$2,")")    }
£spaces£        £/spaces£|SIN expr RPAREN                { Fun("sin(",$2,")")    }
£spaces£        £/spaces£|TAN expr RPAREN                { Fun("tan(",$2,")")    }
£spaces£        £/spaces£|LOG expr RPAREN                { Fun("ln(",$2,")")     }
£spaces£        £/spaces£|expr POW expr                  { Op("^",$1,$3)         }
£spaces£        £/spaces£|expr PLUS expr                 { Op("+",$1,$3)         }
£spaces£        £/spaces£|expr MINUS expr                { Op("-",$1,$3)         }
£spaces£        £/spaces£|expr TIMES expr                { Op("*",$1,$3)         }
£spaces£        £/spaces£|expr DIV expr                  { Op("/",$1,$3)         }
£spaces£        £/spaces£|MINUS expr %prec UMINUS        { UOp("-",$2)           }
;

%%

a compiler avec :

ocamlyacc parser.mly
ocamlc -c parser.mli

mon erreur :

ocamllex lexer.mll
33 states, 654 transitions, table size 2814 bytes
ocamlyacc parser.mly
ocamlc -w A -i -c parser.mli
File "parser.mli", line 22, characters 48-52:
Unbound type constructor equa
*** Error code 2

Stop.

fichier parser.mli genere par ocamlyacc :

type token =
£spaces£    £/spaces£REAL of (float)
£spaces£  £/spaces£| INT of (float)
£spaces£  £/spaces£| VAR of (string)
£spaces£  £/spaces£| PLUS
£spaces£  £/spaces£| MINUS
£spaces£  £/spaces£| TIMES
£spaces£  £/spaces£| DIV
£spaces£  £/spaces£| POW
£spaces£  £/spaces£| LPAREN
£spaces£  £/spaces£| RPAREN
£spaces£  £/spaces£| LOG
£spaces£  £/spaces£| TAN
£spaces£  £/spaces£| SIN
£spaces£  £/spaces£| COS
£spaces£  £/spaces£| EOL
£spaces£  £/spaces£| PI
£spaces£  £/spaces£| E
£spaces£  £/spaces£| Leol

val debut :
£spaces£  £/spaces£(Lexing.lexbuf  -> token) -> Lexing.lexbuf -> equa

Une idee ?

  • # Un problème avec OCAMLYACC

    Posté par  . Évalué à 2.

    A mon avis, il s'agit d'un problème de recopie de valeur. Normalement OCAMLYACC devrais recopier la partie :

    type equa =
    |Val of float
    |Var of string
    |Fun of string*(equa)*string
    |UOp of string*(equa)
    |Op of string*(equa)*(equa)
    ;;

    au debut du fichier .mli

    C'est ce que fait le YACC original en C.

    Donc il faudrait que tu mettes toi même à la main cette définition en tête du fichier .mli et l'erreur qu'il te propose ne devrait plus exister.
  • # Facile

    Posté par  (site web personnel) . Évalué à 2.

    Tout le code dans l'entête du .mly (ta définition du type equa) n'apparaîtra pas dans le .mli généré. Il faut mettre ça dans un autre fichier.

    equa.mli:
    type equa = blablabla ...

    parser.mly
    %{
    open Equa
    %}
    ...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.