[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2004-05-11 (08:33) |
From: | Virgile Prevosto <prevosto@m...> |
Subject: | Re: [Caml-list] camlp4 extensions and lexer replacements |
Le lundi 10 mai, à 14h19 -0500, John Goerzen a écrit: > > But #2 is trickier. pa_o.ml contains this: > > Grammar.Unsafe.gram_reinit gram (Plexer.gmake ()); > > So I can't define my lexer first -- pa_o.ml will just overwrite it. > Worse, I can't define my lexer second, either. Plexer relies on the > (strange, imho) notion of deciding whether something is a LIDENT or > keyword based on the list of keywords-as-tokens that were encountered > in a grammar. But the grammar reinit functions that I would have to > use to put in my lexer don't preserve that information, so my lexer > would have no way to differentiate a LIDENT from a keyword. Also, > Plexer provides no way to get a list of entries in its internal > hashtable. > Hello, I'm not sure wether this will help you or not, but according to camlp4 documentation (http://caml.inria.fr/camlp4/manual/lib/Grammar.html#TYPEg), Grammar.tokens provides a way to get the list of the keywords used so far: "val tokens : g -> string -> (string * int) list Given a grammar and a token pattern constructor, returns the list of the corresponding values currently used in all entries of this grammar. The integer is the number of times this pattern value is used. Examples: * If the associated lexer uses ("", xxx) to represent a keyword (what is represented by then simple string xxx in an EXTEND statement rule), the call Grammar.token g "" returns the keywords list." Note that keywords are not always LIDENT: ~ [502]$ ocaml Objective Caml version 3.07+2 # #load "camlp4o.cma";; Camlp4 Parsing version 3.07+2 # let x = fst (List.split (Grammar.tokens Pcaml.gram ""));; val x : string list = ["in"; "<>"; "-."; "<="; "struct"; "asr"; "if"; "{<"; "[<"; "<-"; ";;"; "lor"; "external"; "sig"; "virtual"; ":>"; ":="; "type"; "::"; "method"; "then"; "**"; "true"; "match"; "parser"; "try"; "for"; "new"; "to"; "do"; "else"; "land"; "and"; "private"; "&&"; "initializer"; "as"; "lazy"; "open"; "false"; "rec"; "~"; "}"; "|"; "end"; "{"; "or"; "constraint"; "of"; "lxor"; ">}"; "`"; "_"; "^"; "]"; "["; "with"; "inherit"; "let"; "!="; "object"; "||"; "include"; "while"; "module"; ">]"; "@"; "?"; ">"; "="; "assert"; "<"; ";"; ":"; "??"; "when"; "exception"; "lsr"; "mutable" "/"; "[|"; "."; "-"; ","; "lsl"; "done"; "+"; "begin"; "downto"; "*"; ")" "|]"; "("; "function"; "'"; "&"; "functor"; "%"; "$"; ">="; "#"; "~-."; "!"; "~-"; "fun"; "mod"; "class"; ".."; "=="; "->"; "val"] -- E tutto per oggi, a la prossima volta Virgile ------------------- 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