[erlang-questions] scanning a hrl file, for macros.

Richard Carlsson <>
Fri Mar 6 00:08:53 CET 2009


fess wrote:
> I have an hrl file with a bunch of macro's in it that are just a bunch  
> of strings.  [...] So, I tried to erl_scan/erl_parse it.
> 
> erl_scan returns tokens which includes the defines. I could go on from  
> there and manually parse the defines. However, I thought that if I got  
> a parsed form it would be easier to pick out the macros.
> 
> so I moved on to erl_parse, however, I get errors with  
> erl_parse:parse_form and erl_parse:parse_exprs, [ {1,erl_parse,"bad  
> attribute"}, and {2,erl_parse,["syntax error before: ",["'-'"]]}   
> respectively ], the file when included compiles so I'm guessing it's  
> not an actual syntax problem.
> 
> My tokens look like this:
> 
> [{'-',1}, {atom,1,ifndef}, {'(',1},  ...
  >
> So, then I thought, ok,  maybe erl_parse needs this stuff to be pre  
> processed?  Next I tried out epp:parse_file/3 on it
> but that seemed to me to expect to apply macros,  not necessarily show  
> you that they were there.

Your basic analysis is correct: to run the parser requires that
there are no remains of preprocessor juju like -define(...), -ifdef,
or ?MACRO in the token sequence. (This is natural: since preprocessor
expansion can happen anywhere and result in arbitrary tokens being
inserted, the poor parser has  no chance of matching the unexpanded
sequence against the expected grammar. C works the same way.) But
getting rid of the macros means getting *rid* of the macros...

You should try the epp_dodger module in syntax tools, which can
read most "sane" preprocessor uses: the parse_file/2 function
ought to get you started; you may want to run erl_syntax:revert/1
on the result, depending on what you want to do with it. The
documentation for erl_syntax and erl_prettypr may be of help.

http://www.erlang.org/doc/apps/syntax_tools/index.html

     /Richard



More information about the erlang-questions mailing list