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 . É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.