From: Pietro Abate <Pietro.Abate@anu.edu.au>
To: caml-list@inria.fr
Subject: Re: [Caml-list] genlex ...
Date: Tue, 8 Jul 2003 10:34:17 +1000 [thread overview]
Message-ID: <20030708003417.GA22123@anu.edu.au> (raw)
In-Reply-To: <20030707101344.GA13301@anu.edu.au>
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
prev parent reply other threads:[~2003-07-08 0:34 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-07-07 10:13 Pietro Abate
2003-07-08 0:34 ` Pietro Abate [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20030708003417.GA22123@anu.edu.au \
--to=pietro.abate@anu.edu.au \
--cc=caml-list@inria.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox