[erlang-questions] How to get syntax tree out of abstract forms?

Justin Calleja <>
Thu Feb 7 15:30:38 CET 2013


Hi Richard,

Thanks for the reply :)

I had already tried erl_syntax:form_list/1 on the Forms. The output is:

21> erl_syntax:form_list(Forms).
{tree,form_list,
    {attr,0,[],none},
    [{attribute,1,file,{"../src/eaop_explore/hello.erl",1}},
     {attribute,1,module,hello},
     {attribute,2,export,[{send_hello,1},{receive_hello,0}]},
     {function,4,send_hello,1,
         [{clause,4,
              [{var,4,'To'}],
              [],
              [{op,5,'!',
                   {var,5,'To'},

{tuple,5,[{atom,5,hello},{call,5,{atom,5,self},[]}]}}]}]},
     {function,7,receive_hello,0,
         [{clause,7,[],[],
              [{'receive',8,
                   [{clause,9,
                        [{tuple,9,[{atom,9,hello},{var,9,'From'}]}],
                        [],
                        [{tuple,10,[{atom,10,ok},{var,10,'From'}]}]},
                    {clause,11,
                        [{var,11,'Msg'}],
                        [],
                        [{tuple,12,

[{atom,12,unknown_msg},{var,12,'Msg'}]}]}]}]}]},
     {eof,13}]}

But, when I did:

24> module_attr:postorder(module_attr:getAtomFun(), v(21)).
{tree,form_list,
    {attr,0,[],none},
    [{tree,attribute,
         {attr,1,[],none},
         {attribute,
             {tree,atom,{attr,0,[],none},a_file},
             [{tree,string,
                  {attr,1,[],none},
                  "../src/eaop_explore/hello.erl"},
              {tree,integer,{attr,1,[],none},1}]}},
     {tree,attribute,
         {attr,1,[],none},
         {attribute,
             {tree,atom,{attr,1,[],none},module},
             [{tree,atom,{attr,0,[],none},a_hello}]}},
     {tree,attribute,
         {attr,2,[],none},
         {attribute,
             {tree,atom,{attr,2,[],none},export},
             [{tree,list,
                  {attr,2,[],none},
                  {list,
                      [{tree,arity_qualifier,
                           {attr,2,[],none},
                           {arity_qualifier,{tree,...},{...}}},
                       {tree,arity_qualifier,
                           {attr,2,[],...},
                           {arity_qualifier,{...},...}}],
                      none}}]}},
     {tree,function,
         {attr,4,[],none},
         {function,
             {tree,atom,{attr,0,[],none},a_send_hello},
             [{tree,clause,
                  {attr,4,[],none},
                  {clause,
                      [{var,4,'To'}],
                      none,
                      [{tree,infix_expr,{attr,...},{...}}]}}]}},
     {tree,function,
         {attr,7,[],none},
         {function,
             {tree,atom,{attr,0,[],none},a_receive_hello},
             [{tree,clause,
                  {attr,7,[],none},
                  {clause,[],none,[{tree,receive_expr,{...},...}]}}]}},
     {eof,13}]}

and then:

25> erl_syntax:revert_forms(v(24)).
** exception error: {error,
                        {tree,attribute,
                            {attr,1,[],none},
                            {attribute,
                                {atom,0,a_file},
                                [{string,1,"../src/eaop_explore/hello.erl"},
                                 {integer,1,1}]}}}
     in function  erl_syntax:revert_forms/1 (erl_syntax.erl, line 6648)

lol, taking a look at it now I can see what I did... changed the 'file'
attribute to 'a_file'... it works if you remove the following (or at least
change 'a_file' to 'file')

{tree,attribute,
   {attr,1,[],none},
   {attribute,
    {tree,atom,{attr,0,[],none},a_file},
    [{tree,string,{attr,1,[],none},"../src/eaop_explore/hello.erl"},
     {tree,integer,{attr,1,[],none},1}]}},

How stupid of me ^^;

Already came across the same problem with the 'export' and 'module'
attributes just 30 mins or so ago. Thanks for the help!!

Regards,
Justin


On 7 February 2013 15:03, Richard Carlsson <>wrote:

> On 02/07/2013 02:55 PM, Justin Calleja wrote:
>
>> I would like to use the postorder/2 function in the comments of
>> erl_syntax:
>>
>> postorder(F, Tree) ->
>>          F(case erl_syntax:subtrees(Tree) of
>>              [] -> Tree;
>>              List -> erl_syntax:update_tree(Tree,
>>                                  [[postorder(F, Subtree)
>>                                    || Subtree <- Group]
>>                                   || Group <- List])
>>            end).
>>
>> to traverse a syntax tree and do some kind of manipulation.
>>
>> The problems is that, although the documentation (or how I understood
>> the doc anyway) claims that abstract forms are a subset of syntax trees,
>>
>
> Yes, an abstract form is also an AST that can be used with e.g.
> erl_syntax:subtrees(). However, a *list* of abstract forms is not a tree.
> What you can do is to give your list to erl_syntax:form_list(Fs) to get a
> single AST that represents all the forms, and then pass that tree to your
> traversal function.
>
>    /Richard
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20130207/03ee98e4/attachment.html>


More information about the erlang-questions mailing list