[erlang-questions] clarify: how to traverse AST with erl_syntax functions ?

Roberto Saccon <>
Mon Dec 17 11:21:38 CET 2007


is there a good example anywhere ?

I think I am doing something wrong, e.g.: I want to traverse the AST
of the string module and access some of the functions.

1> {_, Beam, _} = code:get_object_code(list_to_atom("string")).
{string,<<70,79,82,49,0,0,45,40,66,69,65,77,65,116,111,109,0,0,2,15,0,0,0,69,6,
          115,116,...>>,
        "/Users/rsaccon/R11B/erlang/lib/stdlib-1.14.5/ebin/string.beam"}
2> {ok,{_,[{abstract_code,{_,Ac}}]}} = beam_lib:chunks(Beam,[abstract_code]).
...
3>T= erl_syntax:abstract(Ac).
...
4> erl_syntax:type(T).
list
5> Ts=erl_syntax:list_elements(T).


now Ii grab one element form the middle of the  list, which
encapsulates a function of the string module:


11> T_in_the_middle.
{tree,tuple,
      {attr,0,[],none},
      [{tree,atom,{attr,0,[],none},function},
       {tree,integer,{attr,0,[],none},38},
       {tree,atom,{attr,0,[],none},len},
       {tree,integer,{attr,0,[],none},1},
       {tree,list,
             {attr,0,[],none},
             {list,[{tree,tuple,
                          {attr,0,[],none},
                          [{tree,atom,{attr,0,[],none},clause},
                           {tree,integer,{attr,0,[],none},38},
                           {tree,list,{attr,0,[],...},{list,[...],...}},
                           {tree,nil,{attr,0,...},[]},
                           {tree,list,{attr,...},{...}}]}],
                   none}}]}
12> erl_syntax:type(T_in_the_middle).
tuple


And now how do I get to the function inside ? Is there a "direct way"
to get there or do I need to unpack the tuple ?

regards
-- 
Roberto Saccon
http://rsaccon.com



More information about the erlang-questions mailing list