如何更改“-define”Erlang属性(宏定义)的值?

时间:2011-09-16 11:50:02

标签: macros erlang preprocessor

正常的Erlang属性可以通过解析转换来修改。这不适用于“-define”属性,因为它们由预处理器处理。如果您想在不更改文件本身的情况下更改所有宏的值,您会怎么做?

理想情况下,我想调用一些具有以下效果的编译器的修改版本:

使用输入运行时...

...
-define(constant, 45).
-define(debug(X), io:format(X)).
...
   ?debug(?constant) % Line: 7
...

..和参数......

something:external

结果将是一些抽象形式,而不是......

{call,7,
      {remote,7,{atom,7,io},{atom,7,format}},
      [{integer,7,45}]}

......会有:

{call,7,
      {remote,7,{atom,7,something},{atom,7,external}},
      [{call,7,
             {remote,7,{atom,7,something},{atom,7,external}},
             []}]}

当然,生成的代码可能无法执行,但可以对宏的使用进行一些“质量”分析。

1 个答案:

答案 0 :(得分:1)

普通编译器无法提供包含预处理器宏的语法树。 正如您所知,在将源提供给解析器之前,预处理器会扩展宏。

有一种获取伪分析树的方法(erl_parse返回的普通分析树不能代表宏):使用模块epp_dodger

  

epp_dodger - 绕过Erlang预处理器。

     

该模块对大多数Erlang源代码进行标记和解析,而不扩展预处理程序指令和宏应用程序,只要它们在语法上“表现良好”即可。因为erl_parse模块的普通解析树不能表示这些东西(通常,它们在解析器看到之前由Erlang预处理器epp(3)扩展),使用erl_syntax模块创建扩展语法树

但是这不能集成在解析变换中。

但您可以根据需要仔细阅读语法树,并在需要时将结果提供给编译器。对于代码的推理,解析树和Erlang Syntax Tools就是你所需要的。