Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] genlex ...
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Pietro Abate <Pietro.Abate@a...>
Subject: Re: [Caml-list] genlex ...
Hi all, I solved my problem...
On Mon, Jul 07, 2003 at 08:13:44PM +1000, Pietro Abate wrote:
> I'm re-writing the parser of my application and I'd like to write a kind
> of generic parser that can parse a language that I can change dynamically... 

that's a piece of code that gives me keyword flexibility as I wanted...
(conn is an object that stores my keyword with their associativity).

let flexer = make_lexer (
    conn#keywords @
    ["(" ; ")"; "atom" ]
);;

let find_keyword level = parser
    [< 'Kwd x >] ->
        let v =
            try conn#lookup x
            with Not_found -> raise Stream.Failure
        in
        if (conn#assoc v = level) then x
        else raise Stream.Failure
;;

let rec parse_main = parser
    [< e1 = parse_aux; e = parse_expr e1 >] -> e
and parse_expr e1 = parser
    [< n = find_keyword (Connective.Left); e2 = parse_main >] ->
        term_h#node n [e1;e2]
    | [< >] -> e1
and parse_aux = parser
    [< n = find_keyword (Connective.NonAssoc); e = parse_aux >] ->
        term_h#node n [e]
    | [< 'Ident s >] -> term_h#atom s
    | [< 'Kwd "("; e = parse_main; 'Kwd ")" >] -> e

I haven't test it yet, but it seems to make sense and compile correctly.

p
-- 
Civilization advances by extending the number
of important operations which we can perform 
without thinking. (Alfred North Whitehead)

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners