From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by yquem.inria.fr (Postfix) with ESMTP id 4532ABCA3 for ; Fri, 12 Aug 2005 09:08:05 +0200 (CEST) Received: from pauillac.inria.fr (pauillac.inria.fr [128.93.11.35]) by concorde.inria.fr (8.13.0/8.13.0) with ESMTP id j7C784ao016648 for ; Fri, 12 Aug 2005 09:08:04 +0200 Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id JAA12626 for ; Fri, 12 Aug 2005 09:08:03 +0200 (MET DST) Received: from mail.rsise.anu.edu.au (mail.rsise.anu.edu.au [150.203.208.4]) by concorde.inria.fr (8.13.0/8.13.0) with ESMTP id j7C77xaN016640 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 12 Aug 2005 09:08:02 +0200 Received: from localhost (localhost [127.0.0.1]) by mail.rsise.anu.edu.au (Postfix) with ESMTP id 5BB581F140; Fri, 12 Aug 2005 17:07:57 +1000 (EST) Received: from mail.rsise.anu.edu.au ([150.203.208.4]) by localhost (mail [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 02432-02; Fri, 12 Aug 2005 17:07:57 +1000 (EST) Received: from pulp.rsise.anu.edu.au (pulp.rsise.anu.edu.au [150.203.208.49]) by mail.rsise.anu.edu.au (Postfix) with ESMTP id 7BDA11EE7D; Fri, 12 Aug 2005 17:07:56 +1000 (EST) Received: by pulp.rsise.anu.edu.au (Postfix, from userid 1560) id 3FDEF299E26; Fri, 12 Aug 2005 17:07:56 +1000 (EST) Date: Fri, 12 Aug 2005 17:07:56 +1000 From: Pietro Abate To: caml-list@yquem.inria.fr, ocaml ml Cc: Pietro Abate Subject: Re: [Caml-list] buidlExpressionParser Message-ID: <20050812070756.GA31015@pulp.anu.edu.au> Mail-Followup-To: Pietro Abate , caml-list@yquem.inria.fr, ocaml ml References: <20050731132119.GA368@pulp.anu.edu.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20050731132119.GA368@pulp.anu.edu.au> X-Operating-System: GNU/Linux X-Organization: Research School of Information Science and Engineering (Australian National University) User-Agent: Mutt/1.5.9i X-Virus-Scanned: by amavisd-new-20030616-p10 (Debian) at mail.rsise.anu.edu.au X-Miltered: at concorde with ID 42FC4AD4.000 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Miltered: at concorde with ID 42FC4ACF.000 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Spam: no; 0.00; anu:01 caml-list:01 ocamlfind:01 parser:01 pcaml:01 dynlink:01 dynlink:01 stdlib:01 lexing:01 pcaml:01 ocaml:01 stdlib:01 usr:01 lib:01 ocaml:01 X-Spam-Checker-Version: SpamAssassin 3.0.3 (2005-04-27) on yquem.inria.fr X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=disabled version=3.0.3 Hi all, I've fixed the problem with ocamlfind (you need to specify the "require" in the META file) and now I'm tring to dynamically load my small parser. In order to make it work I need also to load Pcaml. Dynlink doesn't do this automatically form me, so I wrote this small function below, but I'm stuck with "Fatal error: exception Dynlink.Error(0)" while tring to load the stdlib (that contains Lexing needed by Pcaml - I suppose). What am I doing wrong ? ---------- test.ml --------- let load_camlp4 () = let version = Sys.ocaml_version in try let stdlib = "/usr/lib/ocaml/"^version^"/stdlib.cma" in let gramlib = "/usr/lib/ocaml/"^version^"/camlp4/gramlib.cma" in Printf.printf "Loading: %s ..." stdlib; Dynlink.loadfile (stdlib); print_endline "done."; Printf.printf "Loading: %s ..." gramlib; Dynlink.loadfile (gramlib); print_endline "done."; with | Dynlink.Error(Dynlink.Unavailable_unit(depend)) | Dynlink.Error( Dynlink.Linking_error(_,Dynlink.Undefined_global(depend)) ) -> failwith ("Cannot find "^String.lowercase(depend)) ;; let main () = Dynlink.init(); load_camlp4 () ;; main () ---------- compile with ocamlfind ocamlc -package dynlink -linkpkg test.ml thanks, p On Sun, Jul 31, 2005 at 11:21:19PM +1000, Pietro Abate wrote: > Hi all, > > I'm trying to write a generic parser similar to the buidlExpressionParser > in the haskel library (without using external libraries). I came up with > a kind of hack that uses the grammar extension mechanism (attached). > > Is there a better way of doing this ? > > And an other question: at the moment I'm using ( Plexer.gmake () ) as a > lexer, but I don't need it (too restrictive and doesn't lex tokens like > "[]" ). > > Does anybody have an example on how to write a simple lexer that I can > use instead ? > > :) > p > > compile with: > > ocamlfind ocamlc -c -pp "camlp4o -I . pa_extend.cmo q_MLast.cmo " -I /usr/lib/ocaml/3.08.3/camlp4 datatype.ml inputParser.ml > > ocamlc /usr/lib/ocaml/3.08.3/camlp4/gramlib.cma datatype.cmo inputParser.cmo main.ml > > -- > ++ Blog: http://blog.rsise.anu.edu.au/?q=pietro > ++ > ++ "All great truths begin as blasphemies." -George Bernard Shaw > ++ Please avoid sending me Word or PowerPoint attachments. > See http://www.fsf.org/philosophy/no-word-attachments.html > > type t = > Atom of string > | And of t * t > | Or of t * t > | Not of t > > > let rec string_of_formula = function > |And(f1,f2) -> > Printf.sprintf "(%s And %s)" > (string_of_formula f1) > (string_of_formula f2) > |Or(f1,f2) -> > Printf.sprintf "(%s Or %s)" > (string_of_formula f1) > (string_of_formula f2) > |Not(f) -> Printf.sprintf "(Not %s)" (string_of_formula f) > |Atom(s) -> s > ;; > > let print s = print_endline (string_of_formula s) > (*pp camlp4o -I . pa_extend.cmo q_MLast.cmo *) > > open Genlex > > let gram = Grammar.gcreate (Plexer.gmake ());; > let expr_term = Grammar.Entry.create gram "expr_term";; > > let add_uconn op co = > EXTEND > expr_term: LEVEL "Simple" > [[ $op$; x = expr_term -> co [x] ]]; > END > ;; > > let add_biconn lev op co = > EXTEND > expr_term: LEVEL $lev$ > [[ x = expr_term; $op$; y = expr_term -> co [x;y] ]]; > END > ;; > > EXTEND > GLOBAL : expr_term; > expr_term: > [ "One" LEFTA [ ] > | "Two" RIGHTA [ ] > | "Simple" NONA > [ x = LIDENT -> Datatype.Atom x > | "("; p = expr_term; ")" -> p > ] > ]; > > END > > let buildParser table = > List.iter(function > |"Simple",op,co -> add_uconn op co > |lev,op,co -> add_biconn lev op co > ) table; > let loc = Token.dummy_loc in > let _ = Grammar.Entry.print expr_term in > fun s -> > Grammar.Entry.parse expr_term (Stream.of_string s) > ;; > > > open Datatype > > let inputparser = InputParser.buildParser [ > ("Simple","~",(fun l -> Not(List.hd l)) ); > ("One","&",(fun l -> And(List.hd l, List.hd(List.tl l))) ); > ("One","v",(fun l -> Or(List.hd l, List.hd(List.tl l))) ); > ] ;; > > let a = inputparser "a & ( c v ~ d)" in > Datatype.print a > > _______________________________________________ > Caml-list mailing list. Subscription management: > http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list > Archives: http://caml.inria.fr > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs -- ++ Blog: http://blog.rsise.anu.edu.au/?q=pietro ++ ++ "All great truths begin as blasphemies." -George Bernard Shaw ++ Please avoid sending me Word or PowerPoint attachments. See http://www.fsf.org/philosophy/no-word-attachments.html