Hi,
google camlp4 and quotation. if you don't need antiquotation
support, it's fairly easy.
On 5/14/12 9:00 PM, xy s wrote:
We have defined types:
type position = {line : int; col : int };;
type 'a ast = {data : 'a; kids : 'a ast list; posf : position; post:
position};;
And then we transform string to ast:
let construct_common_ast s=
let len = String.length s in
let rec aux i j=
if i>j then []
else (
let k = find_first s "(,)" i in
let str = trim (String.sub s i (k-i)) in
if k>j || s.[k]=')' then (
if str="" then []
else {data=str; kids=[]; posf=(calc_pos s i); post=(calc_pos s j)}::[]
)
else if s.[k]='(' then (
let l = next_matched s '(' ')' (k+1) in
let m = find_first_not s " \t\n\r" (l+1) in
if m<=j && s.[m]<>',' then
fail_ast (calc_pos s k) (calc_pos s l) "construct_common_ast: invalid
input string"
else
{data=str; kids=aux (k+1) (l-1); posf=(calc_pos s i); post=(calc_pos s
l)} :: aux (m+1) j
)
else {data=str; kids=[]; posf=(calc_pos s i); post=(calc_pos s k)} ::
aux (k+1) j
)
in
let trees=aux 0 (len-1) in
List.hd trees;;
For construct_common_ast :
# construct_common_ast;;
- : string -> string ast = <fun>
# construct_common_ast "node (function, params(), returns())";;
- : string ast =
{data = "node";
kids =
[{data = "function"; kids = []; posf = {line = 1; col = 8};
post = {line = 1; col = 16}};
{data = "params"; kids = []; posf = {line = 1; col = 17};
post = {line = 1; col = 25}};
{data = "returns"; kids = []; posf = {line = 1; col = 27};
post = {line = 1; col = 36}}];
posf = {line = 1; col = 2}; post = {line = 1; col = 37}}.
But, it is intolerable to deal with long string. how to increase coding
efficiency of this function?
Thank you anyway.
Best wishes!
--
Caml-list mailing list. Subscription management and archives:
https://sympa-roc.inria.fr/wws/info/caml-list
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs