From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by yquem.inria.fr (Postfix) with ESMTP id 2DB32BC40 for ; Tue, 26 Oct 2004 17:53:45 +0200 (CEST) Received: from pauillac.inria.fr (pauillac.inria.fr [128.93.11.35]) by nez-perce.inria.fr (8.13.0/8.13.0) with ESMTP id i9QFriEO013450 for ; Tue, 26 Oct 2004 17:53:44 +0200 Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id RAA09831 for ; Tue, 26 Oct 2004 17:53:44 +0200 (MET DST) Received: from insatlse.insa-toulouse.fr (insatlse.insa-toulouse.fr [195.83.9.34]) by nez-perce.inria.fr (8.13.0/8.13.0) with ESMTP id i9QFrhsA013446 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 26 Oct 2004 17:53:44 +0200 Received: from gei122-01.insa-toulouse.fr ([10.2.5.32]) by insatlse.insa-toulouse.fr with esmtp (Exim 4.34) id 1CMTeI-0006uR-1V for caml-list@inria.fr; Tue, 26 Oct 2004 17:54:14 +0200 Message-ID: <417E7326.6060206@insa-toulouse.fr> Date: Tue, 26 Oct 2004 17:54:14 +0200 From: Daniel Marre User-Agent: Mozilla Thunderbird 0.8 (X11/20040913) X-Accept-Language: fr, en MIME-Version: 1.0 To: caml-list@inria.fr Subject: ocamllex -ocamlyacc pb Content-Type: multipart/mixed; boundary="------------080602090900050405020001" X-Miltered: at nez-perce with ID 417E7308.001 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Miltered: at nez-perce with ID 417E7307.000 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Spam: no; 0.00; ocamllex:01 ocaml:01 lexer:01 parser:01 asl:01 michel:01 mauny:01 interprete:01 fonctionnels:01 mll:01 ocaml:01 devraient:01 limiter:01 terminaux:01 coince:01 X-Attachments: name="ASLParser-ocaml.txt" name="ASLParser-ocaml.txt" X-Spam-Checker-Version: SpamAssassin 3.0.0 (2004-09-13) on yquem.inria.fr X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=disabled version=3.0.0 X-Spam-Level: This is a multi-part message in MIME format. --------------080602090900050405020001 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Bonjour, Je tente de passer de CamlLight vers Ocaml le lexer et le parser de l'exemple ASL (A Small Language) présent chapitre 12 du document déjà ancien de Michel Mauny. Je l'utilise avec succès depuis pas mal de temps , il est très intéressant pour illustrer la mise en place d'un interprète, la gestion de l'environnement et l'emploi des types fonctionnels. Le passage des fichiers mll et mly de caml vers ocaml devraient se limiter au renommage des types et symboles non terminaux mais ça coince. : j'ai un pb avec la notion de type qualifié pour le %type Si quelqu'un peut m'apporter un peu de lumière, je le remercie par avance. Bien cordialement. Daniel. résultats de compiles : ocamllex lexer.mll 12 states, 332 transitions, table size 1400 bytes ocamlyacc -v parser.mly 6 shift/reduce conflicts. ocamlc parser.mli File "parser.mli", line 19, characters 48-61: Unbound type constructor plftypes__plf -- Daniel Marre Maître de Conférences INSA - DGEI www.insa-toulouse.fr 125 AV. de Rangueil - 31077 - Toulouse (France) Daniel.Marre@insa-toulouse.fr (33)5.61.55.98.24 --------------080602090900050405020001 Content-Type: text/plain; name="ASLParser-ocaml.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="ASLParser-ocaml.txt" (* plftypes.ml Syntaxe abstraite pour plf *) (* ************************************** *) type plf = Const of int | Var of string | Cond of plf * plf * plf | Appl of plf * plf | Abs of string * plf | Let of string * plf * plf ;; exception Erreur_de_syntaxe;; { (* lexer.mll Analyse lexicale pour PLF *) (* *********************************** *) #use "parser.ml";; exception Fin_inopinee;; let mots_cles = [ "let" , LET ; "be" , BE ; "in" , IN ; "if" , IF ; "then" , THEN ; "else" , ELSE ; "fi" , FI ] ;; } rule token = parse [' ' '\t'] { token lexbuf } | ['\n'] { token lexbuf } | ['0'-'9']+ { INT (int_of_string(get_lexeme lexbuf)) } | ['a'-'z' 'A'-'Z']+ { let s = get_lexeme lexbuf in try assoc s mots_cles with Not_found -> IDENT s } | ['+' '-' '*' '/' '='] { IDENT (get_lexeme lexbuf) } | "\\" { LAMBDA } | "." { POINT } | "(" { PARENG } | ")" { PAREND } | ";" { PVIRGULE } | eof { raise Fin_inopinee } %{ (* parser.mly Grammaire du langage PLF *) (* *********************************** *) #use "plftypes";; %} %token INT %token IDENT %token LET BE IN IF THEN ELSE FI %token PARENG PAREND LAMBDA POINT PVIRGULE EOL %start debut %type debut %% debut : expr PVIRGULE { $1 }; expr0 : INT { Const $1 } | IDENT { Var $1 } | PARENG expr PAREND { $2 }; expr : expr0 { $1 } | IF expr THEN expr ELSE expr FI { Cond ($2,$4,$6) } | LAMBDA IDENT POINT expr { Abs ($2,$4) } | LET IDENT BE expr IN expr { Let ($2,$4,$6) } | expr expr0 { Appl ($1,$2) } ; --------------080602090900050405020001--